1 package com.yuji.ef.service;
3 import java.util.Calendar;
5 import android.app.AlarmManager;
6 import android.app.PendingIntent;
7 import android.app.Service;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.os.Binder;
11 import android.os.IBinder;
12 import android.widget.Toast;
14 import com.evernote.client.oauth.android.EvernoteSession;
15 import com.yuji.ef.Initialize;
17 import com.yuji.ef.SettingActivity;
18 import com.yuji.ef.common.Constant;
19 import com.yuji.ef.dao.LockDao;
20 import com.yuji.ef.exception.EfException;
21 import com.yuji.ef.pref.EditPrefUtil;
22 import com.yuji.ef.task.NoteUpdateTask;
23 import com.yuji.ef.utility.DateUtil;
24 import com.yuji.ef.utility.Debug;
25 import com.yuji.ef.utility.EvernoteUtil;
26 import com.yuji.ef.utility.NetworkUtil;
27 import com.yuji.ef.utility.OAuthUtil;
29 public class NoteUpdatorService extends Service {
30 private static final boolean DEBUG = false;
32 public class KitchenTimerBinder extends Binder {
33 public NoteUpdatorService getService() {
34 return NoteUpdatorService.this;
38 public static final String ACTION = "NoteUpdatorService";
39 public static final String ACTION_START = "START";
40 private EditPrefUtil pref = new EditPrefUtil(this);
41 private KitchenTimerBinder binder = new KitchenTimerBinder();
42 private String action = null;
45 public void onCreate() {
49 Toast toast = Toast.makeText(getApplicationContext(), "onCreate()",
55 private Runnable task = new Runnable() {
58 //cancelAlermTime(NoteUpdatorService.this);
60 if (action.equals(ACTION_START)) {
64 synchronized (binder) {
65 LockDao dao = (LockDao) LockDao.getInstance();
68 .isConnected(NoteUpdatorService.this)) {
69 updateDate(NoteUpdatorService.this
70 .getString(R.string.serviceUpdateDisableNetworkMsg));
73 OAuthUtil authUtil = OAuthUtil.getInstance();
74 EvernoteSession session = authUtil
75 .setupSession(NoteUpdatorService.this);
76 EvernoteUtil util = EvernoteUtil.getInstance();
77 util.setSession(session);
78 if (!util.isLoggedIn()) {
79 updateDate(NoteUpdatorService.this
80 .getString(R.string.serviceUpdateNotLoggedkMsg));
83 boolean b = dao.lock(NoteUpdatorService.this,
84 Constant.LOCK_UPDATE_NOTE);
88 updateDate(NoteUpdatorService.this
89 .getString(R.string.serviceUpdateReferenceDataMsg));
91 } catch (Exception e) {
92 Debug.d(this, null, e);
93 updateDate(NoteUpdatorService.this
94 .getString(R.string.serviceUpdateUnexpectedErrorkMsg));
97 dao.unlock(NoteUpdatorService.this,
98 Constant.LOCK_UPDATE_NOTE);
100 Intent intent = new Intent(Constant.ACTION_UPDATE);
101 sendBroadcast(intent);
106 setNextTime(NoteUpdatorService.this);
107 NoteUpdatorService.this.stopSelf();
111 private void execute() throws EfException {
112 pref.put(Constant.PREF_UPDATE_DATA, Constant.ON);
115 Initialize.initialize(NoteUpdatorService.this, null);
117 NoteUpdateTask task = new NoteUpdateTask(null, true, true, true);
125 private void updateDate(String msg) {
126 Calendar cal = Calendar.getInstance();
127 String date = DateUtil.toDateString(this, cal.getTimeInMillis());
130 date = date + " (" + msg + ")";
133 pref.put(Constant.PREF_UPDATE_DATETIME, date);
138 public void onStart(Intent intent, int startId) {
139 super.onStart(intent, startId);
141 action = intent.getAction();
142 action = (action == null) ? "" : action;
145 Toast toast = Toast.makeText(getApplicationContext(), "onStart() "
146 + action + " " + startId, Toast.LENGTH_SHORT);
150 Thread thread = new Thread(null, task, "AlarmService_Service");
155 public void onDestroy() {
159 Toast toast = Toast.makeText(getApplicationContext(),
160 "onDestroy()", Toast.LENGTH_SHORT);
166 public IBinder onBind(Intent intent) {
168 Toast toast = Toast.makeText(getApplicationContext(), "onBind()",
177 public void onRebind(Intent intent) {
179 Toast toast = Toast.makeText(getApplicationContext(), "onRebind()",
186 public boolean onUnbind(Intent intent) {
188 Toast toast = Toast.makeText(getApplicationContext(), "onUnbind()",
195 public static void setNextTime(Context context) {
196 EditPrefUtil pref = new EditPrefUtil(context);
198 long updateTime = pref.getLong(Constant.PREF_UPDATE_TIME);
199 if (updateTime <= 0) {
203 Calendar cal = Calendar.getInstance();
204 // cal.add(Calendar.HOUR, (int) updateTime);
205 cal.add(Calendar.SECOND, (int) 15); // TODO
207 long t = cal.getTimeInMillis();
208 PendingIntent alarmSender = PendingIntent.getService(context, 0,
209 new Intent(context, NoteUpdatorService.class), 0);
210 AlarmManager am = (AlarmManager) context
211 .getSystemService(Context.ALARM_SERVICE);
212 am.set(AlarmManager.RTC, t, alarmSender);
214 pref.put(Constant.PREF_NEXT_TIME, t);
218 private static void cancelAlermTime(Context context){
219 Calendar cal = Calendar.getInstance();
221 long t = cal.getTimeInMillis();
222 PendingIntent alarmSender = PendingIntent.getService(context, 0,
223 new Intent(context, NoteUpdatorService.class), 0);
224 AlarmManager am = (AlarmManager) context
225 .getSystemService(Context.ALARM_SERVICE);
226 am.cancel(alarmSender);
229 public static void stopService(Context context) {
230 PendingIntent alarmSender = PendingIntent.getService(context, 0,
231 new Intent(context, NoteUpdatorService.class),
232 PendingIntent.FLAG_CANCEL_CURRENT);
235 public static boolean isSetAlarmSender(Context context) {
236 PendingIntent alarmSender = PendingIntent.getService(context, 0,
237 new Intent(context, NoteUpdatorService.class),
238 PendingIntent.FLAG_NO_CREATE);
239 return alarmSender != null;
242 public static void init(Context context) {
243 EditPrefUtil pref = new EditPrefUtil(context);
245 boolean isSet = NoteUpdatorService.isSetAlarmSender(context);
246 int updateTime = pref.getInt(Constant.PREF_UPDATE_TIME);
249 // サービス起動中でなく、ロックが残っている場合、削除(DB排他で、ロックされないこと)
251 long t = pref.getLong(Constant.PREF_NEXT_TIME);
252 Calendar cal = Calendar.getInstance();
253 long now = cal.getTimeInMillis();
257 // サービス起動中の場合は、DBロックがかかり
259 LockDao lockDao = (LockDao) LockDao.getInstance();
260 lockDao.unlock(NoteUpdatorService.class,
261 Constant.LOCK_UPDATE_NOTE);
262 lockDao.unlock(SettingActivity.class, Constant.LOCK_UPDATE_NOTE);
266 if (updateTime > 0) {
269 setNextTime(context);
274 // isSetはクリアされないが、問題ないので毎回よぶ
275 stopService(context);