Compare commits

...

16 Commits

Author SHA1 Message Date
37e7df98af Update all debug log text. Fix bugs related to Start/Stop button. Start working on TODO for large value bug. 2025-07-12 15:43:47 -07:00
9bb729d5c2 Remove test from version name. 2025-07-12 15:31:07 -07:00
03380cf023 Putting things into place to fix a bug when the app is destroyed while the timer was running. 2025-07-12 13:18:52 -07:00
8da02333df Fix minute section displayin the hour's worth of minutes. 2025-07-12 12:39:11 -07:00
926fe17919 Remove unused imports. 2025-07-12 12:38:20 -07:00
fb007debad Change theme to DayNight rather than hardcoded to Light. Doesn't change much right now. 2025-07-12 12:38:08 -07:00
23772cedcb Remove the temporary app name header and add a margin for the true action bar. 2025-07-12 12:30:44 -07:00
e02abc19f8 Remove the temporary action bar hide. 2025-07-12 12:30:12 -07:00
fc6ff2e5cc Begin working on UI fixes. 2025-07-11 14:53:09 -07:00
4cd8641ec2 Update version. 2025-07-11 14:52:47 -07:00
15ff7fa1cf Clean up extra lines. 2025-07-11 14:52:37 -07:00
a3fe0d4a2e Delete deleteme's. 2025-07-11 14:30:40 -07:00
f055efed02 Project is now compiling and running on a test device successfully. 2025-07-11 14:30:15 -07:00
9446f427c3 Add link to a helpful upgrading article. 2025-07-11 13:38:53 -07:00
c57cdd0a35 Update gradle and android:gradle configurations so that the project builds successfully. 2025-07-11 13:38:27 -07:00
058e854606 Ensure app can be installed by future Android versions. 2025-07-11 13:13:04 -07:00
12 changed files with 224 additions and 131 deletions

View File

