• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.notepad;
18 
19 import android.app.Activity;
20 import android.content.ContentValues;
21 import android.database.Cursor;
22 import android.net.Uri;
23 import android.os.Bundle;
24 import android.view.View;
25 import android.widget.EditText;
26 
27 /**
28  * This Activity allows the user to edit a note's title. It displays a floating window
29  * containing an EditText.
30  *
31  * NOTE: Notice that the provider operations in this Activity are taking place on the UI thread.
32  * This is not a good practice. It is only done here to make the code more readable. A real
33  * application should use the {@link android.content.AsyncQueryHandler}
34  * or {@link android.os.AsyncTask} object to perform operations asynchronously on a separate thread.
35  */
36 public class TitleEditor extends Activity {
37 
38     /**
39      * This is a special intent action that means "edit the title of a note".
40      */
41     public static final String EDIT_TITLE_ACTION = "com.android.notepad.action.EDIT_TITLE";
42 
43     // Creates a projection that returns the note ID and the note contents.
44     private static final String[] PROJECTION = new String[] {
45             NotePad.Notes._ID, // 0
46             NotePad.Notes.COLUMN_NAME_TITLE, // 1
47     };
48 
49     // The position of the title column in a Cursor returned by the provider.
50     private static final int COLUMN_INDEX_TITLE = 1;
51 
52     // A Cursor object that will contain the results of querying the provider for a note.
53     private Cursor mCursor;
54 
55     // An EditText object for preserving the edited title.
56     private EditText mText;
57 
58     // A URI object for the note whose title is being edited.
59     private Uri mUri;
60 
61     /**
62      * This method is called by Android when the Activity is first started. From the incoming
63      * Intent, it determines what kind of editing is desired, and then does it.
64      */
65     @Override
onCreate(Bundle savedInstanceState)66     public void onCreate(Bundle savedInstanceState) {
67         super.onCreate(savedInstanceState);
68 
69         // Set the View for this Activity object's UI.
70         setContentView(R.layout.title_editor);
71 
72         // Get the Intent that activated this Activity, and from it get the URI of the note whose
73         // title we need to edit.
74         mUri = getIntent().getData();
75 
76         /*
77          * Using the URI passed in with the triggering Intent, gets the note.
78          *
79          * Note: This is being done on the UI thread. It will block the thread until the query
80          * completes. In a sample app, going against a simple provider based on a local database,
81          * the block will be momentary, but in a real app you should use
82          * android.content.AsyncQueryHandler or android.os.AsyncTask.
83          */
84 
85         mCursor = managedQuery(
86             mUri,        // The URI for the note that is to be retrieved.
87             PROJECTION,  // The columns to retrieve
88             null,        // No selection criteria are used, so no where columns are needed.
89             null,        // No where columns are used, so no where values are needed.
90             null         // No sort order is needed.
91         );
92 
93         // Gets the View ID for the EditText box
94         mText = (EditText) this.findViewById(R.id.title);
95     }
96 
97     /**
98      * This method is called when the Activity is about to come to the foreground. This happens
99      * when the Activity comes to the top of the task stack, OR when it is first starting.
100      *
101      * Displays the current title for the selected note.
102      */
103     @Override
onResume()104     protected void onResume() {
105         super.onResume();
106 
107         // Verifies that the query made in onCreate() actually worked. If it worked, then the
108         // Cursor object is not null. If it is *empty*, then mCursor.getCount() == 0.
109         if (mCursor != null) {
110 
111             // The Cursor was just retrieved, so its index is set to one record *before* the first
112             // record retrieved. This moves it to the first record.
113             mCursor.moveToFirst();
114 
115             // Displays the current title text in the EditText object.
116             mText.setText(mCursor.getString(COLUMN_INDEX_TITLE));
117         }
118     }
119 
120     /**
121      * This method is called when the Activity loses focus.
122      *
123      * For Activity objects that edit information, onPause() may be the one place where changes are
124      * saved. The Android application model is predicated on the idea that "save" and "exit" aren't
125      * required actions. When users navigate away from an Activity, they shouldn't have to go back
126      * to it to complete their work. The act of going away should save everything and leave the
127      * Activity in a state where Android can destroy it if necessary.
128      *
129      * Updates the note with the text currently in the text box.
130      */
131     @Override
onPause()132     protected void onPause() {
133         super.onPause();
134 
135         // Verifies that the query made in onCreate() actually worked. If it worked, then the
136         // Cursor object is not null. If it is *empty*, then mCursor.getCount() == 0.
137 
138         if (mCursor != null) {
139 
140             // Creates a values map for updating the provider.
141             ContentValues values = new ContentValues();
142 
143             // In the values map, sets the title to the current contents of the edit box.
144             values.put(NotePad.Notes.COLUMN_NAME_TITLE, mText.getText().toString());
145 
146             /*
147              * Updates the provider with the note's new title.
148              *
149              * Note: This is being done on the UI thread. It will block the thread until the
150              * update completes. In a sample app, going against a simple provider based on a
151              * local database, the block will be momentary, but in a real app you should use
152              * android.content.AsyncQueryHandler or android.os.AsyncTask.
153              */
154             getContentResolver().update(
155                 mUri,    // The URI for the note to update.
156                 values,  // The values map containing the columns to update and the values to use.
157                 null,    // No selection criteria is used, so no "where" columns are needed.
158                 null     // No "where" columns are used, so no "where" values are needed.
159             );
160 
161         }
162     }
163 
onClickOk(View v)164     public void onClickOk(View v) {
165         finish();
166     }
167 }
168