blob: 5f18d9ea6f883c6493235280bb3816643c7b8882 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.deskclock.timer;
import android.content.SharedPreferences;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import com.android.deskclock.Utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class TimerObj implements Parcelable {
private static final String TAG = "TimerObj";
// Max timer length is 9 hours + 99 minutes + 9 seconds
private static final long MAX_TIMER_LENGTH = (9 * 3600 + 99 * 60 + 60) * 1000;
public int mTimerId; // Unique id
public long mStartTime; // With mTimeLeft , used to calculate the correct time
public long mTimeLeft; // in the timer.
public long mOriginalLength; // length set at start of timer and by +1 min after times up
public long mSetupLength; // length set at start of timer
public View mView;
public int mState;
public String mLabel;
public static final int STATE_RUNNING = 1;
public static final int STATE_STOPPED = 2;
public static final int STATE_TIMESUP = 3;
public static final int STATE_DONE = 4;
public static final int STATE_RESTART = 5;
private static final String PREF_TIMER_ID = "timer_id_";
private static final String PREF_START_TIME = "timer_start_time_";
private static final String PREF_TIME_LEFT = "timer_time_left_";
private static final String PREF_ORIGINAL_TIME = "timer_original_timet_";
private static final String PREF_SETUP_TIME = "timer_setup_timet_";
private static final String PREF_STATE = "timer_state_";
private static final String PREF_LABEL = "timer_label_";
private static final String PREF_TIMERS_LIST = "timers_list";
public static final Parcelable.Creator<TimerObj> CREATOR = new Parcelable.Creator<TimerObj>() {
@Override
public TimerObj createFromParcel(Parcel p) {
return new TimerObj(p);
}
@Override
public TimerObj[] newArray(int size) {
return new TimerObj[size];
}
};
public void writeToSharedPref(SharedPreferences prefs) {
SharedPreferences.Editor editor = prefs.edit();
String key = PREF_TIMER_ID + Integer.toString(mTimerId);
String id = Integer.toString(mTimerId);
editor.putInt (key, mTimerId);
key = PREF_START_TIME + id;
editor.putLong (key, mStartTime);
key = PREF_TIME_LEFT + id;
editor.putLong (key, mTimeLeft);
key = PREF_ORIGINAL_TIME + id;
editor.putLong (key, mOriginalLength);
key = PREF_SETUP_TIME + id;
editor.putLong (key, mSetupLength);
key = PREF_STATE + id;
editor.putInt (key, mState);
Set <String> timersList = prefs.getStringSet(PREF_TIMERS_LIST, new HashSet<String>());
timersList.add(id);
editor.putStringSet(PREF_TIMERS_LIST, timersList);
key = PREF_LABEL + id;
editor.putString(key, mLabel);
editor.apply();
}
public void readFromSharedPref(SharedPreferences prefs) {
String id = Integer.toString(mTimerId);
String key = PREF_START_TIME + id;
mStartTime = prefs.getLong(key, 0);
key = PREF_TIME_LEFT + id;
mTimeLeft = prefs.getLong(key, 0);
key = PREF_ORIGINAL_TIME + id;
mOriginalLength = prefs.getLong(key, 0);
key = PREF_SETUP_TIME + id;
mSetupLength = prefs.getLong(key, 0);
key = PREF_STATE + id;
mState = prefs.getInt(key, 0);
key = PREF_LABEL + id;
mLabel = prefs.getString(key, "");
}
public void deleteFromSharedPref(SharedPreferences prefs) {
SharedPreferences.Editor editor = prefs.edit();
String key = PREF_TIMER_ID + Integer.toString(mTimerId);
String id = Integer.toString(mTimerId);
editor.remove (key);
key = PREF_START_TIME + id;
editor.remove (key);
key = PREF_TIME_LEFT + id;
editor.remove (key);
key = PREF_ORIGINAL_TIME + id;
editor.remove (key);
key = PREF_STATE + id;
editor.remove (key);
Set <String> timersList = prefs.getStringSet(PREF_TIMERS_LIST, new HashSet<String>());
timersList.remove(id);
editor.putStringSet(PREF_TIMERS_LIST, timersList);
key = PREF_LABEL + id;
editor.remove(key);
editor.commit();
//dumpTimersFromSharedPrefs(prefs);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mTimerId);
dest.writeLong(mStartTime);
dest.writeLong(mTimeLeft);
dest.writeLong(mOriginalLength);
dest.writeLong(mSetupLength);
dest.writeInt(mState);
dest.writeString(mLabel);
}
public TimerObj(Parcel p) {
mTimerId = p.readInt();
mStartTime = p.readLong();
mTimeLeft = p.readLong();
mOriginalLength = p.readLong();
mSetupLength = p.readLong();
mState = p.readInt();
mLabel = p.readString();
}
public TimerObj() {
init(0);
}
public TimerObj(long timerLength) {
init(timerLength);
}
private void init (long length) {
mTimerId = (int) Utils.getTimeNow();
mStartTime = Utils.getTimeNow();
mTimeLeft = mOriginalLength = mSetupLength = length;
mLabel = "";
}
public long updateTimeLeft(boolean forceUpdate) {
if (isTicking() || forceUpdate) {
long millis = Utils.getTimeNow();
mTimeLeft = mOriginalLength - (millis - mStartTime);
}
return mTimeLeft;
}
public boolean isTicking() {
return mState == STATE_RUNNING || mState == STATE_TIMESUP;
}
public boolean isInUse() {
return mState == STATE_RUNNING || mState == STATE_STOPPED;
}
public void addTime(long time) {
mTimeLeft = mOriginalLength - (Utils.getTimeNow() - mStartTime);
if (mTimeLeft < MAX_TIMER_LENGTH - time) {
mOriginalLength += time;
}
}
public long getTimesupTime() {
return mStartTime + mOriginalLength;
}
public static void getTimersFromSharedPrefs(
SharedPreferences prefs, ArrayList<TimerObj> timers) {
Object[] timerStrings =
prefs.getStringSet(PREF_TIMERS_LIST, new HashSet<String>()).toArray();
if (timerStrings.length > 0) {
for (int i = 0; i < timerStrings.length; i++) {
TimerObj t = new TimerObj();
t.mTimerId = Integer.parseInt((String)timerStrings[i]);
t.readFromSharedPref(prefs);
timers.add(t);
}
Collections.sort(timers, new Comparator<TimerObj>() {
@Override
public int compare(TimerObj timerObj1, TimerObj timerObj2) {
return timerObj2.mTimerId - timerObj1.mTimerId;
}
});
}
}
public static void getTimersFromSharedPrefs(
SharedPreferences prefs, ArrayList<TimerObj> timers, int match) {
Object[] timerStrings = prefs.getStringSet(PREF_TIMERS_LIST, new HashSet<String>())
.toArray();
if (timerStrings.length > 0) {
for (int i = 0; i < timerStrings.length; i++) {
TimerObj t = new TimerObj();
t.mTimerId = Integer.parseInt((String) timerStrings[i]);
t.readFromSharedPref(prefs);
if (t.mState == match) {
timers.add(t);
}
}
}
}
public static void putTimersInSharedPrefs(
SharedPreferences prefs, ArrayList<TimerObj> timers) {
if (timers.size() > 0) {
for (int i = 0; i < timers.size(); i++) {
TimerObj t = timers.get(i);
timers.get(i).writeToSharedPref(prefs);
}
}
}
public static void dumpTimersFromSharedPrefs(
SharedPreferences prefs) {
Object[] timerStrings =
prefs.getStringSet(PREF_TIMERS_LIST, new HashSet<String>()).toArray();
Log.v(TAG,"--------------------- timers list in shared prefs");
if (timerStrings.length > 0) {
for (int i = 0; i < timerStrings.length; i++) {
int id = Integer.parseInt((String)timerStrings[i]);
Log.v(TAG,"---------------------timer " + (i + 1) + ": id - " + id);
}
}
}
public static void resetTimersInSharedPrefs(SharedPreferences prefs) {
ArrayList<TimerObj> timers = new ArrayList<TimerObj>();
getTimersFromSharedPrefs(prefs, timers);
Iterator<TimerObj> i = timers.iterator();
while(i.hasNext()) {
TimerObj t = i.next();
t.mState = TimerObj.STATE_RESTART;
t.mTimeLeft = t. mOriginalLength = t.mSetupLength;
t.writeToSharedPref(prefs);
}
}
}