@@ -1,3 +1,9 @@
# android-infinite-timer # Infinite Timer
Timer which loops over the specified interval, playing your default notification sound each time it hits 0. Timer which loops over the specified interval, playing your default notification sound each time it hits 0.
## Update Notes
### 2025-07-11
(This article)[https://sijus.medium.com/resurrecting-a-5-year-old-android-app-a-developers-journey-59d8f5689e5b]
was very helpful in getting this app updated from SDK 25 to 36.

View File

@@ -1,14 +1,14 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 28 namespace "com.hyperling.apps.infinitetimer"
buildToolsVersion '28.0.3' compileSdkVersion 35
defaultConfig { defaultConfig {
applicationId "com.hyperling.apps.infinitetimer" applicationId "com.hyperling.apps.infinitetimer"
minSdkVersion 15 minSdkVersion 15
targetSdkVersion 28 targetSdkVersion 35
versionCode 7 versionCode 8
versionName "1.06" versionName "1.1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {

View File

@@ -1,26 +0,0 @@
package com.hyperling.apps.infinitetimer.deleteme;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("infinitetimer.apps.hyperling.com.infinitetimer", appContext.getPackageName());
}
}

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.hyperling.apps.infinitetimer">
<application <application
android:allowBackup="true" android:allowBackup="true"
@@ -9,10 +8,9 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/InfiniteTimer" android:theme="@style/InfiniteTimer"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"> android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
<activity android:name=".MainActivity"> <activity android:name=".MainActivity" android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>

View File

@@ -11,7 +11,6 @@ import android.os.Message;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewManager;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
@@ -22,7 +21,7 @@ import java.util.Map;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
String TAG, String TAG = "MainActivity.",
keySharedPreferences, keyDebug, keyChronometerTime, keyLoopInterval, keySharedPreferences, keyDebug, keyChronometerTime, keyLoopInterval,
keyStartStop, keyAppOpen, keyServiceRunning, keyStartStop, keyAppOpen, keyServiceRunning,
stringChronometerDefault, stringChronometerTime, stringLoopInterval; stringChronometerDefault, stringChronometerTime, stringLoopInterval;
@@ -49,6 +48,9 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
String tag = "onCreate";
if (DEBUG) Log.d(tag, "Starting");
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
@@ -56,7 +58,6 @@ public class MainActivity extends AppCompatActivity {
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
/***** Get Strings *****/ /***** Get Strings *****/
TAG = getString(R.string.TAG);
keySharedPreferences = getString(R.string.keySharedPreferences); keySharedPreferences = getString(R.string.keySharedPreferences);
keyDebug = getString(R.string.keyDebug); keyDebug = getString(R.string.keyDebug);
keyChronometerTime = getString(R.string.keyChronometerTime); keyChronometerTime = getString(R.string.keyChronometerTime);
@@ -69,34 +70,33 @@ public class MainActivity extends AppCompatActivity {
/***** Shared Preferences *****/ /***** Shared Preferences *****/
sharedPreferences = getSharedPreferences(keySharedPreferences, MODE_PRIVATE); sharedPreferences = getSharedPreferences(keySharedPreferences, MODE_PRIVATE);
// TODO: Comment these lines! DEBUG = sharedPreferences.getBoolean(keyDebug, true);
//sharedPreferences.edit().putBoolean(keyDebug, true).apply();
//sharedPreferences.edit().putBoolean(keyStartStop, false).apply();
//sharedPreferences.edit().putString(keyLoopInterval, stringChronometerDefault).apply();
//sharedPreferences.edit().putString(keyChronometerTime, stringChronometerDefault).apply();
// TODO: Keep these!
DEBUG = sharedPreferences.getBoolean(keyDebug, false);
appOpen = sharedPreferences.getBoolean(keyAppOpen, false); appOpen = sharedPreferences.getBoolean(keyAppOpen, false);
serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false); serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false);
/*
if (!appOpen && !serviceRunning) {
sharedPreferences.edit().putBoolean(keyStartStop, false).apply();
}
*/
// Sound // Sound
ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mediaPlayer = MediaPlayer.create(this, ringtoneUri); mediaPlayer = MediaPlayer.create(this, ringtoneUri);
if (DEBUG) Log.d(TAG, "MainActivity.onCreate! Got strings."); if (DEBUG) Log.d(tag, "Got strings.");
if (DEBUG){ if (DEBUG){
// Print all preferences // Print all preferences
Map<String, ?> sharedPreferencesAll = sharedPreferences.getAll(); Map<String, ?> sharedPreferencesAll = sharedPreferences.getAll();
for (String key : sharedPreferencesAll.keySet()){ for (String key : sharedPreferencesAll.keySet()){
Log.d(TAG, "MainActivity.onCreate! key=" + key + " value=" + sharedPreferencesAll.get(key)); String value = sharedPreferencesAll.get(key).toString();
Log.d(tag, "key=" + key + " value=" + value);
// If app crashed, ensure buttons are correct.
if (key.equals(keyStartStop) && value.equals("true")) {
if (DEBUG) Log.d(tag, "Shutting off improper START value");
// Ensure START is always off if we are creating (not resuming).
sharedPreferences.edit().putBoolean(keyStartStop, false).apply();
Log.d(tag, "key=" + key + " value=" + sharedPreferencesAll.get(key));
}
} }
} }
@@ -153,18 +153,22 @@ public class MainActivity extends AppCompatActivity {
//sharedPreferences.edit().putBoolean(keyStartStop, false).apply(); //sharedPreferences.edit().putBoolean(keyStartStop, false).apply();
recoverScreen(); recoverScreen();
if (DEBUG) Log.d(TAG, "MainActivity.onCreate! Finished."); if (DEBUG) Log.d(tag, "Finished");
} }
private void doTimeChooser(){ private void doTimeChooser(){
if (DEBUG) Log.d(TAG, "MainActivity.openTimeChooser!"); String tag = TAG + "doTimeChooser";
if (DEBUG) Log.d(tag, "Starting");
//stringLoopInterval = "00:00:07"; //stringLoopInterval = "00:00:07";
//setEditTexts(stringLoopInterval); //setEditTexts(stringLoopInterval);
if (DEBUG) Log.d(tag, "Finished");
} }
private void setEditTexts(String interval){ private void setEditTexts(String interval){
if (DEBUG) Log.d(TAG, "MainActivity.setEditTexts! interval=" + interval); String tag = TAG + "setEditTexts";
if (DEBUG) Log.d(tag, "Starting, interval=" + interval);
if (!interval.equals(stringChronometerDefault)) { if (!interval.equals(stringChronometerDefault)) {
String[] time = interval.split(":"); String[] time = interval.split(":");
@@ -188,29 +192,67 @@ public class MainActivity extends AppCompatActivity {
} }
setLoopInterval(); setLoopInterval();
if (DEBUG) Log.d(tag, "Finished");
} }
private void setLoopInterval(){ private void setLoopInterval(){
if (DEBUG) Log.d(TAG, "MainActivity.setLoopInterval!"); String tag = TAG + "setLoopInterval";
if (DEBUG) Log.d(tag, "Starting");
int hours = Integer.parseInt("0"+etHours.getText().toString()); int hours = 0, minutes = 0, seconds = 0;
int minutes = Integer.parseInt("0"+etMinutes.getText().toString()); try {
int seconds = Integer.parseInt("0"+etSeconds.getText().toString()); hours = Integer.parseInt("0" + etHours.getText().toString());
} catch (NumberFormatException e) {
etHours.setText("");
longLoopInterval = (((hours*60*60) + (minutes*60) + seconds) * 1000); }
if (DEBUG) Log.d(TAG, "MainActivity.setLoopInterval! longLoopInterval=" + longLoopInterval); try {
minutes = Integer.parseInt("0" + etMinutes.getText().toString());
} catch (NumberFormatException e) {
etMinutes.setText("");
}
try {
seconds = Integer.parseInt("0" + etSeconds.getText().toString());
} catch (NumberFormatException e) {
etSeconds.setText("");
}
// TODO: Properly handle hours being set to 999, which casues a negative.
// TODO: Properly handle time being greater than current time, such as
longLoopInterval = (long) (((hours*60*60) + (minutes*60) + seconds) * 1000);
if (longLoopInterval > System.currentTimeMillis() || longLoopInterval < 0) {
if (DEBUG) Log.d(tag, "Got a number larger than current time");
if (DEBUG) Log.d(tag, "Setting to current time value");
longLoopInterval = System.currentTimeMillis();
/* Not quite doing what we want yet.
String sHours = "" + longLoopInterval/1000;
String sMinutes = "" + longLoopInterval/1000/60 % 60;
String sSeconds = "" + longLoopInterval/1000/60/60 % 60;
etHours.setText(sHours);
etMinutes.setText(sMinutes);
etSeconds.setText(sSeconds);
*/
}
if (DEBUG) Log.d(tag, "longLoopInterval=" + longLoopInterval);
setChronometer(longLoopInterval); setChronometer(longLoopInterval);
if (DEBUG) Log.d(tag, "Finished");
} }
private void setChronometer(long milliseconds){ private void setChronometer(long milliseconds){
if (DEBUG) Log.d(TAG, "MainActivity.setChronometer! milliseconds=" + milliseconds); String tag = TAG + "setChronometer";
if (DEBUG) Log.d(tag, "Starting, milliseconds=" + milliseconds);
//chronometer = (TextView) findViewById(R.id.chronometer); //chronometer = (TextView) findViewById(R.id.chronometer);
String[] time = {Long.toString(milliseconds/(1000*60*60)), String[] time = {
Long.toString((milliseconds/(1000*60)%(60*60))), Long.toString(milliseconds/(1000*60*60)),
Long.toString((milliseconds/(1000))%60)}; Long.toString((milliseconds/(1000*60))%60),
Long.toString((milliseconds/(1000))%60)
};
for (int i = 0; i < time.length; i++){ for (int i = 0; i < time.length; i++){
while (time[i].length() < 2){ while (time[i].length() < 2){
@@ -229,16 +271,18 @@ public class MainActivity extends AppCompatActivity {
doTimeChooser(); doTimeChooser();
} }
});*/ });*/
if (DEBUG) Log.d(TAG, "MainActivity.setChronometer! display=" + display); if (DEBUG) Log.d(tag, "display=" + display);
sharedPreferences.edit().putString(keyChronometerTime, display).apply(); sharedPreferences.edit().putString(keyChronometerTime, display).apply();
if (DEBUG) Log.d(TAG, "MainActivity.setChronometer! Before=" + chronometer.getText()); if (DEBUG) Log.d(tag, "Before=" + chronometer.getText());
chronometer.setText(display); chronometer.setText(display);
if (DEBUG) Log.d(TAG, "MainActivity.setChronometer! After=" + chronometer.getText()); if (DEBUG) Log.d(tag, "After=" + chronometer.getText());
if (DEBUG) Log.d(tag, "Finished");
} }
private void startStopChronometer(String buttonText){ private void startStopChronometer(String buttonText){
if (DEBUG) Log.d(TAG, "MainActivity.startStopChronometer!"); String tag = TAG + "startStopChronometer";
if (DEBUG) Log.d(tag, "Starting");
start = !start; start = !start;
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
@@ -274,10 +318,13 @@ public class MainActivity extends AppCompatActivity {
flipStartStopButton(); flipStartStopButton();
flipResetPauseButton(); flipResetPauseButton();
if (DEBUG) Log.d(tag, "Finished");
} }
private void recoverScreen(){ private void recoverScreen(){
if (DEBUG) Log.d(TAG, "MainActivity.recoverScreen!"); String tag = TAG + "recoverScreen";
if (DEBUG) Log.d(tag, "Starting");
/***** Retrieve the last settings *****/ /***** Retrieve the last settings *****/
// Chronometer // Chronometer
@@ -290,6 +337,7 @@ public class MainActivity extends AppCompatActivity {
// Start/Stop Button // Start/Stop Button
start = sharedPreferences.getBoolean(keyStartStop, false); start = sharedPreferences.getBoolean(keyStartStop, false);
if (DEBUG) Log.d(tag, "start=" + start);
flipStartStopButton(); flipStartStopButton();
flipResetPauseButton(); flipResetPauseButton();
@@ -301,10 +349,13 @@ public class MainActivity extends AppCompatActivity {
//startStopChronometer(stringChronometerTime); //startStopChronometer(stringChronometerTime);
//incrementTime.sendEmptyMessage(0); //incrementTime.sendEmptyMessage(0);
if (DEBUG) Log.d(tag, "Finished");
} }
private void flipStartStopButton(){ private void flipStartStopButton(){
if (DEBUG) Log.d(TAG, "MainActivity.flipStartStopButton!"); String tag = TAG + "flipStartStopButton";
if (DEBUG) Log.d(tag, "Starting");
start = sharedPreferences.getBoolean(keyStartStop, false); start = sharedPreferences.getBoolean(keyStartStop, false);
serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false); serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false);
@@ -319,10 +370,13 @@ public class MainActivity extends AppCompatActivity {
} }
btnStartStop.setBackgroundColor(Color.GREEN); btnStartStop.setBackgroundColor(Color.GREEN);
} }
if (DEBUG) Log.d(tag, "Finished");
} }
private void resetPauseChronometer(){ private void resetPauseChronometer(){
if (DEBUG) Log.d(TAG, "MainActivity.resetPauseChronometer!"); String tag = TAG + "resetPauseChronometer";
if (DEBUG) Log.d(tag, "Starting");
start = sharedPreferences.getBoolean(keyStartStop, false); start = sharedPreferences.getBoolean(keyStartStop, false);
serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false); serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false);
@@ -333,10 +387,13 @@ public class MainActivity extends AppCompatActivity {
else{ else{
setEditTexts(stringChronometerDefault); setEditTexts(stringChronometerDefault);
} }
if (DEBUG) Log.d(tag, "Finished");
} }
private void flipResetPauseButton(){ private void flipResetPauseButton(){
if (DEBUG) Log.d(TAG, "MainActivity.flipResetPauseButton!"); String tag = TAG + "flipResetPauseButton";
if (DEBUG) Log.d(tag, "Starting");
start = sharedPreferences.getBoolean(keyStartStop, false); start = sharedPreferences.getBoolean(keyStartStop, false);
serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false); serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false);
@@ -349,13 +406,17 @@ public class MainActivity extends AppCompatActivity {
btnResetPause.setText(getString(R.string.btnReset)); btnResetPause.setText(getString(R.string.btnReset));
btnResetPause.setBackgroundColor(Color.RED); btnResetPause.setBackgroundColor(Color.RED);
} }
if (DEBUG) Log.d(tag, "Finished");
} }
private Handler incrementTime = new Handler(){ private final Handler incrementTime = new Handler(){
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
String tag = TAG + "handleMessage";
if (DEBUG) Log.d(tag, "Starting");
super.handleMessage(msg); super.handleMessage(msg);
if (DEBUG) Log.d(TAG, "MainActivity.incrementTime.handleMessage!");
appOpen = sharedPreferences.getBoolean(keyAppOpen, true); appOpen = sharedPreferences.getBoolean(keyAppOpen, true);
if (appOpen) { if (appOpen) {
@@ -372,7 +433,7 @@ public class MainActivity extends AppCompatActivity {
// Calculate new time and text // Calculate new time and text
setTimeLeft(); setTimeLeft();
if (DEBUG) Log.d(TAG, "MainActivity.incrementTime.handleMessage! longTimeLeft=" + longTimeLeft); if (DEBUG) Log.d(tag, "longTimeLeft=" + longTimeLeft);
// Check if we need to beep // Check if we need to beep
if (longTimeLeft < 1000){ if (longTimeLeft < 1000){
@@ -381,12 +442,12 @@ public class MainActivity extends AppCompatActivity {
setStartTime(); setStartTime();
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "MainActivity.incrementTime.handleMessage!C longLoopInterval=" + longLoopInterval); Log.d(tag, "longLoopInterval=" + longLoopInterval);
Log.d(TAG, "MainActivity.incrementTime.handleMessage!C longStartTime=" + longStartTime); Log.d(tag, "longStartTime=" + longStartTime);
Log.d(TAG, "MainActivity.incrementTime.handleMessage!C longEndTime=" + longEndTime); Log.d(tag, "longEndTime=" + longEndTime);
Log.d(TAG, "MainActivity.incrementTime.handleMessage!C longTimeLeft=" + longTimeLeft); Log.d(tag, "longTimeLeft=" + longTimeLeft);
Log.d(TAG, "MainActivity.incrementTime.handleMessage!C waitInterval=" + waitInterval); Log.d(tag, "waitInterval=" + waitInterval);
Log.d(TAG, "MainActivity.incrementTime.handleMessage!C start=" + start); Log.d(tag, "start=" + start);
//chronometer.setText("Test"); //chronometer.setText("Test");
//setChronometer(200); //setChronometer(200);
/* /*
@@ -404,11 +465,11 @@ public class MainActivity extends AppCompatActivity {
synchronized (this){ synchronized (this){
try{ try{
wait(waitInterval); wait(waitInterval);
if (DEBUG) Log.d(TAG, "MainActivity.incrementTime.handleMessage! Done waiting."); if (DEBUG) Log.d(tag, "Done waiting.");
} }
catch (Exception e){ catch (Exception e){
e.printStackTrace(); e.printStackTrace();
if (DEBUG) Log.d(TAG, "MainActivity.incrementTime.handleMessage! Failed to wait."); if (DEBUG) Log.d(tag, "Failed to wait.");
} }
} }
//sharedPreferences.edit().putBoolean(keyStartStop, true).apply(); //sharedPreferences.edit().putBoolean(keyStartStop, true).apply();
@@ -419,45 +480,57 @@ public class MainActivity extends AppCompatActivity {
Thread t = new Thread(task); Thread t = new Thread(task);
t.start(); t.start();
} }
if (DEBUG) Log.d(tag, "Finished");
} }
}; };
private void setStartTime(){ private void setStartTime(){
if (DEBUG) Log.d(TAG, "MainActivity.setStartTime!"); String tag = TAG + "setStartTime";
if (DEBUG) Log.d(tag, "Starting");
if (DEBUG) Log.d(tag, "System.currentTimeMillis()=" + System.currentTimeMillis());
if (longTimeLeft == 0) { if (longTimeLeft == 0) {
if (DEBUG) Log.d(TAG, "MainActivity.setStartTime! longTimeLeft==" + longTimeLeft); if (DEBUG) Log.d(tag, "longTimeLeft=" + longTimeLeft);
// Add extra 1000 so timer starts on interval and beeps after 1 // Add extra 1000 so timer starts on interval and beeps after 1
longStartTime = System.currentTimeMillis() + 1000 - waitInterval; longStartTime = System.currentTimeMillis() + 1000 - waitInterval;
if (DEBUG) Log.d(TAG, "MainActivity.setStartTime! longStartTime=" + longStartTime); if (DEBUG) Log.d(tag, "longStartTime=" + longStartTime);
longEndTime = longStartTime + longLoopInterval; longEndTime = longStartTime + longLoopInterval;
if (DEBUG) Log.d(TAG, "MainActivity.setStartTime! longEndTime=" + longEndTime); if (DEBUG) Log.d(tag, "longEndTime=" + longEndTime);
} } else {
else{ if (DEBUG) Log.d(tag, "longTimeLeft=" + longTimeLeft);
if (DEBUG) Log.d(TAG, "MainActivity.setStartTime! longTimeLeft==" + longTimeLeft);
longStartTime = System.currentTimeMillis() - waitInterval; longStartTime = System.currentTimeMillis() - waitInterval;
if (DEBUG) Log.d(TAG, "MainActivity.setStartTime! longStartTime=" + longStartTime); if (DEBUG) Log.d(tag, "longStartTime=" + longStartTime);
longEndTime = longStartTime + longTimeLeft; longEndTime = longStartTime + longTimeLeft;
if (DEBUG) Log.d(TAG, "MainActivity.setStartTime! longEndTime=" + longEndTime); if (DEBUG) Log.d(tag, "longEndTime=" + longEndTime);
} }
if (DEBUG) Log.d(tag, "Finished");
} }
private void setTimeLeft(){ private void setTimeLeft(){
if (DEBUG) Log.d(TAG, "MainActivity.setTimeLeft!"); String tag = TAG + "setTimeLeft";
if (DEBUG) Log.d(tag, "Starting");
longTimeLeft = longEndTime - System.currentTimeMillis() + waitInterval; longTimeLeft = longEndTime - System.currentTimeMillis() + waitInterval;
if (DEBUG) Log.d(TAG, "MainActivity.setTimeLeft! longTimeLeft=" + longTimeLeft); if (DEBUG) Log.d(tag, "longTimeLeft=" + longTimeLeft);
setChronometer(longTimeLeft); setChronometer(longTimeLeft);
if (DEBUG) Log.d(tag, "Finished");
} }
private void resetTimeLeft(){ private void resetTimeLeft(){
if (DEBUG) Log.d(TAG, "MainActivity.resetTimeLeft!"); String tag = TAG + "resetTimeLeft";
if (DEBUG) Log.d(tag, "Starting");
longTimeLeft = 0; longTimeLeft = 0;
setChronometer(longLoopInterval); setChronometer(longLoopInterval);
if (DEBUG) Log.d(tag, "Finished");
} }
private void playSound(){ private void playSound(){
if (DEBUG) Log.d(TAG, "MainActivity.playSound!"); String tag = TAG + "playSound";
if (DEBUG) Log.d(tag, "Starting");
/* Original code, did not work on Nexus 7 with CM 12.1-20151117 (Android 5.1.1) /* Original code, did not work on Nexus 7 with CM 12.1-20151117 (Android 5.1.1)
Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri); Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri);
@@ -466,12 +539,40 @@ public class MainActivity extends AppCompatActivity {
//mediaPlayer.reset(); //mediaPlayer.reset();
mediaPlayer.start(); mediaPlayer.start();
if (DEBUG) Log.d(tag, "Finished");
}
private void resetAll() {
String tag = TAG + "resetAll";
if (DEBUG) Log.d(tag, "Starting");
if (DEBUG) Log.d(tag, "Resetting screen values...");
setChronometer(0);
setEditTexts("");
setLoopInterval();
if (DEBUG) Log.d(tag, "Values reset");
if (DEBUG) Log.d(tag, "Resetting SharedPreferences...");
start = false;
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(keyStartStop, start);
editor.putBoolean(keyAppOpen, start);
editor.putBoolean(keyServiceRunning, start);
int count = 0;
while (!editor.commit() && count < 50) {
Log.i(tag, "Failed! Reattempting commit... count=" + count);
count++;
};
if (DEBUG) Log.d(tag, "SharedPreferences reset");
if (DEBUG) Log.d(tag, "Finished");
} }
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); String tag = TAG + "onPause";
if (DEBUG) Log.d(TAG, "MainActivity.onPause!"); if (DEBUG) Log.d(tag, "Starting");
stringLoopInterval = stringLoopInterval =
etHours.getText().toString() + ":" + etHours.getText().toString() + ":" +
@@ -483,22 +584,51 @@ public class MainActivity extends AppCompatActivity {
editor.putString(keyLoopInterval, stringLoopInterval); editor.putString(keyLoopInterval, stringLoopInterval);
editor.putBoolean(keyAppOpen, false); editor.putBoolean(keyAppOpen, false);
editor.apply(); editor.apply();
if (DEBUG) Log.d(tag, "Done with local code, calling super.");
super.onPause();
if (DEBUG) Log.d(tag, "Finished");
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (DEBUG) Log.d(TAG, "MainActivity.onResume!");
String tag = TAG + "onResume";
if (DEBUG) Log.d(tag, "Starting");
sharedPreferences.edit().putBoolean(keyServiceRunning, false).apply(); sharedPreferences.edit().putBoolean(keyServiceRunning, false).apply();
recoverScreen(); recoverScreen();
if (DEBUG) Log.d(tag, "Finished");
}
@Override
protected void onDestroy() {
String tag = TAG + "onDestroy";
if (DEBUG) Log.d(tag, "Starting");
resetAll();
if (DEBUG) Log.d(tag, "Done with local code, calling super..");
super.onDestroy();
if (DEBUG) Log.d(tag, "Finished");
} }
private void flipInputTexts() { private void flipInputTexts() {
String tag = TAG + "flipInputTexts";
if (DEBUG) Log.d(tag, "Starting");
etHours.setEnabled(!start); etHours.setEnabled(!start);
etMinutes.setEnabled(!start); etMinutes.setEnabled(!start);
etSeconds.setEnabled(!start); etSeconds.setEnabled(!start);
if (DEBUG) Log.d(tag, "Finished");
} }
} }

View File

@@ -4,6 +4,7 @@
android:id="@+id/activity_main" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?android:actionBarSize"
android:paddingBottom="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"

View File

@@ -5,20 +5,18 @@
android:id="@+id/action_milis" android:id="@+id/action_milis"
android:orderInCategory="100" android:orderInCategory="100"
android:title="@string/action_millis" android:title="@string/action_millis"
app:showAsAction="never"
android:checkable="true" /> android:checkable="true" />
<item <item
android:id="@+id/action_enable_ads" android:id="@+id/action_enable_ads"
android:orderInCategory="150" android:orderInCategory="150"
android:title="@string/action_enable_ads" android:title="@string/action_enable_ads"
app:showAsAction="never"
android:checkable="true" /> android:checkable="true" />
<item <item
android:id="@+id/action_exit" android:id="@+id/action_exit"
android:orderInCategory="500" android:orderInCategory="500"
android:title="@string/action_exit" android:title="@string/action_exit"
app:showAsAction="never" /> />
</menu> </menu>

View File

@@ -1,7 +1,7 @@
<resources> <resources>
<!-- App details --> <!-- App details -->
<string name="appName">Infinite Timer</string> <string name="appName">Infinite Timer</string>
<string name="appVersion">Test v201610291024</string> <string name="appVersion">v20250711</string>
<string name="TAG">com.hyperling.apps.infinitetimer</string> <string name="TAG">com.hyperling.apps.infinitetimer</string>
<!-- Keys --> <!-- Keys -->

View File

@@ -1,7 +1,7 @@
<resources> <resources>
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
@@ -9,7 +9,7 @@
</style> </style>
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="InfiniteTimer" parent="Theme.AppCompat.Light.DarkActionBar"> <style name="InfiniteTimer" parent="Theme.AppCompat.DayNight.DarkActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>

View File

@@ -1,17 +0,0 @@
package com.hyperling.apps.infinitetimer.deleteme;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}

View File

@@ -2,7 +2,10 @@
buildscript { buildscript {
repositories { repositories {
jcenter() mavenCentral()
maven {
url 'https://jitpack.io'
}
google() google()
maven { maven {
url 'https://maven.google.com/' url 'https://maven.google.com/'
@@ -10,7 +13,7 @@ buildscript {
} }
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.android.tools.build:gradle:8.11.1'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
@@ -19,7 +22,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
jcenter() mavenCentral()
google() google()
} }
} }

View File

@@ -1,6 +1,6 @@
#Thu Jan 10 06:37:42 CST 2019 #Fri Jul 11 12:55:34 MST 2025
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip