Monday, March 14, 2011

Source Code To Display Battery Info & Chart



Following code displays battery-related details on Android phones. I programmed it on Android 1.6. The code still needs some refinement though. And the following code is inspired and extracted from the android sample code for drawings and shapes. 
Visitors and members of the blog are warmly welcomed to play with it and refine it further.


ShapeDrawable1.java


package com.myapps.batterystatus;

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.ArcShape;
import android.graphics.drawable.shapes.OvalShape;
import android.graphics.drawable.shapes.PathShape;
import android.graphics.drawable.shapes.RectShape;
import android.graphics.drawable.shapes.RoundRectShape;
import android.graphics.drawable.shapes.Shape;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class ShapeDrawable1 extends GraphicsActivity {

 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
       // setContentView(R.layout.main);
        setContentView(new SampleView(this));
        
       //startActivity(new Intent(ShapeDrawable1.this,ShapeDrawable1.class));
    }
    
    
    
    private static class SampleView extends View {
        private ShapeDrawable[] mDrawables;
        
        private TextView tv;
        private static Shader makeSweep() {
            return new SweepGradient(150, 50,
                new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 },
                null);
        }
        
        private static Shader makeLinear() {
            return new LinearGradient(0, 0, 100, 100,
                              new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF },
                              null, Shader.TileMode.REPEAT);
        }
        
        private static Shader makeTiling() {
            int[] pixels = new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0};
            Bitmap bm = Bitmap.createBitmap(pixels, 2, 2,
                                            Bitmap.Config.ARGB_8888);
            
            return new BitmapShader(bm, Shader.TileMode.REPEAT,
                                        Shader.TileMode.REPEAT);
        }
        
        private static class MyShapeDrawable extends ShapeDrawable {
            private Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            
            public MyShapeDrawable(Shape s) {
                super(s);
                mStrokePaint.setStyle(Paint.Style.STROKE);
            }
            
            public Paint getStrokePaint() {
                return mStrokePaint;
            }
            
            @Override protected void onDraw(Shape s, Canvas c, Paint p) {
                s.draw(c, p);
                s.draw(c, mStrokePaint);
            }
            
          private void setText(String s)
          {
         this.setText(s);  
          }
            
          private String getText()
          {  
          return this.getText(); 
          }

        }
        
        public SampleView(Context context) {
            super(context);
            setFocusable(true);

            float[] outerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
            RectF   inset = new RectF(6, 6, 6, 6);
            float[] innerR = new float[] { 12, 12, 0, 0, 12, 12, 0, 0 };
            
            Path path = new Path();
            path.moveTo(50, 0);
            path.lineTo(0, 50);
            path.lineTo(50, 100);
            path.lineTo(100, 50);
            path.close();
            
            mDrawables = new ShapeDrawable[8];
            mDrawables[0] = new ShapeDrawable(new RectShape());
            mDrawables[1] = new ShapeDrawable(new OvalShape());
            mDrawables[2] = new ShapeDrawable(new RoundRectShape(outerR, null,
                                                                 null));
            mDrawables[3] = new ShapeDrawable(new RoundRectShape(outerR, inset,
                                                                 null));
            mDrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset,
                                                                 innerR));
            mDrawables[5] = new ShapeDrawable(new PathShape(path, 100, 100));
            
            //Complete circle
            mDrawables[6] = new MyShapeDrawable(new ArcShape(0, -365));
            
            //Setting percentage
            mDrawables[7] = new MyShapeDrawable(new ArcShape(0, BatteryLevel.perc * 365/100));
            
            
            mDrawables[0].getPaint().setColor(0xFFFF0000);
            mDrawables[1].getPaint().setColor(0xFF00FF00);
            mDrawables[2].getPaint().setColor(0xFF0000FF);
            mDrawables[3].getPaint().setShader(makeSweep());
            mDrawables[4].getPaint().setShader(makeLinear());
            mDrawables[5].getPaint().setShader(makeTiling());
            mDrawables[6].getPaint().setColor(0xFF0000FF);
            mDrawables[7].getPaint().setColor(0xFF00FF00);
            
            PathEffect pe = new DiscretePathEffect(10, 4);
            PathEffect pe2 = new CornerPathEffect(4);
            mDrawables[3].getPaint().setPathEffect(
                                                new ComposePathEffect(pe2, pe));
        
            MyShapeDrawable msd = (MyShapeDrawable)mDrawables[6];
            msd.getStrokePaint().setStrokeWidth(4);
            
           
        }
        
        @Override protected void onDraw(Canvas canvas) {
            
            int x = 10;
            int y = 10;
            int width = 400;
            int height = 800;
            
           /* for (Drawable dr : mDrawables) {
                dr.setBounds(x, y, x + width, y + height);
                dr.draw(canvas);                
                y += height + 5;
            }*/
            
            
            /*
            mDrawables[7] = new MyShapeDrawable(new ArcShape(0, -300));
            mDrawables[7].getPaint().setColor(0xFF00FF00);
            mDrawables[7].setBounds(x, y, 150, 150);
            mDrawables[7].draw(canvas);
            y += height + 5;
            */
            
            //setting width and height and location of Pie Chart
       
            mDrawables[6].setBounds(x, 70, 120, 170);
            mDrawables[6].draw(canvas);
            y += height + 5;
            
            
            mDrawables[7].setBounds(x, 70, 120, 170);
            mDrawables[7].draw(canvas);
            y += height + 5;
            
            
            
            
            
         
        }
    }
}


