Index: trunk/Notepadv2/default.properties =================================================================== --- trunk/Notepadv2/default.properties (revision 3) +++ trunk/Notepadv2/default.properties (revision 3) @@ -0,0 +1,13 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Indicates whether an apk should be generated for each density. +split.density=false +# Project target. +target=android-7 Index: trunk/Notepadv2/.classpath =================================================================== --- trunk/Notepadv2/.classpath (revision 3) +++ trunk/Notepadv2/.classpath (revision 3) @@ -0,0 +1,7 @@ + + + + + + + Index: trunk/Notepadv2/.project =================================================================== --- trunk/Notepadv2/.project (revision 3) +++ trunk/Notepadv2/.project (revision 3) @@ -0,0 +1,33 @@ + + + Notepadv2 + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + Index: trunk/Notepadv2/AndroidManifest.xml =================================================================== --- trunk/Notepadv2/AndroidManifest.xml (revision 3) +++ trunk/Notepadv2/AndroidManifest.xml (revision 3) @@ -0,0 +1,12 @@ + + + + + + + + + + + Index: trunk/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java =================================================================== --- trunk/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java (revision 3) +++ trunk/Notepadv2/src/com/android/demo/notepad2/NotesDbAdapter.java (revision 3) @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * 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. + */ + +package com.android.demo.notepad2; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +/** + * Simple notes database access helper class. Defines the basic CRUD operations + * for the notepad example, and gives the ability to list all notes as well as + * retrieve or modify a specific note. + * + * This has been improved from the first version of this tutorial through the + * addition of better error handling and also using returning a Cursor instead + * of using a collection of inner classes (which is less scalable and not + * recommended). + */ +public class NotesDbAdapter { + + public static final String KEY_TITLE = "title"; + public static final String KEY_BODY = "body"; + public static final String KEY_ROWID = "_id"; + + private static final String TAG = "NotesDbAdapter"; + private DatabaseHelper mDbHelper; + private SQLiteDatabase mDb; + + /** + * Database creation sql statement + */ + private static final String DATABASE_CREATE = + "create table notes (_id integer primary key autoincrement, " + + "title text not null, body text not null);"; + + private static final String DATABASE_NAME = "data"; + private static final String DATABASE_TABLE = "notes"; + private static final int DATABASE_VERSION = 2; + + private final Context mCtx; + + private static class DatabaseHelper extends SQLiteOpenHelper { + + DatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + + db.execSQL(DATABASE_CREATE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + + newVersion + ", which will destroy all old data"); + db.execSQL("DROP TABLE IF EXISTS notes"); + onCreate(db); + } + } + + /** + * Constructor - takes the context to allow the database to be + * opened/created + * + * @param ctx the Context within which to work + */ + public NotesDbAdapter(Context ctx) { + this.mCtx = ctx; + } + + /** + * Open the notes database. If it cannot be opened, try to create a new + * instance of the database. If it cannot be created, throw an exception to + * signal the failure + * + * @return this (self reference, allowing this to be chained in an + * initialization call) + * @throws SQLException if the database could be neither opened or created + */ + public NotesDbAdapter open() throws SQLException { + mDbHelper = new DatabaseHelper(mCtx); + mDb = mDbHelper.getWritableDatabase(); + return this; + } + + public void close() { + mDbHelper.close(); + } + + + /** + * Create a new note using the title and body provided. If the note is + * successfully created return the new rowId for that note, otherwise return + * a -1 to indicate failure. + * + * @param title the title of the note + * @param body the body of the note + * @return rowId or -1 if failed + */ + public long createNote(String title, String body) { + ContentValues initialValues = new ContentValues(); + initialValues.put(KEY_TITLE, title); + initialValues.put(KEY_BODY, body); + + return mDb.insert(DATABASE_TABLE, null, initialValues); + } + + /** + * Delete the note with the given rowId + * + * @param rowId id of note to delete + * @return true if deleted, false otherwise + */ + public boolean deleteNote(long rowId) { + + return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; + } + + /** + * Return a Cursor over the list of all notes in the database + * + * @return Cursor over all notes + */ + public Cursor fetchAllNotes() { + + return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, + KEY_BODY}, null, null, null, null, null); + } + + /** + * Return a Cursor positioned at the note that matches the given rowId + * + * @param rowId id of note to retrieve + * @return Cursor positioned to matching note, if found + * @throws SQLException if note could not be found/retrieved + */ + public Cursor fetchNote(long rowId) throws SQLException { + + Cursor mCursor = + + mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, + KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null, + null, null, null, null); + if (mCursor != null) { + mCursor.moveToFirst(); + } + return mCursor; + + } + + /** + * Update the note using the details provided. The note to be updated is + * specified using the rowId, and it is altered to use the title and body + * values passed in + * + * @param rowId id of note to update + * @param title value to set note title to + * @param body value to set note body to + * @return true if the note was successfully updated, false otherwise + */ + public boolean updateNote(long rowId, String title, String body) { + ContentValues args = new ContentValues(); + args.put(KEY_TITLE, title); + args.put(KEY_BODY, body); + + return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; + } +} Index: trunk/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java =================================================================== --- trunk/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java (revision 3) +++ trunk/Notepadv2/src/com/android/demo/notepad2/Notepadv2.java (revision 3) @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * 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. + */ + +package com.android.demo.notepad2; + +import android.app.ListActivity; +import android.content.Intent; +import android.database.Cursor; +import android.os.Bundle; +import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ContextMenu.ContextMenuInfo; +import android.widget.ListView; +import android.widget.SimpleCursorAdapter; +import android.widget.AdapterView.AdapterContextMenuInfo; + +public class Notepadv2 extends ListActivity { + private static final int ACTIVITY_CREATE=0; + private static final int ACTIVITY_EDIT=1; + + private static final int INSERT_ID = Menu.FIRST; + private static final int DELETE_ID = Menu.FIRST + 1; + + private NotesDbAdapter mDbHelper; + private Cursor mNotesCursor; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.notes_list); + mDbHelper = new NotesDbAdapter(this); + mDbHelper.open(); + fillData(); + registerForContextMenu(getListView()); + } + + private void fillData() { + // Get all of the rows from the database and create the item list + mNotesCursor = mDbHelper.fetchAllNotes(); + startManagingCursor(mNotesCursor); + + // Create an array to specify the fields we want to display in the list (only TITLE) + String[] from = new String[]{NotesDbAdapter.KEY_TITLE}; + + // and an array of the fields we want to bind those fields to (in this case just text1) + int[] to = new int[]{R.id.text1}; + + // Now create a simple cursor adapter and set it to display + SimpleCursorAdapter notes = + new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to); + setListAdapter(notes); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + menu.add(0, INSERT_ID,0, R.string.menu_insert); + return true; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + switch(item.getItemId()) { + case INSERT_ID: + createNote(); + return true; + } + + return super.onMenuItemSelected(featureId, item); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + + // TODO: fill in rest of method + menu.add(0,DELETE_ID,0,R.string.menu_delete); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + switch(item.getItemId()){ + case DELETE_ID: + AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); + mDbHelper.deleteNote(info.id); + fillData(); + return true; + } + return super.onContextItemSelected(item); + + // TODO: fill in rest of method + } + + private void createNote() { + // TODO: fill in implementation + Intent i = new Intent(this,NoteEdit.class); + startActivityForResult(i, ACTIVITY_CREATE); + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + super.onListItemClick(l, v, position, id); + + // TODO: fill in rest of method + Cursor c = mNotesCursor; + c.moveToPosition(position); + Intent i = new Intent(this,NoteEdit.class); + i.putExtra(NotesDbAdapter.KEY_ROWID, id); + i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString( + c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE) + ) + ); + i.putExtra(NotesDbAdapter.KEY_BODY, c.getString( + c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY) + ) + ); + startActivityForResult(i, ACTIVITY_EDIT); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + super.onActivityResult(requestCode, resultCode, intent); + + // TODO: fill in rest of method + Bundle extras = intent.getExtras(); + + switch(requestCode){ + case ACTIVITY_CREATE: + String title =extras.getString(NotesDbAdapter.KEY_TITLE); + String body = extras.getString(NotesDbAdapter.KEY_BODY); + mDbHelper.createNote(title, body); + fillData(); + break; + case ACTIVITY_EDIT: + Long mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID); + if(mRowId != null){ + String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE); + String editBody = extras.getString(NotesDbAdapter.KEY_BODY); + mDbHelper.updateNote(mRowId, editTitle, editBody); + } + fillData(); + break; + } + } +} Index: trunk/Notepadv2/src/com/android/demo/notepad2/NoteEdit.java =================================================================== --- trunk/Notepadv2/src/com/android/demo/notepad2/NoteEdit.java (revision 3) +++ trunk/Notepadv2/src/com/android/demo/notepad2/NoteEdit.java (revision 3) @@ -0,0 +1,7 @@ +package com.android.demo.notepad2; + +import android.app.Activity; + +public class NoteEdit extends Activity { + +} Index: trunk/Notepadv2/res/values/strings.xml =================================================================== --- trunk/Notepadv2/res/values/strings.xml (revision 3) +++ trunk/Notepadv2/res/values/strings.xml (revision 3) @@ -0,0 +1,11 @@ + + + Notepad v2 + No Notes Yet + Add Note + Delete Note + Title + Body + Confirm + Edit Note + Index: trunk/Notepadv2/res/layout/notes_list.xml =================================================================== --- trunk/Notepadv2/res/layout/notes_list.xml (revision 3) +++ trunk/Notepadv2/res/layout/notes_list.xml (revision 3) @@ -0,0 +1,13 @@ + + + + + + Index: trunk/Notepadv2/res/layout/note_edit.xml =================================================================== --- trunk/Notepadv2/res/layout/note_edit.xml (revision 3) +++ trunk/Notepadv2/res/layout/note_edit.xml (revision 3) @@ -0,0 +1,33 @@ + + + + + + + + + + + + + +