Add context menu (long press) on items
Ben Komalo [Thu, 23 Dec 2010 19:32:00 +0000 (14:32 -0500)]
in my tag list so users can delete them.

Change-Id: I9e2b565511f6f5c2d899db1c303c930ee9852819

res/menu/my_tag_list_context_menu.xml [new file with mode: 0644]
res/values/strings.xml
src/com/android/apps/tag/MyTagList.java
src/com/android/apps/tag/provider/TagProvider.java

diff --git a/res/menu/my_tag_list_context_menu.xml b/res/menu/my_tag_list_context_menu.xml
new file mode 100644 (file)
index 0000000..f52abcc
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:id="@+id/set_as_active"
+        android:title="@string/menu_set_as_active"
+    />
+
+    <item android:id="@+id/edit"
+        android:title="@string/menu_edit"
+    />
+
+    <item android:id="@+id/delete"
+        android:title="@string/menu_delete"
+    />
+
+</menu>
+
+
index f3cc98d..47037d1 100644 (file)
@@ -182,4 +182,14 @@ Networks).</string>
     <!-- Header for list of tags that can be set as My tag. [CHAR LIMIT=50] -->
     <string name="manage_my_tags">Manage my tags</string>
 
+    <!-- Menu item indicating that the user wants to delete a tag. [CHAR LIMIT=50] -->
+    <string name="menu_delete">Delete tag</string>
+
+    <!-- Menu item indicating that the user wants to edit a tag. [CHAR LIMIT=50] -->
+    <string name="menu_edit">Edit tag</string>
+
+    <!-- Menu item indicating that the user wants to set a tag
+         as the active tag to share as the device's tag. [CHAR LIMIT=50] -->
+    <string name="menu_set_as_active">Set as active tag</string>
+
 </resources>
index 3728b53..8762afb 100644 (file)
@@ -40,10 +40,13 @@ import android.util.Log;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.CheckBox;
 import android.widget.CursorAdapter;
@@ -82,6 +85,7 @@ public class MyTagList extends Activity implements OnItemClickListener, View.OnC
 
     private WeakReference<SelectActiveTagDialog> mSelectActiveTagDialog;
     private long mTagIdInEdit = -1;
+    private long mTagIdLongPressed;
 
     private boolean mWriteSupport = false;
 
@@ -151,30 +155,16 @@ public class MyTagList extends Activity implements OnItemClickListener, View.OnC
         super.onDestroy();
     }
 
-    @Override
-    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-        if (mWriteSupport) {
-            menu.add(0, 1, 0, "Write to next tag scanned");
-        }
-    }
 
     @Override
-    public boolean onContextItemSelected(MenuItem item) {
-        AdapterView.AdapterContextMenuInfo info;
-        try {
-             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
-        } catch (ClassCastException e) {
-            Log.e(TAG, "bad menuInfo", e);
-            return false;
-        }
-
-        SharedPreferences prefs = getSharedPreferences("tags.pref", Context.MODE_PRIVATE);
-        prefs.edit().putLong(PREF_KEY_TAG_TO_WRITE, info.id).apply();
-        return true;
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        editTag(id);
     }
 
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+    /**
+     * Opens the tag editor for a particular tag.
+     */
+    private void editTag(long id) {
         // TODO: use implicit Intent?
         Intent intent = new Intent(this, EditTagActivity.class);
         intent.setData(ContentUris.withAppendedId(NdefMessages.CONTENT_URI, id));
@@ -335,6 +325,70 @@ public class MyTagList extends Activity implements OnItemClickListener, View.OnC
     }
 
     @Override
+    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
+        Cursor cursor = mAdapter.getCursor();
+        if (cursor == null
+                || cursor.isClosed()
+                || !cursor.moveToPosition(((AdapterContextMenuInfo) info).position)) {
+            return;
+        }
+
+        long id = cursor.getLong(TagQuery.COLUMN_ID);
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.my_tag_list_context_menu, menu);
+
+        // Prepare the menu for the item.
+        menu.findItem(R.id.set_as_active).setVisible(id != mActiveTagId);
+        mTagIdLongPressed = id;
+
+        if (mWriteSupport) {
+            menu.add(0, 1, 0, "Write to next tag scanned");
+        }
+    }
+
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+        long id = mTagIdLongPressed;
+        switch (item.getItemId()) {
+            case R.id.delete:
+                deleteTag(id);
+                return true;
+
+            case R.id.set_as_active:
+                Cursor cursor = mAdapter.getCursor();
+                if (cursor == null || cursor.isClosed()) {
+                    break;
+                }
+
+                for (int position = 0; cursor.moveToPosition(position); position++) {
+                    if (cursor.getLong(TagQuery.COLUMN_ID) == id) {
+                        selectActiveTag(position);
+                        return true;
+                    }
+                }
+                break;
+
+            case R.id.edit:
+                editTag(id);
+                return true;
+
+            case 1:
+                AdapterView.AdapterContextMenuInfo info;
+                try {
+                    info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
+                } catch (ClassCastException e) {
+                    Log.e(TAG, "bad menuInfo", e);
+                    break;
+                }
+
+                SharedPreferences prefs = getSharedPreferences("tags.pref", Context.MODE_PRIVATE);
+                prefs.edit().putLong(PREF_KEY_TAG_TO_WRITE, info.id).apply();
+                return true;
+        }
+        return false;
+    }
+
+    @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == REQUEST_EDIT && resultCode == RESULT_OK) {
             NdefMessage msg = (NdefMessage) Preconditions.checkNotNull(
@@ -414,6 +468,16 @@ public class MyTagList extends Activity implements OnItemClickListener, View.OnC
         }
     }
 
+    /**
+     * Removes the tag from the "My tag" list.
+     */
+    private void deleteTag(long id) {
+        if (id == mActiveTagId) {
+            selectActiveTag(-1);
+        }
+        TagService.delete(this, ContentUris.withAppendedId(NdefMessages.CONTENT_URI, id));
+    }
+
     class SelectActiveTagDialog extends AlertDialog
             implements DialogInterface.OnClickListener, OnItemClickListener {
 
@@ -424,7 +488,6 @@ public class MyTagList extends Activity implements OnItemClickListener, View.OnC
             super(context);
 
             setTitle(context.getResources().getString(R.string.choose_my_tag));
-            LayoutInflater inflater = LayoutInflater.from(context);
             ListView list = new ListView(MyTagList.this);
 
             mData = Lists.newArrayList();
@@ -476,4 +539,5 @@ public class MyTagList extends Activity implements OnItemClickListener, View.OnC
             cancel();
         }
     }
+
 }
index 3b85825..1fd9153 100644 (file)
@@ -76,7 +76,6 @@ public class TagProvider extends SQLiteContentProvider implements TagProviderPip
         MATCHER.addURI(auth, "ndef_msgs", NDEF_MESSAGES);
         MATCHER.addURI(auth, "ndef_msgs/#", NDEF_MESSAGES_ID);
         MATCHER.addURI(auth, "ndef_msgs/#/#/mime", NDEF_MESSAGES_ID_MIME);
-
     }
 
     @Override