Android Open Source - battery-monitor-for-android Battery Monitor Activity






From Project

Back to project page battery-monitor-for-android.

License

The source code is released under:

Copyright (c) 2012 Hisato SHOJI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Softw...

If you think the Android project battery-monitor-for-android 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

package jp.f.dev.android.batterymonitor;
/*from w w  w .  j  ava 2s. c  om*/
import java.io.File;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.ToggleButton;

public final class BatteryMonitorActivity extends Activity {

    private static final String TAG = "BatteryMonitorActivity";
    private static final int PERIOD_PICKER_DIALOG_ID = 1;
    private static final int ABOUT_DIALOG_ID = 2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView fileNameView = (TextView) findViewById(R.id.textView3);
        fileNameView.setText(getString(R.string.file_name_description)
                + Util.FILE_NAME);

        // get monitoring status and set it to toggle button
        final boolean monitoring = ((BatteryMonitorApplication) getApplication())
                .getMonitorStatus();
        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
        toggleButton.setChecked(monitoring);

        // is it better to move this logic to onResume?
        // Listener to monitor input from UI.
        toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                Log.d(TAG, "onCheckedChanged called, isChecked = " + isChecked);
                if (isChecked == true) {
                    Intent intent = new Intent(BatteryMonitorActivity.this,
                            BatteryMonitorService.class);
                    intent.setAction(BatteryMonitorService.ACTION_START);
                    startService(intent);
                    // it takes time to start monitoring.
                    // need to block intent calling by state change complete.
                    buttonView.setClickable(false);
                } else {
                    Intent intent = new Intent(BatteryMonitorActivity.this,
                            BatteryMonitorService.class);
                    intent.setAction(BatteryMonitorService.ACTION_STOP);
                    startService(intent);
                    // it takes time to start monitoring.
                    // need to block intent calling by state change complete.
                    buttonView.setClickable(false);
                }

            }
        });

        final Button periodPickerButton = (Button) findViewById(R.id.button1);
        periodPickerButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                showDialog(PERIOD_PICKER_DIALOG_ID, null);
            }
        });
        
        final TextView periodDescription = (TextView) findViewById(R.id.textView4);
        final long period = ((BatteryMonitorApplication) getApplication()).getMonitorPeriod();

        periodDescription.setText(getPeriodString(period));

    }

    private String getPeriodString(long period) {
        String periodString = null;

        String[] periodArray = getResources().getStringArray(R.array.spinner_period_items);

        if (period == AlarmManager.INTERVAL_FIFTEEN_MINUTES) {
            periodString = periodArray[0];
        } else if (period == AlarmManager.INTERVAL_HALF_HOUR) {
            periodString = periodArray[1];
        } else if (period == AlarmManager.INTERVAL_HOUR) {
            periodString = periodArray[2];
        }
        return periodString;
    }
    
    @Override
    protected Dialog onCreateDialog(int id, Bundle args) {
        switch (id) {
        case PERIOD_PICKER_DIALOG_ID: {
            // AlarmManager supports 15 min as minimum period for inexactRepeat.
            // For the purpose of battery save, this app offers limited choise only.
            AlertDialog.Builder builder = new AlertDialog.Builder(this);

            int selectedItemId = 0;
            final long period = ((BatteryMonitorApplication) getApplication())
                    .getMonitorPeriod();
            if (period == AlarmManager.INTERVAL_FIFTEEN_MINUTES) {
                selectedItemId = 0;
            } else if (period == AlarmManager.INTERVAL_HALF_HOUR) {
                selectedItemId = 1;
            } else if (period == AlarmManager.INTERVAL_HOUR) {
                selectedItemId = 2;
            }

            builder.setSingleChoiceItems(R.array.spinner_period_items, selectedItemId,
                    new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Log.i(TAG, "Picker selected, id = " + which);

                    long period = 0;
                    switch (which) {
                    case 0:
                        period = AlarmManager.INTERVAL_FIFTEEN_MINUTES;
                        break;
                    case 1:
                        period = AlarmManager.INTERVAL_HALF_HOUR;
                        break;
                    case 2:
                        period = AlarmManager.INTERVAL_HOUR;
                        break;
                    }
                    Intent intent = new Intent(BatteryMonitorActivity.this, BatteryMonitorService.class);
                    intent.setAction(BatteryMonitorService.ACTION_SET_PERIOD);
                    intent.putExtra(BatteryMonitorService.EXTRA_PERIOD, period);
                    startService(intent);

                    dismissDialog(PERIOD_PICKER_DIALOG_ID);
                }
            });
            return builder.create();

        }
        case ABOUT_DIALOG_ID: {
            String appNameAndVersion = null;
            try {
                PackageInfo pi = getPackageManager().getPackageInfo(
                        this.getApplicationContext().getPackageName(), 0);
                appNameAndVersion = getResources().getString(R.string.app_name)
                        + " " + pi.versionName;
            } catch (NameNotFoundException e) {
                Log.w(TAG, "NameNotFoundException", e);
            }

            return new AlertDialog.Builder(this)
                    .setTitle(
                            getResources().getString(R.string.menu_about) + ": "
                                    + appNameAndVersion)
                    .setMessage(Util.convertRawTestToString(this, R.raw.test))
                    .setPositiveButton(android.R.string.ok, null).create();
        }
        default:
            return super.onCreateDialog(id, args);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        // display current battery level
        TextView textView = (TextView) findViewById(R.id.textView1);
        textView.setText(getString(R.string.battery_level) + " : "
                + Util.getCurrentBatteryLevel(getApplicationContext()) + "%");

        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
        final TextView periodDescription = (TextView) findViewById(R.id.textView4);
        // Listener to monitor state change of the application.
        // In case state changed, reflect to the toggle button and period description.
        ((BatteryMonitorApplication) getApplication())
                .setOnStateChangeListener(new OnStateChangeListener() {
                    // This call back would be some time lag from UI input.
                    @Override
                    public void onStateChanged(boolean newState, long newPeriod) {
                        Log.d(TAG, "onStateChanged called, newState = "
                                + newState);
                        toggleButton.setClickable(true);
                        periodDescription.setText(getPeriodString(newPeriod));
                    }
                });

    }

    @Override
    protected void onPause() {
        // need to release listener in onPause.
        // There is risk that system sometimes does not call onDestory of
        // Activity.
        ((BatteryMonitorApplication) getApplication())
                .unsetOnStateChangeLister();

        super.onPause();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        final File file = new File(Util.FILE_PATH);
        if (!file.exists()) {
            menu.findItem(R.id.menu_delete).setEnabled(false);
            menu.findItem(R.id.menu_share).setEnabled(false);
        } else {
            menu.findItem(R.id.menu_delete).setEnabled(true);
            menu.findItem(R.id.menu_share).setEnabled(true);
        }
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        final File file = new File(Util.FILE_PATH);
        switch (item.getItemId()) {
        case R.id.menu_delete: {
            file.delete();
            Toast.makeText(this, R.string.toast_file_deleted, Toast.LENGTH_LONG)
                    .show();
            return true;
        }
        case R.id.menu_share: {
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
            intent.setType("text/comma-separated-values");
            startActivity(Intent.createChooser(intent, null));
            return true;
        }
        case R.id.menu_about: {
            showDialog(ABOUT_DIALOG_ID, null);
            return true;
        }
        default: {
            return super.onOptionsItemSelected(item);
        }
        }
    }
}




Java Source Code List

jp.f.dev.android.batterymonitor.BatteryMonitorActivity.java
jp.f.dev.android.batterymonitor.BatteryMonitorApplication.java
jp.f.dev.android.batterymonitor.BatteryMonitorService.java
jp.f.dev.android.batterymonitor.OnStateChangeListener.java
jp.f.dev.android.batterymonitor.Util.java