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.content.res.Resources;
12 import android.database.sqlite.SQLiteDatabase;
13 import android.graphics.Bitmap;
14 import android.graphics.BitmapFactory;
15 import android.graphics.PixelFormat;
16 import android.os.Bundle;
17 import android.text.Editable;
18 import android.text.TextWatcher;
19 import android.view.Gravity;
20 import android.view.Menu;
21 import android.view.MenuItem;
22 import android.view.View;
23 import android.view.View.OnClickListener;
24 import android.view.WindowManager;
25 import android.widget.Button;
26 import android.widget.EditText;
27 import android.widget.LinearLayout;
28 import android.widget.TextView;
30 import com.yuji.ef.common.CommonUtil;
31 import com.yuji.ef.common.Constant;
32 import com.yuji.ef.dao.DatabaseHelper;
33 import com.yuji.ef.dao.DirNode;
34 import com.yuji.ef.dao.FileNode;
35 import com.yuji.ef.dao.LockDao;
36 import com.yuji.ef.dao.Node;
37 import com.yuji.ef.dao.Node.Status;
38 import com.yuji.ef.dao.NodeComparator;
39 import com.yuji.ef.dao.NodeDao;
40 import com.yuji.ef.dao.RootNode;
41 import com.yuji.ef.utility.BaseActivity;
42 import com.yuji.ef.utility.EvernoteIntentUtil;
43 import com.yuji.ef.utility.FolderUtil;
45 public class EverFolderActivity extends BaseActivity {
46 private enum ScreenStatus {
47 Normal, AddNode, RenameNode
50 private LinearLayout msgLayout;
51 private LinearLayout msgButtonLayout;
52 private Button msgOkButton;
53 private Button msgCancelButton;
54 private EditText mainMsgEditText;
56 private IconFrameLayout layout;
57 private TextView confirmMsg;
58 private IconScrollView scrollView;
59 private Button leftButton;
60 private Button rightButton;
61 // private Button addButton;
62 // private Button deleteButton;
64 private ScreenStatus status;
65 private NodeComparator nodeComparator = new NodeComparator();
67 private Node top = null;
68 private int indent = 0;
70 private boolean lock = false;
71 private boolean isInit = true;
73 private BroadcastReceiver receiver = new BroadcastReceiver() {
75 public void onReceive(Context context, Intent intent) {
76 String action = intent.getAction();
78 if (action.compareTo(Constant.ACTION_UPDATE) == 0) {
79 LockDao lockDao = (LockDao) LockDao.getInstance();
80 lock = lockDao.lock(EverFolderActivity.this,
81 Constant.LOCK_UPDATE_NOTE);
91 public void onCreate(Bundle savedInstanceState) {
92 super.onCreate(savedInstanceState);
93 setContentView(R.layout.main);
96 IntentFilter intentFilter = new IntentFilter();
97 intentFilter.addAction(Constant.ACTION_UPDATE);
98 registerReceiver(receiver, intentFilter);
100 scrollView = (IconScrollView) findViewById(R.id.scrollView);
101 layout = (IconFrameLayout) findViewById(R.id.frameLayout);
102 layout.setActivity(this);
103 layout.setScrollView(scrollView);
105 leftButton = (Button) findViewById(R.id.leftButton);
106 rightButton = (Button) findViewById(R.id.rightButton);
107 // addButton = (Button) findViewById(R.id.addButton);
108 // deleteButton = (Button) findViewById(R.id.deleteButton);
110 msgLayout = (LinearLayout) findViewById(R.id.mainMsgLayout);
111 confirmMsg = (TextView) findViewById(R.id.mainConfirmMsg);
112 mainMsgEditText = (EditText) findViewById(R.id.mainMsgEditText);
113 msgButtonLayout = (LinearLayout) findViewById(R.id.mainMsgButtonLayout);
114 msgOkButton = (Button) findViewById(R.id.mainMsgOkButton);
115 msgCancelButton = (Button) findViewById(R.id.mainMsgCancelButton);
117 leftButton.setOnClickListener(new OnClickListener() {
119 public void onClick(View v) {
123 rightButton.setOnClickListener(new OnClickListener() {
125 public void onClick(View v) {
126 rightButtonOnClick();
129 // addButton.setOnClickListener(new OnClickListener() {
131 // public void onClick(View v) {
132 // addButtonOnClick();
135 // deleteButton.setOnClickListener(new OnClickListener() {
137 // public void onClick(View v) {
138 // deleteButtonOnClick();
142 mainMsgEditText.addTextChangedListener(new TextWatcher() {
143 public void afterTextChanged(Editable s) {
144 String text = s.toString();
145 msgOkButton.setEnabled(text.length() > 0);
148 public void beforeTextChanged(CharSequence s, int start,
149 int count, int after) {
153 public void onTextChanged(CharSequence s, int start,
154 int before, int count) {
159 msgOkButton.setOnClickListener(new OnClickListener() {
161 public void onClick(View v) {
162 msgOkButtonOnClick();
165 msgCancelButton.setOnClickListener(new OnClickListener() {
167 public void onClick(View v) {
171 } catch (Exception e) {
178 public boolean onCreateOptionsMenu(Menu menu) {
179 boolean ret = super.onCreateOptionsMenu(menu);
182 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "カット");
183 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "ペースト");
184 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "追加");
185 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "削除");
186 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "リネーム");
187 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "設定");
192 public boolean onMenuOpened(int featureId, Menu menu) {
193 boolean ret = super.onMenuOpened(featureId, menu);
197 boolean cutButtonFlag = false;
198 boolean pastButtonFlag = false;
199 boolean addButtonFlag = false;
200 boolean deleteButtonFlag = false;
201 boolean renameButtonFlag = false;
202 boolean confButtonFlag = true;
204 LabelIconView target = layout.getSelectedTarget();
205 NodeDao dao = (NodeDao) NodeDao.getInstance();
208 if (target != null) {
209 id = target.getNodeId();
210 node = dao.searchById(id);
213 if (isDirNode(target, node, false)) {
214 cutButtonFlag = true;
216 if (isDirNode(target, node, true) && isCut()) {
217 pastButtonFlag = true;
219 if (isDirNode(target, node, true)) {
220 addButtonFlag = true;
222 if (isDirNode(target, node, false) && !isNoteBook(node)
223 && CommonUtil.isNull(node.getChildrenString())) {
224 deleteButtonFlag = true;
226 if (isDirNode(target, node, false) && !isNoteBook(node)) {
227 renameButtonFlag = true;
231 item = menu.getItem(index++);
232 item.setVisible(cutButtonFlag);
233 item = menu.getItem(index++);
234 item.setVisible(pastButtonFlag);
235 item = menu.getItem(index++);
236 item.setVisible(addButtonFlag);
237 item = menu.getItem(index++);
238 item.setVisible(deleteButtonFlag);
239 item = menu.getItem(index++);
240 item.setVisible(renameButtonFlag);
241 item = menu.getItem(index++);
242 item.setVisible(confButtonFlag);
247 private boolean isDirNode(LabelIconView target, Node node,
248 boolean containRoot) {
249 if (target == null) {
255 if (!containRoot && (node instanceof RootNode)) {
258 if (!(node instanceof DirNode)) {
264 private boolean isNoteBook(Node node) {
268 if (CommonUtil.isNull(node.getGuid())) {
274 private boolean isCut() {
275 LabelIconView srcTarget = layout.getCutTarget();
276 if (srcTarget == null) {
283 public boolean onOptionsItemSelected(MenuItem item) {
286 switch (item.getItemId()) {
305 intent = new Intent(this, (Class<?>) SettingActivity.class);
306 startActivityForResult(intent, 0);
311 } catch (Exception e) {
314 return super.onOptionsItemSelected(item);
317 private void dummy() {
318 NodeDao dao = (NodeDao) NodeDao.getInstance();
319 List<Node> list = dao.search();
320 for (Node node : list) {
321 System.out.println(node.toString());
325 private void dummy2() {
326 LockDao dao = (LockDao) LockDao.getInstance();
330 b = dao.lock(this, "key");
331 b = dao.lock(this, "key");
332 dao.unlock(new Object(), "key");
333 b = dao.lock(this, "key");
334 dao.unlock(this, "key");
335 b = dao.lock(this, "key");
336 b = dao.lock(this, "key");
337 b = dao.lock(this, "key");
339 } catch (Exception e) {
345 private void selectMenuAdd() {
346 setStatus(ScreenStatus.AddNode);
349 private void selectMenuDelete() {
350 FolderUtil util = FolderUtil.getInstance();
351 LabelIconView target = layout.getSelectedTarget();
352 long id = target.getNodeId();
353 NodeDao dao = (NodeDao) NodeDao.getInstance();
354 Node node = dao.searchById(id);
356 util.deleteNode(node);
357 // TODO 三角マークも消さないといけないのでは
358 layout.removeView(target);
364 private void selectMenuRename() {
365 LabelIconView target = layout.getSelectedTarget();
366 if (target == null) {
370 long id = target.getNodeId();
371 NodeDao dao = (NodeDao) NodeDao.getInstance();
372 Node node = dao.searchById(id);
374 String text = node.getName();
375 mainMsgEditText.setText(text);
376 setStatus(ScreenStatus.RenameNode);
380 private void selectMenuCut() {
381 LabelIconView target = layout.getSelectedTarget();
382 if (target == null) {
386 layout.setCutTarget(target);
390 private void selectMenuPast() {
391 LabelIconView srcTarget = layout.getCutTarget();
392 if (srcTarget == null) {
396 LabelIconView dstTarget = layout.getSelectedTarget();
397 if (dstTarget == null) {
401 layout.setCutTarget(null);
403 long srcId = srcTarget.getNodeId();
404 long dstId = dstTarget.getNodeId();
405 execute(srcId, dstId);
408 private void updateList() {
409 NodeDao dao = (NodeDao) NodeDao.getInstance();
410 top = dao.searchRoot();
414 layout.removeAllViews();
419 private void updateList(Node parent) {
422 // List<Node> list = parent.getChildren();
423 // for (Node node : list){
424 // updateList(node, x);
426 updateList(parent, 0);
427 layout.setMinimumHeight(viewY);
431 private void updateList(Node node, int depth) {
434 int x = N * (depth - indent) + 50;
436 if (depth - indent >= 0
437 && !(depth - indent == 0 && node instanceof FileNode)) {
438 LabelIconView view = new LabelIconView(this);
441 Resources r = getResources();
443 int id = node.getStatusIconId();
445 bmp1 = BitmapFactory.decodeResource(r, node.getStatusIconId());
447 Bitmap bmp2 = BitmapFactory.decodeResource(r, node.getIconId());
448 createIconImageView(view, bmp1, bmp2, node.getName(), x, viewY);
449 // LabelIconView s = view.getStatusImageView();
451 // s.setNodeId(node.getId());
453 view.setNodeId(node.getId());
457 if (node.getStatus() != Node.Status.OPEN) {
460 List<Long> idList = node.getChildren();
461 if (idList == null) {
465 List<Node> list = new ArrayList<Node>();
466 NodeDao dao = (NodeDao) NodeDao.getInstance();
467 for (Long id : idList) {
468 Node n = dao.searchById(id);
471 Collections.sort(list, nodeComparator);
472 for (Node n : list) {
473 updateList(n, depth + 1);
477 private void createIconImageView(LabelIconView v, Bitmap bmp1, Bitmap bmp2,
478 String text, int x, int y) {
479 v.init(x, y, bmp1, bmp2, text);
481 android.view.WindowManager.LayoutParams params = new WindowManager.LayoutParams();
482 params.gravity = Gravity.TOP | Gravity.LEFT;
483 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
484 params.width = WindowManager.LayoutParams.WRAP_CONTENT;
485 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
486 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
487 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
488 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
489 params.format = PixelFormat.TRANSLUCENT;
490 params.windowAnimations = 0;
493 v.setLayoutParams(params);
495 // LabelIconView siv = v.getStatusImageView();
496 // if (siv != null) {
497 // layout.addView(siv, false);
501 v.layout(x, y, x + v.getWidth(), y + v.getHeight());
505 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
512 protected void onStart() {
515 LockDao lockDao = (LockDao) LockDao.getInstance();
516 lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
519 status = ScreenStatus.Normal;
524 layout.removeAllViews();
534 protected void onPause() {
535 // ロック未取得でも解除する(ゴミ掃除)
536 LockDao lockDao = (LockDao) LockDao.getInstance();
537 lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
543 private void leftButtonOnClick() {
544 moveButtonOnClick(-1);
548 private void rightButtonOnClick() {
549 moveButtonOnClick(1);
553 private void moveButtonOnClick(int dx) {
570 // private void addButtonOnClick() {
571 // setStatus(ScreenStatus.AddNode);
574 // private void deleteButtonOnClick() {
575 // FolderUtil util = FolderUtil.getInstance();
576 // LabelIconView target = layout.getSelectedTarget();
577 // long id = target.getNodeId();
578 // NodeDao dao = (NodeDao) NodeDao.getInstance();
579 // Node node = dao.searchById(id);
580 // if (node != null) {
581 // util.deleteNode(node);
582 // // TODO 三角マークも消さないといけないのでは
583 // layout.removeView(target);
589 private void msgOkButtonOnClick() {
590 FolderUtil util = FolderUtil.getInstance();
591 LabelIconView target = layout.getSelectedTarget();
592 NodeDao dao = (NodeDao) NodeDao.getInstance();
594 if (status == ScreenStatus.AddNode) {
595 long id = target.getNodeId();
596 Node parent = dao.searchById(id);
597 if (parent != null) {
598 String text = mainMsgEditText.getText().toString();
599 DirNode node = new DirNode(text, null);
600 util.addDirNode(parent, node);
602 setStatus(ScreenStatus.Normal);
604 } else if (status == ScreenStatus.RenameNode) {
605 long id = target.getNodeId();
606 Node node = dao.searchById(id);
608 String text = mainMsgEditText.getText().toString();
610 dao.updateName(node, text);
612 setStatus(ScreenStatus.Normal);
617 private void msgCancelOnClick() {
618 setStatus(ScreenStatus.Normal);
621 public void execute(long srcId, long dstId) {
625 NodeDao dao = (NodeDao) NodeDao.getInstance();
634 if (!isMovable(srcId, dstId)) {
638 Node src = dao.searchById(srcId);
640 if (srcId == dstId) {
643 dst = dao.searchById(dstId);
646 if (dstId == src.getParent()) {
651 Node sp = dao.searchById(src.getParent());
656 if (src.getParent() == dst.getParent()) {
659 dp = dao.searchById(dst.getParent());
666 // sp.remove(src.getId());
667 SQLiteDatabase db = DatabaseHelper.getInstance()
668 .getSQLiteDatabase();
669 db.beginTransaction();
671 dao.remoteChildrenIdNT(sp, src.getId());
672 if (dst instanceof DirNode) {
673 // dst.add(src.getId());
674 dao.updateParentNT(src, dst.getId());
675 dao.addChildrenIdNT(dst, src.getId());
676 } else if (dst instanceof FileNode) {
677 // dp.add(src.getId());
678 dao.updateParentNT(src, dst.getId());
679 dao.addChildrenIdNT(dp, src.getId());
682 db.setTransactionSuccessful();
691 private boolean isMovable(long srcId, long dstId) {
692 NodeDao dao = (NodeDao) NodeDao.getInstance();
695 if (srcId == dstId) {
698 Node node = dao.searchById(dstId);
703 if (!(node instanceof DirNode)) {
706 dstId = node.getParent();
711 public void execute(long id) {
712 NodeDao dao = (NodeDao) NodeDao.getInstance();
714 Node node = dao.searchById(id);
719 Status status = node.getStatus();
721 dao.updateStatus(node, status);
727 public void executeView(long id) {
728 NodeDao dao = (NodeDao) NodeDao.getInstance();
730 Node node = dao.searchById(id);
731 String guid = node.getGuid();
733 EvernoteIntentUtil util = EvernoteIntentUtil.getInstance();
734 util.viewNote(this, guid);
737 public void targetSelectedChanged(boolean status) {
741 public void removeAllNodeView() {
742 layout.removeAllViews();
745 private void setStatus() {
749 private void setStatus(ScreenStatus status) {
751 if (this.status != status) {
752 this.status = status;
756 msgLayout.setVisibility(View.VISIBLE);
757 confirmMsg.setText("データ更新中"); // TODO
758 mainMsgEditText.setVisibility(View.GONE);
759 msgButtonLayout.setVisibility(View.GONE);
760 status = ScreenStatus.Normal;
764 if (status == ScreenStatus.Normal) {
765 msgLayout.setVisibility(View.GONE);
766 // mainMsgEditText.setText("");
768 boolean leftButtonFlag = true;
769 boolean rightButtonFlag = true;
770 // boolean addButtonFlag = true;
771 // boolean deleteButtonFlag = true;
774 leftButtonFlag = false;
777 // LabelIconView target = layout.getSelectedTarget();
778 // NodeDao dao = (NodeDao) NodeDao.getInstance();
781 // if (target != null) {
782 // id = target.getNodeId();
783 // node = dao.searchById(id);
785 // if (target == null || node == null || !(node instanceof
788 // addButtonFlag = false;
790 // if (target == null || (node != null && node instanceof
793 // deleteButtonFlag = false;
796 leftButton.setEnabled(leftButtonFlag);
797 rightButton.setEnabled(rightButtonFlag);
798 // addButton.setEnabled(addButtonFlag);
799 // deleteButton.setEnabled(deleteButtonFlag);
800 } else if (status == ScreenStatus.AddNode) {
801 msgLayout.setVisibility(View.VISIBLE);
802 mainMsgEditText.setVisibility(View.VISIBLE);
803 msgButtonLayout.setVisibility(View.VISIBLE);
804 mainMsgEditText.setText("");
805 } else if (status == ScreenStatus.RenameNode) {
806 msgLayout.setVisibility(View.VISIBLE);
807 mainMsgEditText.setVisibility(View.VISIBLE);
808 msgButtonLayout.setVisibility(View.VISIBLE);
809 String text = mainMsgEditText.getText().toString();
811 } catch (Throwable e) {