OSDN Git Service

T29623
authorYuji Konishi <yuji.k64613@gmail.com>
Fri, 21 Sep 2012 07:07:53 +0000 (16:07 +0900)
committerYuji Konishi <yuji.k64613@gmail.com>
Fri, 21 Sep 2012 07:07:53 +0000 (16:07 +0900)
T29622
T29619

source/workspace/EverFolder/src/com/yuji/ef/EverFolderActivity.java
source/workspace/EverFolder/src/com/yuji/ef/SettingActivity.java
source/workspace/EverFolder/src/com/yuji/ef/dao/LockDao.java
source/workspace/EverFolder/src/com/yuji/ef/service/NoteUpdatorService.java
source/workspace/EverFolder/src/com/yuji/ef/task/NoteUpdateTask.java
source/workspace/EverFolder/src/com/yuji/ef/utility/LockHandler.java

index 69e0daa..2d1d7af 100644 (file)
@@ -82,7 +82,8 @@ public class EverFolderActivity extends BaseActivity implements LockListener {
        private boolean isInit = true;
        private boolean isInCycle = false;
        private boolean isResult = false;
-
+       private LockHandler lockHandler = null;
+       
        private BroadcastReceiver receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
@@ -624,8 +625,8 @@ public class EverFolderActivity extends BaseActivity implements LockListener {
                        pref.update();
                }
                
-               LockHandler handler = new LockHandler();
-               handler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
+               lockHandler = new LockHandler();
+               lockHandler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
                lock = false;
 
                if (isInit) {
@@ -647,6 +648,11 @@ public class EverFolderActivity extends BaseActivity implements LockListener {
                lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
                lock = false;
 
+               if (lockHandler != null){
+                       lockHandler.cancel();
+                       lockHandler = null;
+               }
+               
                super.onPause();
                isInCycle = false;
        }
index a5bc2b2..beacde5 100644 (file)
@@ -58,7 +58,8 @@ public class SettingActivity extends BaseActivity implements LockListener {
        private boolean lock = false;
        private boolean isInit = true;
        private boolean isInCycle = false;
-
+       private LockHandler lockHandler = null;
+       
        private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
@@ -78,7 +79,7 @@ public class SettingActivity extends BaseActivity implements LockListener {
                        }
                }
        };
-       
+
        private class NoteUpdatorReceiver extends BroadcastReceiver {
 
                @Override
@@ -169,7 +170,7 @@ public class SettingActivity extends BaseActivity implements LockListener {
                noteOrderAdapter
                                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                updateSpinner.setAdapter(noteOrderAdapter);
-               
+
                OAuthUtil authUtil = OAuthUtil.getInstance();
                EvernoteSession session = authUtil.setupSession(this);
                EvernoteUtil.getInstance().setSession(session);
@@ -178,13 +179,13 @@ public class SettingActivity extends BaseActivity implements LockListener {
        @Override
        public void sendLockResult(boolean b) {
                lock = true;
-               
+
                if (isInit) {
                        isInit = false;
                }
                setStatus();
        }
-       
+
        @Override
        protected void onStart() {
                super.onStart();
@@ -195,9 +196,9 @@ public class SettingActivity extends BaseActivity implements LockListener {
                super.onResume();
                isInCycle = true;
 
-               LockHandler handler = new LockHandler();
+               lockHandler = new LockHandler();
                boolean isUnlock = false;
-               handler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
+               lockHandler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
                lock = false;
 
                int updateTime = pref.getInt(Constant.PREF_UPDATE_TIME, 0);
@@ -212,7 +213,7 @@ public class SettingActivity extends BaseActivity implements LockListener {
                }
                String updateDate = pref.get(Constant.PREF_UPDATE_DATETIME);
                updateDateText.setText(updateDate);
-               
+
                setStatus();
        }
 
@@ -251,6 +252,11 @@ public class SettingActivity extends BaseActivity implements LockListener {
                lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
                lock = false;
 
+               if (lockHandler != null){
+                       lockHandler.cancel();
+                       lockHandler = null;
+               }
+               
                super.onPause();
                isInCycle = false;
        }
@@ -303,8 +309,15 @@ public class SettingActivity extends BaseActivity implements LockListener {
 
        private void updateButton(boolean isAll) {
                // #29618
-               //LockDao lockDao = (LockDao) LockDao.getInstance();
-               //lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
+               // LockDao lockDao = (LockDao) LockDao.getInstance();
+               // lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
+               LockDao lockDao = (LockDao) LockDao.getInstance();
+               boolean b = lockDao.move(NoteUpdateTask.LOCK_OBJ,
+                               Constant.LOCK_UPDATE_NOTE);
+               if (!b) {
+                       // TODO
+                       return;
+               }
 
                if (!lock) {
                        setStatus();
@@ -328,11 +341,21 @@ public class SettingActivity extends BaseActivity implements LockListener {
        }
 
        public void done(int errorCode) {
-               // #29618
-               //lock = false;
-               lock = true;
-               
-               setStatus();
+               // TODO
+               // // #29618
+               // // lock = false;
+               // lock = true;
+               //
+               // setStatus();
+
+               if (isInCycle) {
+                       // onResume()で生成している & cancel()は、呼ばれていないため
+                       //lockHandler = new LockHandler();
+                       boolean isUnlock = false;
+                       lockHandler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
+                       lock = false;
+                       setStatus();
+               }
        }
 
        private void updateSpinnerItemSelected(AdapterView<?> parent, View view,
@@ -377,7 +400,7 @@ public class SettingActivity extends BaseActivity implements LockListener {
 
                NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
                List<Node> list = dao.searchBook();
-               if (list == null || list.size() <= 0){
+               if (list == null || list.size() <= 0) {
                        msgLayout.setVisibility(View.VISIBLE);
                        confirmMsg.setText(getString(R.string.settingDoListMsg));
 
@@ -390,8 +413,8 @@ public class SettingActivity extends BaseActivity implements LockListener {
                        updateDateLayout.setVisibility(View.GONE);
 
                        return;
-               }               
-               
+               }
+
                list = dao.searchSelectedBook();
                if (list == null || list.size() <= 0) {
                        msgLayout.setVisibility(View.VISIBLE);
@@ -428,14 +451,13 @@ public class SettingActivity extends BaseActivity implements LockListener {
                bookButton.setEnabled(true);
                updateButton.setEnabled(true);
                updateSpinner.setEnabled(true);
-               
+
                int pos = updateSpinner.getSelectedItemPosition();
-               if (pos == 0){
+               if (pos == 0) {
                        updateDateLayout.setVisibility(View.GONE);
-               }
-               else {
+               } else {
                        updateDateLayout.setVisibility(View.VISIBLE);
-               }               
+               }
                msgLayout.setVisibility(View.GONE);
        }
 
index 08a76fd..64c5fe7 100644 (file)
@@ -14,9 +14,10 @@ import com.yuji.ef.utility.Debug;
 
 public class LockDao implements IDao<Lock> {
        private static final int DEFAULT_PERIOD = 60 * 60; // 1時間
-       
+
        private static IDao<Lock> instance = null;
        private SQLiteStatement insertStmt = null;
+       private SQLiteStatement updateStmt = null;
        private SQLiteStatement deleteIdStmt = null;
        private SQLiteStatement deleteUpdatedStmt = null;
 
@@ -40,14 +41,14 @@ public class LockDao implements IDao<Lock> {
                insertStmt = db.compileStatement("INSERT INTO LOCK (" + "KEY,"
                                + "CLASS," + "STATUS," + "UPDATED" + ") VALUES (" + "?,?,?,?"
                                + ");");
-               // deleteIdStmt = db.compileStatement("DELETE FROM LOCK WHERE "
-               // + android.provider.BaseColumns._ID + " = ?");
+               updateStmt = db
+                               .compileStatement("UPDATE LOCK SET CLASS = ? WHERE KEY = ?");
                deleteIdStmt = db.compileStatement("DELETE FROM LOCK WHERE "
                                + "KEY = ? AND CLASS = ?");
                deleteUpdatedStmt = db.compileStatement("DELETE FROM LOCK WHERE "
                                + "KEY = ? AND UPDATED < ?");
-               
-               }
+
+       }
 
        @Override
        public void start(SQLiteDatabase db) {
@@ -76,8 +77,7 @@ public class LockDao implements IDao<Lock> {
 
        private List<Lock> search(String selection, String[] selectionArgs,
                        String orderBy) {
-               return search(getSQLiteDatabase(),
-                               selection, selectionArgs, orderBy);
+               return search(getSQLiteDatabase(), selection, selectionArgs, orderBy);
        }
 
        private List<Lock> search(SQLiteDatabase db, String selection,
@@ -127,7 +127,7 @@ public class LockDao implements IDao<Lock> {
                        Calendar cal = Calendar.getInstance();
                        long updated = cal.getTimeInMillis();
                        updated -= DEFAULT_PERIOD * 1000;
-                       
+
                        deleteUpdatedNT(lock.getKey(), updated);
                        deleteNT(lock.getKey(), lock.getClazz());
                        id = addNT(lock);
@@ -160,9 +160,35 @@ public class LockDao implements IDao<Lock> {
                return id;
        }
 
+       public long update(Lock lock, String clazz) {
+               return update(getSQLiteDatabase(), lock, clazz);
+       }
+
+       private long update(SQLiteDatabase db, Lock lock, String clazz) {
+               long id = -1;
+               db.beginTransaction();
+               try {
+                       id = updateNT(lock, clazz);
+                       db.setTransactionSuccessful();
+               } finally {
+                       db.endTransaction();
+               }
+               return id;
+       }
+
+       public long updateNT(Lock lock, String clazz) {
+               long id = -1;
+               int i = 1;
+
+               SQLiteStatement stmt = updateStmt;
+               stmt.bindString(i++, clazz);
+               stmt.bindString(i++, lock.getKey());
+               id = stmt.executeInsert();
+               return id;
+       }
+
        public long delete(String key, String clazz) {
-               return delete(getSQLiteDatabase(), key,
-                               clazz);
+               return delete(getSQLiteDatabase(), key, clazz);
        }
 
        public long delete(SQLiteDatabase db, String key, String clazz) {
@@ -204,15 +230,23 @@ public class LockDao implements IDao<Lock> {
                return obj.getClass().getName();
        }
 
+       // TODO
+       private String lockInfo = "<none>";
+
+       public String getLockInfo() {
+               return lockInfo;
+       }
+
        public boolean lock(Object obj, String key) {
                Calendar cal = Calendar.getInstance();
                long updated = cal.getTimeInMillis();
-               
+
                Lock lock = new Lock();
                lock.setKey(key);
-               lock.setClazz(getClazz(obj));           
+               lock.setClazz(getClazz(obj));
                lock.setUpdated(updated);
                if (this.add(lock) > 0) {
+                       lockInfo = "<none>";
                        return true;
                } else {
                        List<Lock> list = this.search();
@@ -222,6 +256,7 @@ public class LockDao implements IDao<Lock> {
                                        String c = lock.getClazz();
                                        String s = lock.getKey();
                                        Debug.d(this, c + "," + s);
+                                       lockInfo = c + "," + s;
                                } catch (Exception e) {
                                        ;
                                }
@@ -230,6 +265,14 @@ public class LockDao implements IDao<Lock> {
                }
        }
 
+       public boolean move(Object obj, String key) {
+
+               Lock lock = new Lock();
+               lock.setKey(key);
+
+               return update(lock, getClazz(obj)) > 0;
+       }
+
        public void unlock(Class clazz, String key) {
                try {
                        this.delete(key, clazz.getName());
@@ -237,7 +280,7 @@ public class LockDao implements IDao<Lock> {
                        ;
                }
        }
-       
+
        public void unlock(Object obj, String key) {
                try {
                        this.delete(key, getClazz(obj));
@@ -249,8 +292,8 @@ public class LockDao implements IDao<Lock> {
        public boolean isLock(Object obj, String key) {
                return searchByKey(key) != null;
        }
-       
-       public SQLiteDatabase getSQLiteDatabase(){
+
+       public SQLiteDatabase getSQLiteDatabase() {
                return DatabaseHelper.getInstance(1).getSQLiteDatabase();
        }
 }
index daf2bc4..e2ad588 100644 (file)
@@ -87,6 +87,8 @@ public class NoteUpdatorService extends Service {
                                                        if (b) {
                                                                execute();
                                                        } else {
+                                                               String info = dao.getLockInfo();
+                                                               Debug.d(this, info);
                                                                updateDate(NoteUpdatorService.this
                                                                                .getString(R.string.serviceUpdateReferenceDataMsg));
                                                        }
@@ -269,10 +271,14 @@ public class NoteUpdatorService extends Service {
                        
                        // サービス起動中の場合は、DBロックがかかり
                        // 更新後まで、ロックは解除されない。
+                       // TODO
+                       // ロックを別DBにしたため、要検討
                        LockDao lockDao = (LockDao) LockDao.getInstance();
                        lockDao.unlock(NoteUpdatorService.class,
                                        Constant.LOCK_UPDATE_NOTE);
                        lockDao.unlock(SettingActivity.class, Constant.LOCK_UPDATE_NOTE);
+                       // TODO
+                       lockDao.unlock(NoteUpdateTask.LOCK_OBJ, Constant.LOCK_UPDATE_NOTE);
                        lockDao = null;
                }
                
index d32c1fd..0c4f810 100644 (file)
@@ -13,6 +13,8 @@ import com.yuji.ef.utility.Debug;
 import com.yuji.ef.utility.FolderUtil;
 
 public class NoteUpdateTask implements AsyncTaskIF {
+       public static final Object LOCK_OBJ = new Object();
+
        private WeakReference<SettingActivity> activityRef;
 
        private boolean isRoot;
@@ -87,6 +89,11 @@ public class NoteUpdateTask implements AsyncTaskIF {
                // LockDao lockDao = (LockDao) LockDao.getInstance();
                // lockDao.unlock(SettingActivity.class, Constant.LOCK_UPDATE_NOTE);
 
+               // TODO
+               // とりあえず正常系のみ
+               LockDao lockDao = (LockDao) LockDao.getInstance();
+               lockDao.unlock(NoteUpdateTask.LOCK_OBJ, Constant.LOCK_UPDATE_NOTE);
+
                SettingActivity activity = getActivity();
                if (activity != null) {
                        activity.done(errorCode);
index f62952e..6dd1a60 100644 (file)
@@ -8,9 +8,10 @@ import com.yuji.ef.common.Constant;
 import com.yuji.ef.dao.LockDao;
 
 public class LockHandler {
-       private final static int N = 64;
+       private final static int N = 32;
        private LockDao dao = (LockDao) LockDao.getInstance();
-
+       private boolean isCanceled = false;
+       
        public void lock(final LockListener target, final String key,
                        final boolean wait, final boolean isUnlock) {
                final Handler handler = new Handler() {
@@ -23,15 +24,18 @@ public class LockHandler {
                        public void run() {
                                // #29573
                                if (isUnlock){
+                                       // TODO 他のロックは解除せずでよいか
                                        dao.unlock(SettingActivity.class, Constant.LOCK_UPDATE_NOTE);
                                }
                                
                                int n = 1;
-                               while (true) {
+                               while (!isCanceled) {
                                        boolean lock = dao.lock(target, key);
 
                                        if (wait) {
                                                if (!lock) {
+                                                       String info = dao.getLockInfo();
+                                                       Debug.d(this, info);
                                                        try {
                                                                Thread.sleep(n * 1000);
                                                        } catch (InterruptedException e) {
@@ -50,4 +54,8 @@ public class LockHandler {
                });
                t.start();
        }
+       
+       public void cancel(){
+               isCanceled = true;
+       }
 }