Skip to content

Commit

Permalink
1.4.4 - Bugfixes: Illegal State Exception when starting the backgroun…
Browse files Browse the repository at this point in the history
…d service, Reported Amperage Inverted
  • Loading branch information
Tyler Williamson committed Jun 12, 2022
1 parent e201b6a commit b83f4d9
Show file tree
Hide file tree
Showing 11 changed files with 143 additions and 216 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ android {
applicationId "com.ominous.batterynotification"
minSdkVersion 17
targetSdkVersion 32
versionCode 13
versionName "1.4.3"
versionCode 15
versionName "1.4.4"
}
buildTypes {
debug {
Expand Down
6 changes: 1 addition & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@
</activity>
<service
android:name=".service.BatteryService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
android:exported="false" />

<receiver
android:name=".receiver.BatteryBroadcastReceiver"
Expand All @@ -67,9 +66,6 @@
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.ominous.batterynotification.UPDATE_ACTION" />
</intent-filter>
</receiver>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
getPreferenceManager().setSharedPreferencesName(getString(R.string.preference_filename));
addPreferencesFromResource(R.xml.settings);

timeRemainingPreference = setUpSwitchPreference(getString(R.string.preference_timeremaining));
timeRemainingPreference = setUpSwitchPreference(getString(R.string.preference_time_remaining));
SwitchPreference notificationPreference = setUpSwitchPreference(getString(R.string.preference_notification));
SwitchPreference updateImmediatelyPreference = setUpSwitchPreference(getString(R.string.preference_immediate));
Preference openNotificationSettings = setUpPreference(getString(R.string.preference_notification_settings));
Expand Down Expand Up @@ -168,7 +168,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
} else {
context.stopService(batteryServiceIntent);
}
} else if (preferenceKey.equals(getString(R.string.preference_timeremaining))) {
} else if (preferenceKey.equals(getString(R.string.preference_time_remaining))) {
if (enabled) {
obtainPermission();
}
Expand Down Expand Up @@ -222,7 +222,7 @@ private void obtainPermission() {
final int result;
final int messageRes;

switch (executeSuCommand(getString(R.string.formatted_command, activity.getPackageName(), PERMISSION_BATTERY_STATS))) {
switch (executeSuCommand(getString(R.string.format_command, activity.getPackageName(), PERMISSION_BATTERY_STATS))) {
case 0:
boolean hasPermission = hasPermission(activity);
result = hasPermission ? RESULT_SUCCESS : RESULT_FAIL_PERMISSION;
Expand Down Expand Up @@ -251,8 +251,8 @@ private void obtainPermission() {

if (timeRemainingFailureDialog == null) {
timeRemainingFailureDialog = new TextDialog(activity)
.setTitle(getString(R.string.dialog_timeremaining_title))
.setContent(getString(R.string.dialog_timeremaining_content))
.setTitle(getString(R.string.dialog_time_remaining_title))
.setContent(getString(R.string.dialog_time_remaining_content))
.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.dialog_button_tryagain), this::obtainPermission)
.setButton(DialogInterface.BUTTON_NEUTRAL, getString(R.string.dialog_adb_title), () -> adbInstructionsDialog.show())
.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.dialog_button_close), null);
Expand All @@ -263,7 +263,7 @@ private void obtainPermission() {
.setTitle(getString(R.string.dialog_adb_title))
.setContent(getString(R.string.dialog_adb_content) +
"\n\n" +
getString(R.string.formatted_command, activity.getPackageName(), PERMISSION_BATTERY_STATS))
getString(R.string.format_command, activity.getPackageName(), PERMISSION_BATTERY_STATS))
.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.dialog_button_tryagain), this::obtainPermission)
.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.dialog_button_close), null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@ public void onReceive(Context context, Intent intent) {
Log.v(TAG, "Updating Battery Notification in background");
NotificationUtils.updateBatteryNotification(context);

if (context.getSharedPreferences(context.getString(R.string.preference_filename), Context.MODE_PRIVATE)
.getBoolean(context.getString(R.string.preference_immediate), false)) {
context.startService(new Intent(context, BatteryService.class));
}
break;
case Intent.ACTION_MY_PACKAGE_REPLACED:
case Intent.ACTION_BOOT_COMPLETED:
Expand Down
154 changes: 48 additions & 106 deletions app/src/main/java/com/ominous/batterynotification/util/BatteryUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,48 +31,43 @@
import com.ominous.batterynotification.R;

import java.lang.reflect.Field;
import java.util.Locale;

import androidx.annotation.NonNull;

class BatteryUtils {
@NonNull
private static String getBatteryStatus(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);

switch (status) {
case BatteryManager.BATTERY_PLUGGED_AC:
return context.getString(R.string.state_charging);
case BatteryManager.BATTERY_PLUGGED_USB:
return context.getString(R.string.state_usb_charging);
case BatteryManager.BATTERY_PLUGGED_WIRELESS:
return context.getString(R.string.state_wireless_charging);
default:
return context.getString(R.string.status_unknown);
}
static String getTemperature(Context context, Intent intent, boolean useFahrenheit) {
double temperature = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1) / 10.;

return context.getString(
useFahrenheit ? R.string.format_temperature_f : R.string.format_temperature_c,
useFahrenheit ? temperature / 5 * 9 + 32 : temperature);
}

static int getLevel(Intent intent) {
return intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
}

@NonNull
private static String getBatteryState(Context context, Intent intent) {
int state = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);

switch (state) {
case BatteryManager.BATTERY_STATUS_CHARGING:
return context.getString(R.string.state_charging);
case BatteryManager.BATTERY_STATUS_DISCHARGING:
return context.getString(R.string.status_discharging);
case BatteryManager.BATTERY_STATUS_FULL:
return context.getString(R.string.status_full);
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
return context.getString(R.string.status_not_charging);
//case BatteryManager.BATTERY_STATUS_UNKNOWN:
default:
return context.getString(R.string.status_unknown);
static String getAmperage(Context context) {
if (Build.VERSION.SDK_INT >= 21) {
BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);

int batteryCurrent = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW);

return Math.abs(batteryCurrent) > 1000000 ?
context.getString(R.string.format_amperage_a, batteryCurrent / 1000000.) :
(Math.abs(batteryCurrent) > 1000 ?
context.getString(R.string.format_amperage_ma, batteryCurrent / 1000.) :
context.getString(R.string.format_amperage_ua, batteryCurrent)
);
} else {
return "";
}
}