PictureLayout.java

package com.myapps.batterystatus;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;


public class PictureLayout extends ViewGroup {
    private final Picture mPicture = new Picture();

    public PictureLayout(Context context) {
        super(context);
    }

    public PictureLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }    

    @Override
    public void addView(View child) {
        if (getChildCount() > 10) {
            throw new IllegalStateException("PictureLayout can host only one direct child");
        }

        super.addView(child);
    }

    @Override
    public void addView(View child, int index) {
        if (getChildCount() > 10) {
            throw new IllegalStateException("PictureLayout can host only one direct child");
        }

        super.addView(child, index);
    }

    @Override
    public void addView(View child, LayoutParams params) {
        if (getChildCount() > 10) {
            throw new IllegalStateException("PictureLayout can host only one direct child");
        }

        super.addView(child, params);
    }

    @Override
    public void addView(View child, int index, LayoutParams params) {
        if (getChildCount() > 10) {
            throw new IllegalStateException("PictureLayout can host only one direct child");
        }

        super.addView(child, index, params);
    }

    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int count = getChildCount();

        int maxHeight = 480;
        int maxWidth = 320;

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                measureChild(child, widthMeasureSpec, heightMeasureSpec);
            }
        }

        maxWidth += getPaddingLeft() + getPaddingRight();
        maxHeight += getPaddingTop() + getPaddingBottom();

        Drawable drawable = getBackground();
        if (drawable != null) {
            maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
            maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
        }

        setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
                resolveSize(maxHeight, heightMeasureSpec));
    }
    
    private void drawPict(Canvas canvas, int x, int y, int w, int h,
                          float sx, float sy) {
        canvas.save();
        canvas.translate(x, y);
        canvas.clipRect(0, 0, w, h);
        canvas.scale(1.5f, 1.5f);
        canvas.scale(sx, sy, w, h);
        canvas.drawPicture(mPicture);
        
        canvas.restore();
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(mPicture.beginRecording(getWidth(), getHeight()));
        mPicture.endRecording();
        
        int x = getWidth()/2;
        int y = getHeight()/2;
        
        if (false) {
            canvas.drawPicture(mPicture);
        } else {
            drawPict(canvas, 0, 0, x*10, y*10,  1,  1);
            //drawPict(canvas, x, 0, x, y, -1,  1);
            //drawPict(canvas, 0, y, x, y,  1, -1);
            //drawPict(canvas, x, y, x, y, -1, -1);
        }
    }

    @Override
    public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
        location[0] = getLeft();
        location[1] = getTop();
        dirty.set(100, 100, getWidth(), getHeight());
        return getParent();
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        final int count = super.getChildCount();

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                final int childLeft = getPaddingLeft();
                final int childTop = getPaddingTop();
                child.layout(childLeft, childTop,
                        childLeft + child.getMeasuredWidth(),
                        childTop + child.getMeasuredHeight());

            }
        }
    }
}


