3 import java.util.ArrayList;
4 import java.util.Collections;
7 import android.content.BroadcastReceiver;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.content.IntentFilter;
11 import android.database.sqlite.SQLiteDatabase;
12 import android.graphics.Bitmap;
13 import android.graphics.PixelFormat;
14 import android.os.Bundle;
15 import android.text.Editable;
16 import android.text.TextWatcher;
17 import android.view.Gravity;
18 import android.view.Menu;
19 import android.view.MenuItem;
20 import android.view.View;
21 import android.view.View.OnClickListener;
22 import android.view.WindowManager;
23 import android.view.inputmethod.InputMethodManager;
24 import android.widget.Button;
25 import android.widget.EditText;
26 import android.widget.LinearLayout;
27 import android.widget.TextView;
29 import com.yuji.ef.common.CommonUtil;
30 import com.yuji.ef.common.Constant;
31 import com.yuji.ef.dao.DatabaseHelper;
32 import com.yuji.ef.dao.DirNode;
33 import com.yuji.ef.dao.FileNode;
34 import com.yuji.ef.dao.LockDao;
35 import com.yuji.ef.dao.Node;
36 import com.yuji.ef.dao.Node.Status;
37 import com.yuji.ef.dao.NodeCacheDao;
38 import com.yuji.ef.dao.NodeComparator;
39 import com.yuji.ef.dao.NodeDao;
40 import com.yuji.ef.dao.NodeDaoImpl;
41 import com.yuji.ef.dao.RootNode;
42 import com.yuji.ef.exception.EfException;
43 import com.yuji.ef.pref.EditPrefUtil;
44 import com.yuji.ef.utility.BaseActivity;
45 import com.yuji.ef.utility.BitmapCacheFactory;
46 import com.yuji.ef.utility.EvernoteIntentUtil;
47 import com.yuji.ef.utility.FolderUtil;
48 import com.yuji.ef.utility.LockHandler;
49 import com.yuji.ef.utility.LockListener;
50 import com.yuji.ef.utility.ScaleUtil;
52 public class EverFolderActivity extends BaseActivity implements LockListener {
53 private enum ScreenStatus {
54 Normal, AddNode, DeleteNode, RenameNode
56 private EditPrefUtil pref = new EditPrefUtil(this);
58 private LinearLayout msgLayout;
59 private LinearLayout msgButtonLayout;
60 private Button msgOkButton;
61 private Button msgCancelButton;
62 private EditText msgEditText;
64 private IconFrameLayout layout;
65 private TextView confirmMsg;
66 private IconScrollView scrollView;
67 private LinearLayout buttonLayout;
68 private Button leftButton;
69 private Button rightButton;
70 // private Button addButton;
71 // private Button deleteButton;
73 private ScreenStatus status;
74 private NodeComparator nodeComparator = new NodeComparator();
75 private BitmapCacheFactory bitmapFactory = BitmapCacheFactory.getInstance();
76 private Node top = null;
77 private int indent = 0;
78 private int bmpPaddingLeft;
81 private boolean lock = false;
82 private boolean isInit = true;
83 private boolean isInCycle = false;
84 private boolean isResult = false;
86 private BroadcastReceiver receiver = new BroadcastReceiver() {
88 public void onReceive(Context context, Intent intent) {
89 String action = intent.getAction();
91 if (action.equals(Constant.ACTION_MESSAGE)) {
92 String msg = intent.getStringExtra(Constant.ACTION_MESSAGE_MESSAGE);
93 EfException.msg(EverFolderActivity.this, msg);
95 else if (action.equals(Constant.ACTION_UPDATE)) {
96 if (isInCycle && !lock) {
97 LockDao lockDao = (LockDao) LockDao.getInstance();
98 lock = lockDao.lock(EverFolderActivity.this,
99 Constant.LOCK_UPDATE_NOTE);
102 // ほんとは、setStatus()に入れたい
103 layout.setVisibility(View.VISIBLE);
112 public void onCreate(Bundle savedInstanceState) {
113 super.onCreate(savedInstanceState);
114 setContentView(R.layout.main);
117 IntentFilter intentFilter = new IntentFilter();
118 intentFilter.addAction(Constant.ACTION_UPDATE);
119 intentFilter.addAction(Constant.ACTION_MESSAGE);
120 registerReceiver(receiver, intentFilter);
122 scrollView = (IconScrollView) findViewById(R.id.scrollView);
123 layout = (IconFrameLayout) findViewById(R.id.frameLayout);
124 layout.setActivity(this);
125 layout.setScrollView(scrollView);
127 buttonLayout = (LinearLayout) findViewById(R.id.mainButtonLayout);
128 leftButton = (Button) findViewById(R.id.leftButton);
129 rightButton = (Button) findViewById(R.id.rightButton);
130 // addButton = (Button) findViewById(R.id.addButton);
131 // deleteButton = (Button) findViewById(R.id.deleteButton);
133 msgLayout = (LinearLayout) findViewById(R.id.mainMsgLayout);
134 confirmMsg = (TextView) findViewById(R.id.mainConfirmMsg);
135 msgEditText = (EditText) findViewById(R.id.mainMsgEditText);
136 msgButtonLayout = (LinearLayout) findViewById(R.id.mainMsgButtonLayout);
137 msgOkButton = (Button) findViewById(R.id.mainMsgOkButton);
138 msgCancelButton = (Button) findViewById(R.id.mainMsgCancelButton);
140 leftButton.setOnClickListener(new OnClickListener() {
142 public void onClick(View v) {
146 rightButton.setOnClickListener(new OnClickListener() {
148 public void onClick(View v) {
149 rightButtonOnClick();
152 // addButton.setOnClickListener(new OnClickListener() {
154 // public void onClick(View v) {
155 // addButtonOnClick();
158 // deleteButton.setOnClickListener(new OnClickListener() {
160 // public void onClick(View v) {
161 // deleteButtonOnClick();
165 msgEditText.addTextChangedListener(new TextWatcher() {
166 public void afterTextChanged(Editable s) {
167 if (status != ScreenStatus.DeleteNode) {
168 String text = s.toString();
169 msgOkButton.setEnabled(text.length() > 0);
171 msgOkButton.setEnabled(true);
175 public void beforeTextChanged(CharSequence s, int start,
176 int count, int after) {
180 public void onTextChanged(CharSequence s, int start,
181 int before, int count) {
186 msgOkButton.setOnClickListener(new OnClickListener() {
188 public void onClick(View v) {
189 msgOkButtonOnClick(v);
192 msgCancelButton.setOnClickListener(new OnClickListener() {
194 public void onClick(View v) {
199 ScaleUtil scaleUtil = ScaleUtil.getInstance();
200 scaleUtil.init(this);
202 bitmapFactory.init(this);
203 Node node = new DirNode(null, null);
205 bmp = bitmapFactory.get(node.getStatusIconId());
206 bmpPaddingLeft = bmp.getWidth();
207 bmp = bitmapFactory.get(node.getIconId());
208 bmpWidth = bmp.getWidth();
210 float fSize = 48 * (1 / 2.0f);
211 leftButton.setTextSize(fSize);
212 rightButton.setTextSize(fSize);
213 } catch (Exception e) {
220 public boolean onCreateOptionsMenu(Menu menu) {
221 boolean ret = super.onCreateOptionsMenu(menu);
224 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "カット");
225 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "ペースト");
226 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "追加");
227 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "削除");
228 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "リネーム");
229 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "設定");
234 public boolean onMenuOpened(int featureId, Menu menu) {
235 boolean ret = super.onMenuOpened(featureId, menu);
244 boolean cutButtonFlag = false;
245 boolean pastButtonFlag = false;
246 boolean addButtonFlag = false;
247 boolean deleteButtonFlag = false;
248 boolean renameButtonFlag = false;
249 boolean confButtonFlag = true;
251 if (status == ScreenStatus.Normal) {
252 LabelIconView target = layout.getSelectedTarget();
253 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
256 if (target != null) {
257 id = target.getNodeId();
258 node = dao.searchById(id);
261 if (isDirNode(target, node, false) || isFileNode(node)) {
262 cutButtonFlag = true;
264 if (isDirNode(target, node, true) && isCut()) {
265 pastButtonFlag = true;
267 if (isDirNode(target, node, true)) {
268 addButtonFlag = true;
270 if (isDirNode(target, node, false) && !isNoteBook(node)
271 && CommonUtil.isNull(node.getChildrenString())) {
272 deleteButtonFlag = true;
274 if (isDirNode(target, node, false) && !isNoteBook(node)) {
275 renameButtonFlag = true;
280 item = menu.getItem(index++);
281 item.setVisible(cutButtonFlag);
282 item = menu.getItem(index++);
283 item.setVisible(pastButtonFlag);
284 item = menu.getItem(index++);
285 item.setVisible(addButtonFlag);
286 item = menu.getItem(index++);
287 item.setVisible(deleteButtonFlag);
288 item = menu.getItem(index++);
289 item.setVisible(renameButtonFlag);
290 item = menu.getItem(index++);
291 item.setVisible(confButtonFlag);
296 private boolean isFileNode(Node node) {
297 if (node == null || !(node instanceof FileNode)) {
303 private boolean isDirNode(LabelIconView target, Node node,
304 boolean containRoot) {
305 if (target == null) {
311 if (!containRoot && (node instanceof RootNode)) {
314 if (!(node instanceof DirNode)) {
320 private boolean isNoteBook(Node node) {
324 if (CommonUtil.isNull(node.getGuid())) {
330 private boolean isCut() {
331 LabelIconView srcTarget = layout.getCutTarget();
332 if (srcTarget == null) {
339 public boolean onOptionsItemSelected(MenuItem item) {
342 switch (item.getItemId()) {
361 intent = new Intent(this, (Class<?>) SettingActivity.class);
362 startActivityForResult(intent, 0);
367 } catch (Exception e) {
370 return super.onOptionsItemSelected(item);
373 private void dummy() {
374 NodeDaoImpl dao = (NodeDaoImpl) NodeCacheDao.getInstance();
375 List<Node> list = dao.search();
376 for (Node node : list) {
377 System.out.println(node.toString());
381 private void dummy2() {
382 LockDao dao = (LockDao) LockDao.getInstance();
386 b = dao.lock(this, "key");
387 b = dao.lock(this, "key");
388 b = dao.lock(new Object(), "key");
389 dao.unlock(this, "key");
390 b = dao.lock(new Object(), "key");
391 b = dao.lock(this, "key");
392 b = dao.lock(this, "key");
393 b = dao.lock(this, "key");
394 dao.unlock(new Object(), "key");
396 } catch (Exception e) {
402 private void selectMenuAdd() {
403 setStatus(ScreenStatus.AddNode);
406 private void selectMenuDelete() {
407 setStatus(ScreenStatus.DeleteNode);
410 private void selectMenuRename() {
411 LabelIconView target = layout.getSelectedTarget();
412 if (target == null) {
416 long id = target.getNodeId();
417 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
418 Node node = dao.searchById(id);
420 String text = node.getName();
421 msgEditText.setText(text);
422 setStatus(ScreenStatus.RenameNode);
426 private void selectMenuCut() {
427 LabelIconView target = layout.getSelectedTarget();
428 if (target == null) {
432 layout.setCutTarget(target);
436 private void selectMenuPast() {
437 LabelIconView srcTarget = layout.getCutTarget();
438 if (srcTarget == null) {
442 LabelIconView dstTarget = layout.getSelectedTarget();
443 if (dstTarget == null) {
447 layout.setCutTarget(null);
449 long srcId = srcTarget.getNodeId();
450 long dstId = dstTarget.getNodeId();
451 execute(srcId, dstId);
454 private void updateList() {
455 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
456 top = dao.searchRoot();
463 private void updateList(Node parent) {
466 scrollView.setVisibility(View.GONE);
467 layout.removeAllViews();
468 updateList(parent, 0);
469 layout.setMinimumHeight(viewY);
470 scrollView.setVisibility(View.VISIBLE);
473 scrollView.invalidate();
476 private void updateList(Node node, int depth) {
477 int N = (int) (bmpWidth * 0.6);
478 int M = (int) (bmpWidth * 1.2);
479 int x = N * (depth - indent);
481 if (depth - indent >= 0
482 && !(depth - indent == 0 && node instanceof FileNode)) {
483 LabelIconView view = new LabelIconView(this);
487 int id = node.getStatusIconId();
490 bmp1 = bitmapFactory.get(node.getStatusIconId());
495 Bitmap bmp2 = bitmapFactory.get(node.getIconId());
496 createIconImageView(view, bmp1, bmp2, node.getName(), x, viewY);
497 // LabelIconView s = view.getStatusImageView();
499 // s.setNodeId(node.getId());
501 view.setNodeId(node.getId());
505 if (node.getStatus() != Node.Status.OPEN) {
508 List<Long> idList = node.getChildren();
509 if (idList == null) {
513 List<Node> list = new ArrayList<Node>();
514 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
515 for (Long id : idList) {
516 Node n = dao.searchById(id);
521 if (n instanceof DirNode) {
522 DirNode d = (DirNode) n;
523 if (isNoteBook(d) && !d.isSelected()) {
529 Collections.sort(list, nodeComparator);
530 for (Node n : list) {
531 updateList(n, depth + 1);
535 private void createIconImageView(LabelIconView v, Bitmap bmp1, Bitmap bmp2,
536 String text, int x, int y) {
537 v.init(x, y, bmp1, bmp2, text);
539 android.view.WindowManager.LayoutParams params = new WindowManager.LayoutParams();
540 params.gravity = Gravity.TOP | Gravity.LEFT;
541 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
542 params.width = WindowManager.LayoutParams.WRAP_CONTENT;
543 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
544 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
545 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
546 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
547 params.format = PixelFormat.TRANSLUCENT;
548 params.windowAnimations = 0;
551 v.setLayoutParams(params);
553 // LabelIconView siv = v.getStatusImageView();
554 // if (siv != null) {
555 // layout.addView(siv, false);
559 v.layout(x, y, x + v.getWidth(), y + v.getHeight());
563 public void sendLockResult(boolean b) {
564 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
566 pref.put(Constant.PREF_UPDATE_DATA, Constant.OFF);
579 Intent intent = new Intent(this,
580 (Class<?>) SettingActivity.class);
581 startActivityForResult(intent, 0);
591 LockDao lockDao = (LockDao) LockDao.getInstance();
592 lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
594 status = ScreenStatus.Normal;
597 layout.setVisibility(View.VISIBLE);
600 layout.removeAllViews();
614 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
615 // TODO sendLockResult()、「lock解除」のため、とりあえずコメント
616 // NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
617 // if (dao.isEmpty()) {
625 protected void onStart() {
630 protected void onResume() {
634 LockHandler handler = new LockHandler();
635 handler.lock(this, Constant.LOCK_UPDATE_NOTE);
639 layout.setVisibility(View.INVISIBLE);
648 // NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
649 // if (dao.isEmpty()) {
651 // Intent intent = new Intent(this,
652 // (Class<?>) SettingActivity.class);
653 // startActivityForResult(intent, 0);
662 // LockDao lockDao = (LockDao) LockDao.getInstance();
663 // lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
666 // status = ScreenStatus.Normal;
671 // layout.removeAllViews();
681 protected void onPause() {
682 // ロック未取得でも解除する(ゴミ掃除)
683 LockDao lockDao = (LockDao) LockDao.getInstance();
684 lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
691 private void leftButtonOnClick() {
692 moveButtonOnClick(-1);
696 private void rightButtonOnClick() {
697 moveButtonOnClick(1);
701 private void moveButtonOnClick(int dx) {
718 // private void addButtonOnClick() {
719 // setStatus(ScreenStatus.AddNode);
722 // private void deleteButtonOnClick() {
723 // FolderUtil util = FolderUtil.getInstance();
724 // LabelIconView target = layout.getSelectedTarget();
725 // long id = target.getNodeId();
726 // NodeDao dao = (NodeDao) NodeDao.getInstance();
727 // Node node = dao.searchById(id);
728 // if (node != null) {
729 // util.deleteNode(node);
730 // // TODO 三角マークも消さないといけないのでは
731 // layout.removeView(target);
737 private void msgOkButtonOnClick(View v) {
738 FolderUtil util = FolderUtil.getInstance();
739 LabelIconView target = layout.getSelectedTarget();
740 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
742 if (status == ScreenStatus.AddNode) {
743 long id = target.getNodeId();
744 Node parent = dao.searchById(id);
745 if (parent != null) {
746 String text = msgEditText.getText().toString();
747 DirNode node = new DirNode(text, null);
748 util.addDirNode(parent, node);
750 layout.setCutTarget(null, false);
751 } else if (status == ScreenStatus.DeleteNode) {
752 long id = target.getNodeId();
753 Node node = dao.searchById(id);
755 util.deleteNode(node);
756 layout.removeView(target);
758 layout.setCutTarget(null, false);
759 } else if (status == ScreenStatus.RenameNode) {
760 long id = target.getNodeId();
761 Node node = dao.searchById(id);
763 String text = msgEditText.getText().toString();
765 dao.updateName(node, text);
767 layout.setCutTarget(null, false);
772 layout.clearTarget();
774 setStatus(ScreenStatus.Normal);
777 private void msgCancelOnClick(View v) {
780 setStatus(ScreenStatus.Normal);
783 private void closeIME(View v) {
784 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
785 imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
788 public void execute(long srcId, long dstId) {
792 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
801 Node src = dao.searchById(srcId);
803 if (srcId == dstId) {
806 dst = dao.searchById(dstId);
809 if (dstId == src.getParent()) {
813 if (!isFileNode(src) && !isMovable(srcId, dstId)) {
818 Node sp = dao.searchById(src.getParent());
823 if (src.getParent() == dst.getParent()) {
826 dp = dao.searchById(dst.getParent());
833 // sp.remove(src.getId());
834 SQLiteDatabase db = DatabaseHelper.getInstance()
835 .getSQLiteDatabase();
836 db.beginTransaction();
838 dao.removeChildrenIdNT(sp, src.getId());
839 if (dst instanceof DirNode) {
840 // dst.add(src.getId());
841 dao.updateParentNT(src, dst.getId());
842 dao.addChildrenIdNT(dst, src.getId());
843 } else if (dst instanceof FileNode) {
844 // dp.add(src.getId());
845 dao.updateParentNT(src, dp.getId());
846 dao.addChildrenIdNT(dp, src.getId());
849 db.setTransactionSuccessful();
858 private boolean isMovable(long srcId, long dstId) {
859 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
862 if (srcId == dstId) {
865 Node node = dao.searchById(dstId);
870 if (!(node instanceof DirNode)) {
873 dstId = node.getParent();
878 public void execute(long id) {
879 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
881 Node node = dao.searchById(id);
886 Status status = node.getStatus();
888 dao.updateStatus(node, status);
890 // removeAllNodeView();
894 public void executeView(long id) {
895 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
897 Node node = dao.searchById(id);
898 if (!isFileNode(node)) {
901 String guid = node.getGuid();
903 EvernoteIntentUtil util = EvernoteIntentUtil.getInstance();
904 util.viewNote(this, guid);
907 public void targetSelectedChanged(boolean status) {
911 public void removeAllNodeView() {
912 layout.removeAllViews();
915 private void setStatus() {
919 private void setStatus(ScreenStatus status) {
921 if (this.status != status) {
922 this.status = status;
926 int update = pref.getInt(Constant.PREF_UPDATE_DATA);
928 if (update == Constant.ON){
929 msgLayout.setVisibility(View.VISIBLE);
930 confirmMsg.setText(getString(R.string.mainUpdateMsg));
933 msgLayout.setVisibility(View.GONE);
935 msgEditText.setVisibility(View.GONE);
936 msgButtonLayout.setVisibility(View.GONE);
938 leftButton.setEnabled(false);
939 rightButton.setEnabled(false);
941 status = ScreenStatus.Normal;
945 if (status == ScreenStatus.Normal) {
946 msgLayout.setVisibility(View.GONE);
947 // mainMsgEditText.setText("");
949 boolean leftButtonFlag = true;
950 boolean rightButtonFlag = true;
951 // boolean addButtonFlag = true;
952 // boolean deleteButtonFlag = true;
955 leftButtonFlag = false;
958 // LabelIconView target = layout.getSelectedTarget();
959 // NodeDao dao = (NodeDao) NodeDao.getInstance();
962 // if (target != null) {
963 // id = target.getNodeId();
964 // node = dao.searchById(id);
966 // if (target == null || node == null || !(node instanceof
969 // addButtonFlag = false;
971 // if (target == null || (node != null && node instanceof
974 // deleteButtonFlag = false;
976 layout.setElabledTouchEvent(true);
978 leftButton.setEnabled(leftButtonFlag);
979 rightButton.setEnabled(rightButtonFlag);
980 // addButton.setEnabled(addButtonFlag);
981 // deleteButton.setEnabled(deleteButtonFlag);
982 } else if (status == ScreenStatus.AddNode) {
983 msgLayout.setVisibility(View.VISIBLE);
984 msgEditText.setVisibility(View.VISIBLE);
985 msgButtonLayout.setVisibility(View.VISIBLE);
986 confirmMsg.setText(getString(R.string.mainAddMsg));
987 msgEditText.setText("");
989 layout.setElabledTouchEvent(false);
991 leftButton.setEnabled(false);
992 rightButton.setEnabled(false);
993 } else if (status == ScreenStatus.DeleteNode) {
994 msgLayout.setVisibility(View.VISIBLE);
995 msgEditText.setVisibility(View.GONE);
996 msgButtonLayout.setVisibility(View.VISIBLE);
997 confirmMsg.setText(getString(R.string.mainDeleteMsg));
999 layout.setElabledTouchEvent(false);
1001 leftButton.setEnabled(false);
1002 rightButton.setEnabled(false);
1003 } else if (status == ScreenStatus.RenameNode) {
1004 msgLayout.setVisibility(View.VISIBLE);
1005 msgEditText.setVisibility(View.VISIBLE);
1006 msgButtonLayout.setVisibility(View.VISIBLE);
1007 confirmMsg.setText(getString(R.string.mainRenameMsg));
1009 layout.setElabledTouchEvent(false);
1011 leftButton.setEnabled(false);
1012 rightButton.setEnabled(false);
1014 } catch (Throwable e) {
1016 e.printStackTrace();