@NonNull
private static String getBatteryHealth(Context context, Intent intent) {
static String getHealth(Context context, Intent intent) {
int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, -1);

switch (health) {
Expand All @@ -89,67 +84,22 @@ private static String getBatteryHealth(Context context, Intent intent) {
//case BatteryManager.BATTERY_HEALTH_UNKNOWN:
//case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
default:
return context.getString(R.string.status_unknown);
}
}

@NonNull
static String getTemperature(Context context, Intent intent, boolean useFahrenheit) {
int temperature = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1) * 10;

if (useFahrenheit) {
temperature = temperature / 5 * 9 + 3200;
}

return context.getString(
R.string.formatted_temperature,
divideAndRound(temperature),
useFahrenheit ? context.getString(R.string.char_f) : context.getString(R.string.char_c));
}

static int getBatteryLevel(Intent intent) {
return intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
}

@NonNull
static String getAmperage(Context context, Intent intent) {
if (Build.VERSION.SDK_INT >= 21) {
BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);

int batteryCurrent = (intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) == BatteryManager.BATTERY_STATUS_CHARGING ? -1 : 1)
* Math.abs(batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW));

return Math.abs(batteryCurrent) > 1000000 ?
context.getString(R.string.formatted_a, divideAndRound(batteryCurrent / 10000)) :
(Math.abs(batteryCurrent) > 1000 ?
context.getString(R.string.formatted_ma, divideAndRound(batteryCurrent / 10)) :
context.getString(R.string.formatted_ua, batteryCurrent)
);
} else {
return "";
return context.getString(R.string.health_unknown);
}
}

