← Back to team overview

tomdroid-dev team mailing list archive

Live folders

 

Heya,

I played a bit with Tomdroid recently and added the support for live
folders. This is a cupcake feature and thus bumps the requirements to the
version 1.5 of Android. I don't really think it is useful at the moment but
it may be in the future so I'm attaching the bzr merge directive to this
mail.

There is one thing I'm not really sure about the code: the NoteCollection
and NoteProvider classes. The first one seems to parse the xml notes and
puts them in a sqlite database while the second one is the main point to
add, remove and modify notes and deals only with the sqlite database. Did I
understand things correctly?

Benoît Garret
+33614365080
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: benoit.garret_launchpad@xxxxxxxx-20090607221433-\
#   yvm4jfr2d26j6w1y
# target_branch: http://bazaar.launchpad.net/%7Eolivier-\
#   bottomlesspit/tomdroid/main/
# testament_sha1: 1c73988abef20322b6183ef5073600da521d5a05
# timestamp: 2009-06-08 00:21:47 +0200
# base_revision_id: olivier@xxxxxxxxxxxxxxxxx-20090602215343-\
#   xtow80fj3kjrk82q
# 
# Begin patch
=== modified file 'AndroidManifest.xml'
--- AndroidManifest.xml	2009-06-02 21:45:34 +0000
+++ AndroidManifest.xml	2009-06-07 22:14:33 +0000
@@ -29,6 +29,10 @@
 		<provider android:name="NoteProvider"
             android:authorities="org.tomdroid.notes"
         />
+<activity android:name=".data.NotesLiveFolder" android:label="Notes"><intent-filter><action android:name="android.intent.action.CREATE_LIVE_FOLDER"></action>
+<category android:name="android.intent.category.DEFAULT"></category>
+</intent-filter>
+</activity>
 </application>
 	<uses-permission android:name="android.permission.INTERNET" />
 </manifest> 
\ No newline at end of file

=== modified file 'src/org/tomdroid/NoteProvider.java'
--- src/org/tomdroid/NoteProvider.java	2009-04-06 22:30:41 +0000
+++ src/org/tomdroid/NoteProvider.java	2009-06-07 22:14:33 +0000
@@ -58,6 +58,7 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteQueryBuilder;
 import android.net.Uri;
+import android.provider.LiveFolders;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -72,10 +73,12 @@
 	private static final String DEFAULT_SORT_ORDER = Note.ID;
 	
     private static HashMap<String, String> notesProjectionMap;
-
+    private static HashMap<String, String> liveFolderProjectionMap;
+    
     private static final int NOTES = 1;
     private static final int NOTE_ID = 2;
     private static final int NOTE_TITLE = 3;
+    private static final int LIVE_FOLDER_NOTES = 4;
 
     private static final UriMatcher uriMatcher;
     
@@ -143,6 +146,13 @@
         	// TODO appendWhere + whereArgs instead (new String[] whereArgs = uri.getLas..)?
         	qb.appendWhere(Note.TITLE + " LIKE '" + uri.getLastPathSegment()+"'");
         	break;
+        
+        case LIVE_FOLDER_NOTES:
+        	qb.setTables(DB_TABLE_NOTES);
+        	qb.setProjectionMap(liveFolderProjectionMap);
+        	// sort by last modified date, newest first
+        	sortOrder = Note.MODIFIED_DATE + " DESC";
+        	break;
 
         default:
             throw new IllegalArgumentException("Unknown URI " + uri);
@@ -277,11 +287,24 @@
         uriMatcher.addURI(Tomdroid.AUTHORITY, "notes", NOTES);
         uriMatcher.addURI(Tomdroid.AUTHORITY, "notes/#", NOTE_ID);
         uriMatcher.addURI(Tomdroid.AUTHORITY, "notes/*", NOTE_TITLE);
+        uriMatcher.addURI(Tomdroid.AUTHORITY, "live_folder/notes", LIVE_FOLDER_NOTES);
 
         notesProjectionMap = new HashMap<String, String>();
         notesProjectionMap.put(Note.ID, Note.ID);
         notesProjectionMap.put(Note.TITLE, Note.TITLE);
         notesProjectionMap.put(Note.FILE, Note.FILE);
         notesProjectionMap.put(Note.MODIFIED_DATE, Note.MODIFIED_DATE);
+        
+        liveFolderProjectionMap = new HashMap<String, String>();
+        liveFolderProjectionMap.put(LiveFolders._ID, Note.ID + " AS " + LiveFolders._ID);
+        liveFolderProjectionMap.put(LiveFolders.NAME, Note.TITLE + " AS " + LiveFolders.NAME);
+        
+        // this projection creates a new column for
+        // the intent to be used when an item is clicked
+        // looks like : "content://org.tomdroid.notes/notes/id"
+        // "||" is the concatenation operator in sqlite
+        liveFolderProjectionMap.put(LiveFolders.INTENT,
+        		"'content://" + Tomdroid.AUTHORITY + "/notes/'" + " || " + Note.ID
+        		+ " AS " + LiveFolders.INTENT);
     }
 }

=== added directory 'src/org/tomdroid/data'
=== added file 'src/org/tomdroid/data/NotesLiveFolder.java'
--- src/org/tomdroid/data/NotesLiveFolder.java	1970-01-01 00:00:00 +0000
+++ src/org/tomdroid/data/NotesLiveFolder.java	2009-06-07 22:14:33 +0000
@@ -0,0 +1,47 @@
+package org.tomdroid.data;
+
+import org.tomdroid.R;
+import org.tomdroid.ui.Tomdroid;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.LiveFolders;
+
+public class NotesLiveFolder extends Activity {
+	
+	public static final Uri CONTENT_URI = Uri.parse("content://" + Tomdroid.AUTHORITY + "/live_folder/notes");
+	
+	@Override
+	protected void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		
+		final Intent intent = getIntent();
+		final String action = intent.getAction();
+		
+		if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {
+			setResult(RESULT_OK, createLiveFolder(this, CONTENT_URI,
+					"Notes", R.drawable.icon));
+		} else {
+			setResult(RESULT_CANCELED);
+		}
+		
+		finish();
+	}
+	
+	private static Intent createLiveFolder(Context context, Uri uri, String name, int icon) {
+		
+		final Intent intent = new Intent();
+		
+		intent.setData(uri);
+		intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, name);
+		intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
+				Intent.ShortcutIconResource.fromContext(context, icon));
+		intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);
+		
+		return intent;
+    }
+
+}

# Begin bundle
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
gA==

Follow ups