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.NodeCacheDao;
39 import com.yuji.ef.dao.NodeComparator;
40 import com.yuji.ef.dao.NodeDao;
41 import com.yuji.ef.dao.NodeDaoImpl;
42 import com.yuji.ef.dao.RootNode;
43 import com.yuji.ef.utility.BaseActivity;
44 import com.yuji.ef.utility.BitmapCacheFactory;
45 import com.yuji.ef.utility.EvernoteIntentUtil;
46 import com.yuji.ef.utility.FolderUtil;
47 import com.yuji.ef.utility.ScaleUtil;
49 public class EverFolderActivity extends BaseActivity {
50 private enum ScreenStatus {
51 Normal, AddNode, DeleteNode, RenameNode
54 private LinearLayout msgLayout;
55 private LinearLayout msgButtonLayout;
56 private Button msgOkButton;
57 private Button msgCancelButton;
58 private EditText msgEditText;
60 private IconFrameLayout layout;
61 private TextView confirmMsg;
62 private IconScrollView scrollView;
63 private LinearLayout buttonLayout;
64 private Button leftButton;
65 private Button rightButton;
66 // private Button addButton;
67 // private Button deleteButton;
69 private ScreenStatus status;
70 private NodeComparator nodeComparator = new NodeComparator();
71 private BitmapCacheFactory bitmapFactory = BitmapCacheFactory.getInstance();
72 private Node top = null;
73 private int indent = 0;
74 private int bmpPaddingLeft;
77 private boolean lock = false;
78 private boolean isInit = true;
80 private BroadcastReceiver receiver = new BroadcastReceiver() {
82 public void onReceive(Context context, Intent intent) {
83 String action = intent.getAction();
85 if (action.compareTo(Constant.ACTION_UPDATE) == 0) {
86 LockDao lockDao = (LockDao) LockDao.getInstance();
87 lock = lockDao.lock(EverFolderActivity.this,
88 Constant.LOCK_UPDATE_NOTE);
98 public void onCreate(Bundle savedInstanceState) {
99 super.onCreate(savedInstanceState);
100 setContentView(R.layout.main);
103 IntentFilter intentFilter = new IntentFilter();
104 intentFilter.addAction(Constant.ACTION_UPDATE);
105 registerReceiver(receiver, intentFilter);
107 scrollView = (IconScrollView) findViewById(R.id.scrollView);
108 layout = (IconFrameLayout) findViewById(R.id.frameLayout);
109 layout.setActivity(this);
110 layout.setScrollView(scrollView);
112 buttonLayout = (LinearLayout) findViewById(R.id.mainButtonLayout);
113 leftButton = (Button) findViewById(R.id.leftButton);
114 rightButton = (Button) findViewById(R.id.rightButton);
115 // addButton = (Button) findViewById(R.id.addButton);
116 // deleteButton = (Button) findViewById(R.id.deleteButton);
118 msgLayout = (LinearLayout) findViewById(R.id.mainMsgLayout);
119 confirmMsg = (TextView) findViewById(R.id.mainConfirmMsg);
120 msgEditText = (EditText) findViewById(R.id.mainMsgEditText);
121 msgButtonLayout = (LinearLayout) findViewById(R.id.mainMsgButtonLayout);
122 msgOkButton = (Button) findViewById(R.id.mainMsgOkButton);
123 msgCancelButton = (Button) findViewById(R.id.mainMsgCancelButton);
125 leftButton.setOnClickListener(new OnClickListener() {
127 public void onClick(View v) {
131 rightButton.setOnClickListener(new OnClickListener() {
133 public void onClick(View v) {
134 rightButtonOnClick();
137 // addButton.setOnClickListener(new OnClickListener() {
139 // public void onClick(View v) {
140 // addButtonOnClick();
143 // deleteButton.setOnClickListener(new OnClickListener() {
145 // public void onClick(View v) {
146 // deleteButtonOnClick();
150 msgEditText.addTextChangedListener(new TextWatcher() {
151 public void afterTextChanged(Editable s) {
152 String text = s.toString();
153 msgOkButton.setEnabled(text.length() > 0);
156 public void beforeTextChanged(CharSequence s, int start,
157 int count, int after) {
161 public void onTextChanged(CharSequence s, int start,
162 int before, int count) {
167 msgOkButton.setOnClickListener(new OnClickListener() {
169 public void onClick(View v) {
170 msgOkButtonOnClick();
173 msgCancelButton.setOnClickListener(new OnClickListener() {
175 public void onClick(View v) {
180 ScaleUtil scaleUtil = ScaleUtil.getInstance();
181 scaleUtil.init(this);
183 bitmapFactory.init(this);
184 Node node = new DirNode(null, null);
186 bmp = bitmapFactory.get(node.getStatusIconId());
187 bmpPaddingLeft = bmp.getWidth();
188 bmp = bitmapFactory.get(node.getIconId());
189 bmpWidth = bmp.getWidth();
191 float fSize = 48 * (1 / 2.0f);
192 leftButton.setTextSize(fSize);
193 rightButton.setTextSize(fSize);
194 } catch (Exception e) {
201 public boolean onCreateOptionsMenu(Menu menu) {
202 boolean ret = super.onCreateOptionsMenu(menu);
205 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "カット");
206 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "ペースト");
207 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "追加");
208 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "削除");
209 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "リネーム");
210 menu.add(Menu.NONE, Menu.FIRST + index++, Menu.NONE, "設定");
215 public boolean onMenuOpened(int featureId, Menu menu) {
216 boolean ret = super.onMenuOpened(featureId, menu);
220 boolean cutButtonFlag = false;
221 boolean pastButtonFlag = false;
222 boolean addButtonFlag = false;
223 boolean deleteButtonFlag = false;
224 boolean renameButtonFlag = false;
225 boolean confButtonFlag = true;
227 if (status == ScreenStatus.Normal) {
228 LabelIconView target = layout.getSelectedTarget();
229 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
232 if (target != null) {
233 id = target.getNodeId();
234 node = dao.searchById(id);
237 if (isDirNode(target, node, false) || isFileNode(node)) {
238 cutButtonFlag = true;
240 if (isDirNode(target, node, true) && isCut()) {
241 pastButtonFlag = true;
243 if (isDirNode(target, node, true)) {
244 addButtonFlag = true;
246 if (isDirNode(target, node, false) && !isNoteBook(node)
247 && CommonUtil.isNull(node.getChildrenString())) {
248 deleteButtonFlag = true;
250 if (isDirNode(target, node, false) && !isNoteBook(node)) {
251 renameButtonFlag = true;
256 item = menu.getItem(index++);
257 item.setVisible(cutButtonFlag);
258 item = menu.getItem(index++);
259 item.setVisible(pastButtonFlag);
260 item = menu.getItem(index++);
261 item.setVisible(addButtonFlag);
262 item = menu.getItem(index++);
263 item.setVisible(deleteButtonFlag);
264 item = menu.getItem(index++);
265 item.setVisible(renameButtonFlag);
266 item = menu.getItem(index++);
267 item.setVisible(confButtonFlag);
272 private boolean isFileNode(Node node) {
273 if (node == null || !(node instanceof FileNode)) {
279 private boolean isDirNode(LabelIconView target, Node node,
280 boolean containRoot) {
281 if (target == null) {
287 if (!containRoot && (node instanceof RootNode)) {
290 if (!(node instanceof DirNode)) {
296 private boolean isNoteBook(Node node) {
300 if (CommonUtil.isNull(node.getGuid())) {
306 private boolean isCut() {
307 LabelIconView srcTarget = layout.getCutTarget();
308 if (srcTarget == null) {
315 public boolean onOptionsItemSelected(MenuItem item) {
318 switch (item.getItemId()) {
337 intent = new Intent(this, (Class<?>) SettingActivity.class);
338 startActivityForResult(intent, 0);
343 } catch (Exception e) {
346 return super.onOptionsItemSelected(item);
349 private void dummy() {
350 NodeDaoImpl dao = (NodeDaoImpl) NodeCacheDao.getInstance();
351 List<Node> list = dao.search();
352 for (Node node : list) {
353 System.out.println(node.toString());
357 private void dummy2() {
358 LockDao dao = (LockDao) LockDao.getInstance();
362 b = dao.lock(this, "key");
363 b = dao.lock(this, "key");
364 dao.unlock(new Object(), "key");
365 b = dao.lock(this, "key");
366 dao.unlock(this, "key");
367 b = dao.lock(this, "key");
368 b = dao.lock(this, "key");
369 b = dao.lock(this, "key");
371 } catch (Exception e) {
377 private void selectMenuAdd() {
378 setStatus(ScreenStatus.AddNode);
381 private void selectMenuDelete() {
382 setStatus(ScreenStatus.DeleteNode);
385 private void selectMenuRename() {
386 LabelIconView target = layout.getSelectedTarget();
387 if (target == null) {
391 long id = target.getNodeId();
392 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
393 Node node = dao.searchById(id);
395 String text = node.getName();
396 msgEditText.setText(text);
397 setStatus(ScreenStatus.RenameNode);
401 private void selectMenuCut() {
402 LabelIconView target = layout.getSelectedTarget();
403 if (target == null) {
407 layout.setCutTarget(target);
411 private void selectMenuPast() {
412 LabelIconView srcTarget = layout.getCutTarget();
413 if (srcTarget == null) {
417 LabelIconView dstTarget = layout.getSelectedTarget();
418 if (dstTarget == null) {
422 layout.setCutTarget(null);
424 long srcId = srcTarget.getNodeId();
425 long dstId = dstTarget.getNodeId();
426 execute(srcId, dstId);
429 private void updateList() {
430 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
431 top = dao.searchRoot();
435 layout.removeAllViews();
440 private void updateList(Node parent) {
443 // List<Node> list = parent.getChildren();
444 // for (Node node : list){
445 // updateList(node, x);
447 updateList(parent, 0);
448 layout.setMinimumHeight(viewY);
452 private void updateList(Node node, int depth) {
453 int N = (int) (bmpWidth * 0.6);
454 int M = (int) (bmpWidth * 1.2);
455 int x = N * (depth - indent);
457 if (depth - indent >= 0
458 && !(depth - indent == 0 && node instanceof FileNode)) {
459 LabelIconView view = new LabelIconView(this);
463 int id = node.getStatusIconId();
466 bmp1 = bitmapFactory.get(node.getStatusIconId());
471 Bitmap bmp2 = bitmapFactory.get(node.getIconId());
472 createIconImageView(view, bmp1, bmp2, node.getName(), x, viewY);
473 // LabelIconView s = view.getStatusImageView();
475 // s.setNodeId(node.getId());
477 view.setNodeId(node.getId());
481 if (node.getStatus() != Node.Status.OPEN) {
484 List<Long> idList = node.getChildren();
485 if (idList == null) {
489 List<Node> list = new ArrayList<Node>();
490 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
491 for (Long id : idList) {
492 Node n = dao.searchById(id);
495 Collections.sort(list, nodeComparator);
496 for (Node n : list) {
497 updateList(n, depth + 1);
501 private void createIconImageView(LabelIconView v, Bitmap bmp1, Bitmap bmp2,
502 String text, int x, int y) {
503 v.init(x, y, bmp1, bmp2, text);
505 android.view.WindowManager.LayoutParams params = new WindowManager.LayoutParams();
506 params.gravity = Gravity.TOP | Gravity.LEFT;
507 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
508 params.width = WindowManager.LayoutParams.WRAP_CONTENT;
509 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
510 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
511 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
512 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
513 params.format = PixelFormat.TRANSLUCENT;
514 params.windowAnimations = 0;
517 v.setLayoutParams(params);
519 // LabelIconView siv = v.getStatusImageView();
520 // if (siv != null) {
521 // layout.addView(siv, false);
525 v.layout(x, y, x + v.getWidth(), y + v.getHeight());
529 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
532 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
540 protected void onStart() {
545 protected void onResume() {
548 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
551 Intent intent = new Intent(this,
552 (Class<?>) SettingActivity.class);
553 startActivityForResult(intent, 0);
562 LockDao lockDao = (LockDao) LockDao.getInstance();
563 lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
566 status = ScreenStatus.Normal;
571 layout.removeAllViews();
581 protected void onPause() {
582 // ロック未取得でも解除する(ゴミ掃除)
583 LockDao lockDao = (LockDao) LockDao.getInstance();
584 lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
590 private void leftButtonOnClick() {
591 moveButtonOnClick(-1);
595 private void rightButtonOnClick() {
596 moveButtonOnClick(1);
600 private void moveButtonOnClick(int dx) {
617 // private void addButtonOnClick() {
618 // setStatus(ScreenStatus.AddNode);
621 // private void deleteButtonOnClick() {
622 // FolderUtil util = FolderUtil.getInstance();
623 // LabelIconView target = layout.getSelectedTarget();
624 // long id = target.getNodeId();
625 // NodeDao dao = (NodeDao) NodeDao.getInstance();
626 // Node node = dao.searchById(id);
627 // if (node != null) {
628 // util.deleteNode(node);
629 // // TODO 三角マークも消さないといけないのでは
630 // layout.removeView(target);
636 private void msgOkButtonOnClick() {
637 FolderUtil util = FolderUtil.getInstance();
638 LabelIconView target = layout.getSelectedTarget();
639 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
641 if (status == ScreenStatus.AddNode) {
642 long id = target.getNodeId();
643 Node parent = dao.searchById(id);
644 if (parent != null) {
645 String text = msgEditText.getText().toString();
646 DirNode node = new DirNode(text, null);
647 util.addDirNode(parent, node);
649 layout.setCutTarget(null, false);
651 else if (status == ScreenStatus.DeleteNode) {
652 long id = target.getNodeId();
653 Node node = dao.searchById(id);
655 util.deleteNode(node);
656 layout.removeView(target);
658 layout.setCutTarget(null, false);
659 } else if (status == ScreenStatus.RenameNode) {
660 long id = target.getNodeId();
661 Node node = dao.searchById(id);
663 String text = msgEditText.getText().toString();
665 dao.updateName(node, text);
667 layout.setCutTarget(null, false);
669 layout.clearTarget();
671 setStatus(ScreenStatus.Normal);
674 private void msgCancelOnClick() {
675 setStatus(ScreenStatus.Normal);
678 public void execute(long srcId, long dstId) {
682 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
691 Node src = dao.searchById(srcId);
693 if (srcId == dstId) {
696 dst = dao.searchById(dstId);
699 if (dstId == src.getParent()) {
703 if (!isFileNode(src) && !isMovable(srcId, dstId)) {
708 Node sp = dao.searchById(src.getParent());
713 if (src.getParent() == dst.getParent()) {
716 dp = dao.searchById(dst.getParent());
723 // sp.remove(src.getId());
724 SQLiteDatabase db = DatabaseHelper.getInstance()
725 .getSQLiteDatabase();
726 db.beginTransaction();
728 dao.removeChildrenIdNT(sp, src.getId());
729 if (dst instanceof DirNode) {
730 // dst.add(src.getId());
731 dao.updateParentNT(src, dst.getId());
732 dao.addChildrenIdNT(dst, src.getId());
733 } else if (dst instanceof FileNode) {
734 // dp.add(src.getId());
735 dao.updateParentNT(src, dp.getId());
736 dao.addChildrenIdNT(dp, src.getId());
739 db.setTransactionSuccessful();
748 private boolean isMovable(long srcId, long dstId) {
749 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
752 if (srcId == dstId) {
755 Node node = dao.searchById(dstId);
760 if (!(node instanceof DirNode)) {
763 dstId = node.getParent();
768 public void execute(long id) {
769 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
771 Node node = dao.searchById(id);
776 Status status = node.getStatus();
778 dao.updateStatus(node, status);
780 // removeAllNodeView();
784 public void executeView(long id) {
785 NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
787 Node node = dao.searchById(id);
788 if (!isFileNode(node)) {
791 String guid = node.getGuid();
793 EvernoteIntentUtil util = EvernoteIntentUtil.getInstance();
794 util.viewNote(this, guid);
797 public void targetSelectedChanged(boolean status) {
801 public void removeAllNodeView() {
802 layout.removeAllViews();
805 private void setStatus() {
809 private void setStatus(ScreenStatus status) {
811 if (this.status != status) {
812 this.status = status;
816 msgLayout.setVisibility(View.VISIBLE);
817 confirmMsg.setText(getString(R.string.mainUpdateMsg));
818 msgEditText.setVisibility(View.GONE);
819 msgButtonLayout.setVisibility(View.GONE);
820 status = ScreenStatus.Normal;
824 if (status == ScreenStatus.Normal) {
825 msgLayout.setVisibility(View.GONE);
826 // mainMsgEditText.setText("");
828 boolean leftButtonFlag = true;
829 boolean rightButtonFlag = true;
830 // boolean addButtonFlag = true;
831 // boolean deleteButtonFlag = true;
834 leftButtonFlag = false;
837 // LabelIconView target = layout.getSelectedTarget();
838 // NodeDao dao = (NodeDao) NodeDao.getInstance();
841 // if (target != null) {
842 // id = target.getNodeId();
843 // node = dao.searchById(id);
845 // if (target == null || node == null || !(node instanceof
848 // addButtonFlag = false;
850 // if (target == null || (node != null && node instanceof
853 // deleteButtonFlag = false;
855 layout.setElabledTouchEvent(true);
857 leftButton.setEnabled(leftButtonFlag);
858 rightButton.setEnabled(rightButtonFlag);
859 // addButton.setEnabled(addButtonFlag);
860 // deleteButton.setEnabled(deleteButtonFlag);
861 } else if (status == ScreenStatus.AddNode) {
862 msgLayout.setVisibility(View.VISIBLE);
863 msgEditText.setVisibility(View.VISIBLE);
864 msgButtonLayout.setVisibility(View.VISIBLE);
865 confirmMsg.setText(getString(R.string.mainAddMsg));
866 msgEditText.setText("");
868 layout.setElabledTouchEvent(false);
870 leftButton.setEnabled(false);
871 rightButton.setEnabled(false);
872 } else if (status == ScreenStatus.DeleteNode) {
873 msgLayout.setVisibility(View.VISIBLE);
874 msgEditText.setVisibility(View.GONE);
875 msgButtonLayout.setVisibility(View.VISIBLE);
876 confirmMsg.setText(getString(R.string.mainDeleteMsg));
878 layout.setElabledTouchEvent(false);
880 leftButton.setEnabled(false);
881 rightButton.setEnabled(false);
882 } else if (status == ScreenStatus.RenameNode) {
883 msgLayout.setVisibility(View.VISIBLE);
884 msgEditText.setVisibility(View.VISIBLE);
885 msgButtonLayout.setVisibility(View.VISIBLE);
886 confirmMsg.setText(getString(R.string.mainRenameMsg));
888 layout.setElabledTouchEvent(false);
890 leftButton.setEnabled(false);
891 rightButton.setEnabled(false);
893 } catch (Throwable e) {