@NonNull
static String getState(Context context, Intent intent) {
String state = getBatteryState(context, intent);

return state.equals(context.getString(R.string.state_charging)) ? getBatteryStatus(context, intent) : state;
}

@NonNull
static String getHealth(Context context, Intent intent) {
return getBatteryHealth(context, intent);
}

@NonNull
static String getVoltage(Context context, Intent intent) {
int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);

return context.getString(R.string.formatted_v,
return context.getString(R.string.format_voltage,
voltage > 1000 ?
divideAndRound(voltage / 10) :
Integer.toString(voltage));
voltage / 1000. :
voltage);
}

static boolean isCharging(Intent intent) {
return intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) == BatteryManager.BATTERY_STATUS_CHARGING;
}

@SuppressLint("PrivateApi")
Expand Down Expand Up @@ -177,10 +127,10 @@ static String getTimeRemaining(Context context, Intent intent) {

if (intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) == BatteryManager.BATTERY_STATUS_DISCHARGING
&& batteryTimeRemaining != null) {
return computeTimeString(context, batteryTimeRemaining / 1000);
return computeTimeString(context, (int) (batteryTimeRemaining / 1000));
} else if (intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) == BatteryManager.BATTERY_STATUS_CHARGING
&& chargeTimeRemaining != null) {
return computeTimeString(context, chargeTimeRemaining / 1000);
return computeTimeString(context, (int) (chargeTimeRemaining / 1000));
}
}
} catch (Exception e) {
Expand Down Expand Up @@ -237,10 +187,10 @@ static String getTimeRemaining(Context context, Intent intent) {

if (intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) == BatteryManager.BATTERY_STATUS_DISCHARGING
&& batteryTimeRemaining != null) {
return computeTimeString(context, batteryTimeRemaining / 1000000);
return computeTimeString(context, (int) (batteryTimeRemaining / 1000000));
} else if (intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) == BatteryManager.BATTERY_STATUS_CHARGING
&& chargeTimeRemaining != null) {
return computeTimeString(context, chargeTimeRemaining / 1000000);
return computeTimeString(context, (int) (chargeTimeRemaining / 1000000));
}
}
}
Expand All @@ -256,29 +206,21 @@ static String getTimeRemaining(Context context, Intent intent) {
}

@NonNull
private static String computeTimeString(Context context, long secsRemaining) {
if (secsRemaining < 1)
private static String computeTimeString(Context context, int secsRemaining) {
if (secsRemaining < 1) {
return "";
}

long min = (secsRemaining / 60) % 60,
hour = (secsRemaining / (60 * 60)) % 24,
day = (secsRemaining / (60 * 60 * 24));

StringBuilder timeString = new StringBuilder();
int min = (secsRemaining / 60) % 60;
int hour = (secsRemaining / (60 * 60)) % 24;
int day = (secsRemaining / (60 * 60 * 24));

if (day > 0) {
timeString.append(day).append(context.getString(R.string.char_d));
}

if (hour > 0) {
timeString.append(hour).append(context.getString(R.string.char_h));
return context.getString(R.string.format_time_remaining_days, day, hour, min);
} else if (hour > 0) {
return context.getString(R.string.format_time_remaining_hours, hour, min);
} else {
return context.getString(R.string.format_time_remaining_mins, min);
}

return timeString.append(min).append(context.getString(R.string.char_m_left)).toString();
}

@NonNull
private static String divideAndRound(int i) {
return String.format(Locale.getDefault(), "%.2f", i / 100f);
}
}
Loading

0 comments on commit b83f4d9

Please sign in to comment.