Android Open Source - BatteryNotification Battery Thread






From Project

Back to project page BatteryNotification.

License

The source code is released under:

GNU General Public License

If you think the Android project BatteryNotification listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/* 
 * Copyright 2014 Julin Zaragoza /*  ww  w  .  jav a 2s.  c  o  m*/
 * 
 * This file is part of BN: Battery Notification
 * 
 * BN: Battery Notification is free software; you can redistribute it and/or modify it under the terms of the GNU 
 * General Public License as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version. This program is distributed in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 
 * You should have received a copy of the GNU General Public License along with this program; if not, 
 * write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 */
package zarbel.bat.services;

import zarbel.bat.R;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.BitmapFactory;
import android.os.BatteryManager;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;

/**
 * Service thread that manages the battery level update.
 * @author jzaragoza
 *
 */

@SuppressLint("NewApi")
public class BatteryThread extends Thread {

  private Notification notification; //Main notification to update with battery level.

  private boolean interrupted = false; //Flag to check if thread has been interrupted

  private Context applicationContext; //Service context

  private NotificationCompat.Builder mBuilder; //Battery level notification builder

  private NotificationManager mNotificationManager; //Notification Manager

  private PendingIntent nextPendingIntent; //Battery Notification pending intent
  private IntentFilter ifilter; //Intent filter to check battery level

  private Intent batteryStatusIntent; //Intent to receive battery level data
  private Intent nextIntent; //Battery Notification intent

  private long sleepTime; //Sleep time
  private SharedPreferences config; //Shared preferences

  public BatteryThread(Context context){

    //Saving creation context.
    this.applicationContext = context; 

    //Getting the user-defined sleep time
    config =  PreferenceManager.getDefaultSharedPreferences(context);

    //Getting user selected sleep time by preferences
    sleepTime = Long.valueOf(config.getString(context.getResources().getString(R.string.updates_interval), "300000"));

    //Creating intentFilter to get the battery level
    ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 

    //Getting the notification manager
    mNotificationManager =(NotificationManager) this.applicationContext.getSystemService(Context.NOTIFICATION_SERVICE);

    createNotification();

  }

  private void createNotification() {
    //Creating the notification builder
    mBuilder =  new NotificationCompat.Builder(this.applicationContext);

    //Creating intent and pendingintent needed to show notification.
    nextIntent = new Intent();
    nextPendingIntent = PendingIntent.getBroadcast(applicationContext, 0, nextIntent, 0);
    mBuilder.setContentIntent(nextPendingIntent);

    //Setting notification as persistent
    mBuilder.setOngoing(true);
    mBuilder.setContentTitle(applicationContext.getResources().getString(R.string.app_name));
    mBuilder.setSmallIcon(R.drawable.ic_launcher);
    notification = mBuilder.build();

    //Updating battery percentage
    setBatteryPercentage(applicationContext, ifilter, batteryStatusIntent,mBuilder, mNotificationManager);

    //Notify changes
    mNotificationManager.notify(BatteryService.SERVICE_ID, notification);

  }

  /**
   * Thread interrupt action
   */
  @Override
  public void interrupt() {
    interrupted = true;
    super.interrupt();
  }

  /**
   * Static method to update battery level from screen on event
   * @param applicationContext
   */
  public void update(){
    setBatteryPercentage(applicationContext, ifilter, batteryStatusIntent, mBuilder, mNotificationManager);
    mNotificationManager.notify(BatteryService.SERVICE_ID, notification);

  }

  @Override
  public void run() {
    do{
      //If update on screen on is disabled, we unregister the Broadcast Receiver
      if(!config.getBoolean(applicationContext.getResources().getString(R.string.screenon), true)){
        ((BatteryService)applicationContext).unregisterScreenReceiver();
      }else{
        ((BatteryService)applicationContext).registerScreenReceiver();
      }
      //Updating battery percentage
      setBatteryPercentage(applicationContext, ifilter, batteryStatusIntent, mBuilder, mNotificationManager);

      //Notifying changes.
      mNotificationManager.notify(BatteryService.SERVICE_ID, notification);

      //Thread sleep action to save battery
      try {
        Thread.sleep(sleepTime);
      } catch (InterruptedException e) {
      }
    }while (!interrupted) ;
  }

  /**
   * Thread start action
   */
  @Override
  public synchronized void start() {
    super.start();
  }

  /**.drawable.ic_stat_name
   * Setting the battery percentage level to the notification
   * @param batteryStatusIntent
   * @param level
   * @param scale.drawable.ic_stat_name
   * @param mBuildewr
   * @param mNotificationManager
   * @return
   */
  private void setBatteryPercentage(Context applicationContext,
      IntentFilter ifilter, Intent batteryStatusIntent, NotificationCompat.Builder mBuilder,
      NotificationManager mNotificationManager) {

    int level = 0; //Level data, got from batteryStatusIntent
    int scale = 0; //Scale level, got from batteryStatusIntent
    float totalLevel = 0; //Total battery level
    
    //Getting battery level
    batteryStatusIntent = applicationContext.registerReceiver(null, ifilter);
    level = batteryStatusIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    scale = batteryStatusIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

    //Calculating battery level.
    totalLevel = level / (float)scale;
    int percent = ((int)(totalLevel*100));
    
    //Creating and Showing notification
    
    if(notification == null)
      createNotification();
    
    //Getting the corresponding image with the right battery digit.
    int idResource = applicationContext.getResources().getIdentifier(
        "ic_state_battery" + percent, "drawable",
        applicationContext.getPackageName());

    //Updating icon
    notification.icon = idResource;
    
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB)
      notification.largeIcon = BitmapFactory.decodeResource(applicationContext.getResources(),idResource);


  }
}




Java Source Code List

zarbel.bat.activities.PreferencesActivity.java
zarbel.bat.base.Constants.java
zarbel.bat.broadcastreceivers.Autostart.java
zarbel.bat.services.BatteryService.java
zarbel.bat.services.BatteryThread.java