/* * 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 CREATOR = new Parcelable.Creator() { @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 timersList = prefs.getStringSet(PREF_TIMERS_LIST, new HashSet()); 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 timersList = prefs.getStringSet(PREF_TIMERS_LIST, new HashSet()); 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 timers) { Object[] timerStrings = prefs.getStringSet(PREF_TIMERS_LIST, new HashSet()).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() { @Override public int compare(TimerObj timerObj1, TimerObj timerObj2) { return timerObj2.mTimerId - timerObj1.mTimerId; } }); } } public static void getTimersFromSharedPrefs( SharedPreferences prefs, ArrayList timers, int match) { Object[] timerStrings = prefs.getStringSet(PREF_TIMERS_LIST, new HashSet()) .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 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()).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 timers = new ArrayList(); getTimersFromSharedPrefs(prefs, timers); Iterator i = timers.iterator(); while(i.hasNext()) { TimerObj t = i.next(); t.mState = TimerObj.STATE_RESTART; t.mTimeLeft = t. mOriginalLength = t.mSetupLength; t.writeToSharedPref(prefs); } } }