GraphicsActivity.java

package com.myapps.batterystatus;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

//@SuppressWarnings("deprecation")
class GraphicsActivity extends Activity {
TextView tv;
String strChargingStatus="";
TextView tvChargingStatus;
TextView tvVoltage;
TextView tvTemp;
TextView tvHealth;
TextView tvTech;
LinearLayout layout;
ImageView iv;
     
        
public final int delay = 1;    
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        
        layout = new LinearLayout(this);
        
        layout.setBackgroundResource(R.drawable.inner);
        
        
        BatteryLevel BatLvl = new BatteryLevel();
       
        //iv = new ImageView(this);
       
        //iv.setBackgroundResource(R.drawable.inner);
        //iv.setImageResource(R.drawable.inner);
        
        tv = new TextView(this);
        tv.setText("percentage");
        
        //Toast.makeText(this, "testing", Toast.LENGTH_SHORT).show();
       
        tvChargingStatus = new TextView(this);
        tvChargingStatus.setTextSize(10);
        tvChargingStatus.setText(BatteryLevel.chargingStatus);
        tvChargingStatus.setTextColor(Color.BLACK);
        tvChargingStatus.setPadding(50, 175, 0, 0);
        
        
        tvVoltage = new TextView(this);
        tvVoltage.setText("Voltage: " + BatteryLevel.batteryVol);
        tvVoltage.setTextSize(10);
        tvVoltage.setTextColor(Color.BLACK);
        tvVoltage.setPadding(10, 220,0,0);
        
        tvTemp = new TextView(this);
        tvTemp.setText("Temperature: " + BatteryLevel.batteryTemp);
        tvTemp.setTextSize(10);
        tvTemp.setTextColor(Color.BLACK);
        tvTemp.setPadding(10, 240,0,0);
        
        tvHealth = new TextView(this);
        tvHealth.setText("Health: " + BatteryLevel.batteryHealth);
        tvHealth.setTextSize(10);
        tvHealth.setTextColor(Color.BLACK);
        tvHealth.setPadding(127, 220,0,0);        
        //setContentView(tv);
        
        tvTech = new TextView(this);
        tvTech.setText("Technology: " + BatteryLevel.batteryTech);
        tvTech.setTextSize(10);
        tvTech.setTextColor(Color.BLACK);
        tvTech.setPadding(127, 240,0,0); 
    }

    @Override
    public void setContentView(View view) {
    
     tv = new TextView(this);
     tv.setTextSize(40);
     tv.setTextColor(Color.BLACK);
     //tv.setPadding(0, 0, 10, 10);
     tv.setText("\n\n            " + BatteryLevel.batteryLevel);
    
    
        if (true) { // set to true to test Picture
            ViewGroup vg = new PictureLayout(this);
            
            //vg.addView(iv);
            vg.addView(layout);
            vg.addView(tv);
            //vg.addView(tvChargingStatus);
            vg.addView(tvVoltage);
            vg.addView(tvTemp);
            vg.addView(tvHealth);
            vg.addView(tvTech);
            vg.addView(view);
            
            
            //vg.addView(R.layout.main);
            view = vg;
        }
      
      
        super.setContentView(view);
        
        
        //this.startActivity(new Intent(GraphicsActivity.this,GraphicsActivity.class));
    }

}

BatteryLevel.java

package com.myapps.batterystatus;




import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.widget.Toast;

public class BatteryLevel extends Activity { 
    private TextView tvBatteryLevel; 
    private TextView tvBatteryTemp;
    private TextView tvBatteryVol;
    private TextView tvBatteryHealth;
    private TextView tvBatteryTech;
    private TextView tvChargingStatus;
    
    public static String chargingStatus;
    public static String batteryTemp;
    public static String batteryVol;
    public static String batteryHealth;
    public static String batteryLevel; 
    public static int perc;
    public static String batteryTech;
    
    public final int delay = 2500;
     
