summaryrefslogtreecommitdiffstats
path: root/tutorials/NotepadCodeLab/Notepadv3
diff options
context:
space:
mode:
Diffstat (limited to 'tutorials/NotepadCodeLab/Notepadv3')
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml12
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/res/drawable/icon.pngbin0 -> 6094 bytes
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/res/layout/note_edit.xml33
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/res/layout/notes_list.xml13
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/res/layout/notes_row.xml4
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/res/values/strings.xml11
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java76
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java148
-rwxr-xr-xtutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java188
9 files changed, 485 insertions, 0 deletions
diff --git a/tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml b/tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml
new file mode 100755
index 000000000..adb07ffdb
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/AndroidManifest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.demo.notepad3">
+ <application android:icon="@drawable/icon">
+ <activity android:name=".Notepadv3" android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity android:name=".NoteEdit"/>
+ </application>
+</manifest> \ No newline at end of file
diff --git a/tutorials/NotepadCodeLab/Notepadv3/res/drawable/icon.png b/tutorials/NotepadCodeLab/Notepadv3/res/drawable/icon.png
new file mode 100755
index 000000000..64e3601c2
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/res/drawable/icon.png
Binary files differ
diff --git a/tutorials/NotepadCodeLab/Notepadv3/res/layout/note_edit.xml b/tutorials/NotepadCodeLab/Notepadv3/res/layout/note_edit.xml
new file mode 100755
index 000000000..b254552c3
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/res/layout/note_edit.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical" android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/title" />
+ <EditText android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"/>
+ </LinearLayout>
+
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/body" />
+ <EditText android:id="@+id/body" android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:scrollbars="vertical" />
+
+ <Button android:id="@+id/confirm"
+ android:text="@string/confirm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_list.xml b/tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_list.xml
new file mode 100755
index 000000000..29ae88631
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_list.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <ListView android:id="@+id/android:list"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+ <TextView android:id="@+id/android:empty"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="No Notes!"/>
+</LinearLayout>
diff --git a/tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_row.xml b/tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_row.xml
new file mode 100755
index 000000000..f28a41bea
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/res/layout/notes_row.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView android:id="@+id/text1" xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
diff --git a/tutorials/NotepadCodeLab/Notepadv3/res/values/strings.xml b/tutorials/NotepadCodeLab/Notepadv3/res/values/strings.xml
new file mode 100755
index 000000000..ae63b837d
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/res/values/strings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">Notepad v3</string>
+ <string name="no_notes">No Notes Yet</string>
+ <string name="menu_insert">Add Note</string>
+ <string name="menu_delete">Delete Note</string>
+ <string name="title">Title</string>
+ <string name="body">Body</string>
+ <string name="confirm">Confirm</string>
+ <string name="edit_note">Edit Note</string>
+</resources>
diff --git a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java
new file mode 100755
index 000000000..af3a2340d
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NoteEdit.java
@@ -0,0 +1,76 @@
+/*
+ * 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.notepad3;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+public class NoteEdit extends Activity {
+
+ private EditText mTitleText;
+ private EditText mBodyText;
+ private Long mRowId;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.note_edit);
+
+ mTitleText = (EditText) findViewById(R.id.title);
+ mBodyText = (EditText) findViewById(R.id.body);
+
+ Button confirmButton = (Button) findViewById(R.id.confirm);
+
+ mRowId = null;
+ Bundle extras = getIntent().getExtras();
+ if (extras != null) {
+ String title = extras.getString(NotesDbAdapter.KEY_TITLE);
+ String body = extras.getString(NotesDbAdapter.KEY_BODY);
+ mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+
+ if (title != null) {
+ mTitleText.setText(title);
+ }
+ if (body != null) {
+ mBodyText.setText(body);
+ }
+ }
+
+ confirmButton.setOnClickListener(new View.OnClickListener() {
+
+ public void onClick(View view) {
+ Bundle bundle = new Bundle();
+
+ bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
+ bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
+ if (mRowId != null) {
+ bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
+ }
+
+ Intent mIntent = new Intent();
+ mIntent.putExtras(bundle);
+ setResult(RESULT_OK, mIntent);
+ finish();
+ }
+
+ });
+ }
+}
diff --git a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java
new file mode 100755
index 000000000..f50f371d8
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/Notepadv3.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")savedInstanceState;
+ * 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.notepad3;
+
+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 Notepadv3 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);
+ 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);
+ }
+
+ private void createNote() {
+ 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);
+ 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);
+ 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 rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
+ if (rowId != null) {
+ String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
+ String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
+ mDbHelper.updateNote(rowId, editTitle, editBody);
+ }
+ fillData();
+ break;
+ }
+ }
+}
diff --git a/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java
new file mode 100755
index 000000000..61ad04623
--- /dev/null
+++ b/tutorials/NotepadCodeLab/Notepadv3/src/com/android/demo/notepad3/NotesDbAdapter.java
@@ -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.notepad3;
+
+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;
+ }
+}