    private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() { 
         @Override 
         public void onReceive(Context context, Intent intent) { 
              String action = intent.getAction();
              
              /*Calculating Battery Power*/
              if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 

                   int level = intent.getIntExtra("level", 0); 
                   int scale = intent.getIntExtra("scale", 100); 

                   tvBatteryLevel.setText("Battery level: " 
                             + String.valueOf(level * 100 / scale) + "%");
                   perc = level * 100 / scale;
                   batteryLevel = String.valueOf(level * 100 / scale) + "%";
              } 
              
              /*Calculating Battery Temperature*/
              if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 

                  int tempLevel = intent.getIntExtra("temperature", 0); 
                  int scale = intent.getIntExtra("scale", 100); 

                  tvBatteryTemp.setText("Battery temperature: " 
                            + String.valueOf(tempLevel * 10 / scale) + " C"); 
                  
                  batteryTemp = String.valueOf(tempLevel * 10 / scale) + " C";
             } 
              
              /*Calculating Battery Voltage*/
             if (Intent.ACTION_BATTERY_CHANGED.equals(action)){
              
             int volLevel = intent.getIntExtra("voltage", 0);
             int scale = intent.getIntExtra("scale", 100);
              
             tvBatteryVol.setText("Battery voltage: "
              + String.valueOf(volLevel * 100/scale) + " mV");
              
             batteryVol = String.valueOf(volLevel * 100/scale) + " mV";
             } 
             
             
             /*Calculating Battery Health*/
             if (Intent.ACTION_BATTERY_CHANGED.equals(action)){
              
             int healthLvl;
             String healthStatus="";
              
             int healthLevel = intent.getIntExtra("health", 0);
             int scale = intent.getIntExtra("scale", 100);
              
             healthLvl = healthLevel * 100/scale;
              
             switch (healthLvl)
             {
             case 4: 
             healthStatus = "Bad";
             break;
             case 2:
             healthStatus = "Good";
             break;
             case 1:
             healthStatus = "Dead";
             break;  
              
             }
             tvBatteryHealth.setText("Battery health: "
              + healthStatus);
              
             batteryHealth =  healthStatus;
             } 
             
             /*Retrieving Battery Technology*/
             String batteryTechnology = intent.getStringExtra("technology");
             tvBatteryTech.setText("Technology:" + batteryTechnology);
             batteryTech = batteryTechnology;
             
             
             /*Retrieving Battery Charging Status*/
             int deviceChargingStatus = intent.getIntExtra("plugged" , 0);
             
             if (deviceChargingStatus == 0)
             {
             tvChargingStatus.setText("Charging Status: Not Charging");
              
             }
             else
             {
             tvChargingStatus.setText("Charging Status: Charging");
             }
             
             chargingStatus = (String) tvChargingStatus.getText();
             //Toast.makeText(BatteryLevel.this, tvChargingStatus.getText(), Toast.LENGTH_SHORT).show();
         } 
         
    }; 
     
    @Override 
    public void onResume() { 
         super.onResume(); 

         registerReceiver(mBatteryInfoReceiver, new IntentFilter( 
                   Intent.ACTION_BATTERY_CHANGED)); 
    } 

    @Override 
    public void onPause() { 
         super.onPause(); 

         unregisterReceiver(mBatteryInfoReceiver);          
    } 

   @Override 
   public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
       
       tvBatteryLevel = (TextView) findViewById(R.id.tvBatteryLevel); 
       tvBatteryTemp = (TextView) findViewById(R.id.tvBatteryTemp); 
       tvBatteryVol = (TextView) findViewById(R.id.tvBatteryVol);
       tvBatteryHealth = (TextView) findViewById(R.id.tvBatteryHealth);
       tvBatteryTech = (TextView) findViewById (R.id.tvBatteryTech);
       tvChargingStatus = (TextView)findViewById(R.id.tvChargingStatus);
       
       
       
       new Handler().postDelayed(new Runnable(){
           public void run(){ 
            
           startActivity(new Intent(BatteryLevel.this, ShapeDrawable1.class));
           
           //Splash.this.finish();   
           
           }
       }, delay);
   } 
}

No comments:

Post a Comment