You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

390 lines
25 KiB

<html>
<head>
<title>WorkingNote.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
WorkingNote.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.model;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.CallNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataConstants;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.TextNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser.NoteBgResources;</span>
<span class="s2">public class </span><span class="s1">WorkingNote {</span>
<span class="s0">// Note for the working note</span>
<span class="s2">private </span><span class="s1">Note mNote;</span>
<span class="s0">// Note Id</span>
<span class="s2">private long </span><span class="s1">mNoteId;</span>
<span class="s0">// Note content</span>
<span class="s2">public </span><span class="s1">String mContent;</span>
<span class="s0">// Note mode</span>
<span class="s2">private int </span><span class="s1">mMode;</span>
<span class="s2">private long </span><span class="s1">mAlertDate;</span>
<span class="s2">private long </span><span class="s1">mModifiedDate;</span>
<span class="s2">private int </span><span class="s1">mBgColorId;</span>
<span class="s2">private int </span><span class="s1">mWidgetId;</span>
<span class="s2">private int </span><span class="s1">mWidgetType;</span>
<span class="s2">private long </span><span class="s1">mFolderId;</span>
<span class="s2">private </span><span class="s1">Context mContext;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;WorkingNote&quot;</span><span class="s1">;</span>
<span class="s2">private boolean </span><span class="s1">mIsDeleted;</span>
<span class="s2">private </span><span class="s1">NoteSettingChangedListener mNoteSettingStatusListener;</span>
<span class="s2">public static final </span><span class="s1">String[] DATA_PROJECTION = </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">DataColumns.ID,</span>
<span class="s1">DataColumns.CONTENT,</span>
<span class="s1">DataColumns.MIME_TYPE,</span>
<span class="s1">DataColumns.DATA1,</span>
<span class="s1">DataColumns.DATA2,</span>
<span class="s1">DataColumns.DATA3,</span>
<span class="s1">DataColumns.DATA4,</span>
<span class="s1">};</span>
<span class="s2">public static final </span><span class="s1">String[] NOTE_PROJECTION = </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">NoteColumns.PARENT_ID,</span>
<span class="s1">NoteColumns.ALERTED_DATE,</span>
<span class="s1">NoteColumns.BG_COLOR_ID,</span>
<span class="s1">NoteColumns.WIDGET_ID,</span>
<span class="s1">NoteColumns.WIDGET_TYPE,</span>
<span class="s1">NoteColumns.MODIFIED_DATE</span>
<span class="s1">};</span>
<span class="s2">private static final int </span><span class="s1">DATA_ID_COLUMN = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_CONTENT_COLUMN = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_MIME_TYPE_COLUMN = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_MODE_COLUMN = </span><span class="s4">3</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_PARENT_ID_COLUMN = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_ALERTED_DATE_COLUMN = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_BG_COLOR_ID_COLUMN = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_WIDGET_ID_COLUMN = </span><span class="s4">3</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_WIDGET_TYPE_COLUMN = </span><span class="s4">4</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_MODIFIED_DATE_COLUMN = </span><span class="s4">5</span><span class="s1">;</span>
<span class="s0">// New note construct</span>
<span class="s2">private </span><span class="s1">WorkingNote(Context context, </span><span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mAlertDate = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mModifiedDate = System.currentTimeMillis();</span>
<span class="s1">mFolderId = folderId;</span>
<span class="s1">mNote = </span><span class="s2">new </span><span class="s1">Note();</span>
<span class="s1">mNoteId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mIsDeleted = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mMode = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mWidgetType = Notes.TYPE_WIDGET_INVALIDE;</span>
<span class="s1">}</span>
<span class="s0">// Existing note construct</span>
<span class="s2">private </span><span class="s1">WorkingNote(Context context, </span><span class="s2">long </span><span class="s1">noteId, </span><span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mNoteId = noteId;</span>
<span class="s1">mFolderId = folderId;</span>
<span class="s1">mIsDeleted = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mNote = </span><span class="s2">new </span><span class="s1">Note();</span>
<span class="s1">loadNote();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadNote() {</span>
<span class="s1">Cursor cursor = mContext.getContentResolver().query(</span>
<span class="s1">ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, </span><span class="s2">null</span><span class="s1">,</span>
<span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.moveToFirst()) {</span>
<span class="s1">mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN);</span>
<span class="s1">mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN);</span>
<span class="s1">mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN);</span>
<span class="s1">mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN);</span>
<span class="s1">mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN);</span>
<span class="s1">mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN);</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;No note with id:&quot; </span><span class="s1">+ mNoteId);</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unable to find note with id &quot; </span><span class="s1">+ mNoteId);</span>
<span class="s1">}</span>
<span class="s1">loadNoteData();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadNoteData() {</span>
<span class="s1">Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION,</span>
<span class="s1">DataColumns.NOTE_ID + </span><span class="s3">&quot;=?&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mNoteId)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.moveToFirst()) {</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s1">String type = cursor.getString(DATA_MIME_TYPE_COLUMN);</span>
<span class="s2">if </span><span class="s1">(DataConstants.NOTE.equals(type)) {</span>
<span class="s1">mContent = cursor.getString(DATA_CONTENT_COLUMN);</span>
<span class="s1">mMode = cursor.getInt(DATA_MODE_COLUMN);</span>
<span class="s1">mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN));</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(DataConstants.CALL_NOTE.equals(type)) {</span>
<span class="s1">mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN));</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Wrong note type with type:&quot; </span><span class="s1">+ type);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(cursor.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;No data with id:&quot; </span><span class="s1">+ mNoteId);</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unable to find note's data with id &quot; </span><span class="s1">+ mNoteId);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">WorkingNote createEmptyNote(Context context, </span><span class="s2">long </span><span class="s1">folderId, </span><span class="s2">int </span><span class="s1">widgetId,</span>
<span class="s2">int </span><span class="s1">widgetType, </span><span class="s2">int </span><span class="s1">defaultBgColorId) {</span>
<span class="s1">WorkingNote note = </span><span class="s2">new </span><span class="s1">WorkingNote(context, folderId);</span>
<span class="s1">note.setBgColorId(defaultBgColorId);</span>
<span class="s1">note.setWidgetId(widgetId);</span>
<span class="s1">note.setWidgetType(widgetType);</span>
<span class="s2">return </span><span class="s1">note;</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">WorkingNote load(Context context, </span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s2">return new </span><span class="s1">WorkingNote(context, id, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public synchronized boolean </span><span class="s1">saveNote() {</span>
<span class="s2">if </span><span class="s1">(isWorthSaving()) {</span>
<span class="s2">if </span><span class="s1">(!existInDatabase()) {</span>
<span class="s2">if </span><span class="s1">((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Create new note fail with id:&quot; </span><span class="s1">+ mNoteId);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mNote.syncNote(mContext, mNoteId);</span>
<span class="s0">/**</span>
<span class="s0">* Update widget content if there exist any widget of this note</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID</span>
<span class="s1">&amp;&amp; mWidgetType != Notes.TYPE_WIDGET_INVALIDE</span>
<span class="s1">&amp;&amp; mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onWidgetChanged();</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">existInDatabase() {</span>
<span class="s2">return </span><span class="s1">mNoteId &gt; </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">isWorthSaving() {</span>
<span class="s2">if </span><span class="s1">(mIsDeleted || (!existInDatabase() &amp;&amp; TextUtils.isEmpty(mContent))</span>
<span class="s1">|| (existInDatabase() &amp;&amp; !mNote.isLocalModified())) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setOnSettingStatusChangedListener(NoteSettingChangedListener l) {</span>
<span class="s1">mNoteSettingStatusListener = l;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setAlertDate(</span><span class="s2">long </span><span class="s1">date, </span><span class="s2">boolean </span><span class="s1">set) {</span>
<span class="s2">if </span><span class="s1">(date != mAlertDate) {</span>
<span class="s1">mAlertDate = date;</span>
<span class="s1">mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate));</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onClockAlertChanged(date, set);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">markDeleted(</span><span class="s2">boolean </span><span class="s1">mark) {</span>
<span class="s1">mIsDeleted = mark;</span>
<span class="s2">if </span><span class="s1">(mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID</span>
<span class="s1">&amp;&amp; mWidgetType != Notes.TYPE_WIDGET_INVALIDE &amp;&amp; mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onWidgetChanged();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setBgColorId(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">if </span><span class="s1">(id != mBgColorId) {</span>
<span class="s1">mBgColorId = id;</span>
<span class="s2">if </span><span class="s1">(mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onBackgroundColorChanged();</span>
<span class="s1">}</span>
<span class="s1">mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCheckListMode(</span><span class="s2">int </span><span class="s1">mode) {</span>
<span class="s2">if </span><span class="s1">(mMode != mode) {</span>
<span class="s2">if </span><span class="s1">(mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode);</span>
<span class="s1">}</span>
<span class="s1">mMode = mode;</span>
<span class="s1">mNote.setTextData(TextNote.MODE, String.valueOf(mMode));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setWidgetType(</span><span class="s2">int </span><span class="s1">type) {</span>
<span class="s2">if </span><span class="s1">(type != mWidgetType) {</span>
<span class="s1">mWidgetType = type;</span>
<span class="s1">mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setWidgetId(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">if </span><span class="s1">(id != mWidgetId) {</span>
<span class="s1">mWidgetId = id;</span>
<span class="s1">mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setWorkingText(String text) {</span>
<span class="s2">if </span><span class="s1">(!TextUtils.equals(mContent, text)) {</span>
<span class="s1">mContent = text;</span>
<span class="s1">mNote.setTextData(DataColumns.CONTENT, mContent);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">convertToCallNote(String phoneNumber, </span><span class="s2">long </span><span class="s1">callDate) {</span>
<span class="s1">mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate));</span>
<span class="s1">mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber);</span>
<span class="s1">mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER));</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">hasClockAlert() {</span>
<span class="s2">return </span><span class="s1">(mAlertDate &gt; </span><span class="s4">0 </span><span class="s1">? </span><span class="s2">true </span><span class="s1">: </span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getContent() {</span>
<span class="s2">return </span><span class="s1">mContent;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getAlertDate() {</span>
<span class="s2">return </span><span class="s1">mAlertDate;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getModifiedDate() {</span>
<span class="s2">return </span><span class="s1">mModifiedDate;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getBgColorResId() {</span>
<span class="s2">return </span><span class="s1">NoteBgResources.getNoteBgResource(mBgColorId);</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getBgColorId() {</span>
<span class="s2">return </span><span class="s1">mBgColorId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getTitleBgResId() {</span>
<span class="s2">return </span><span class="s1">NoteBgResources.getNoteTitleBgResource(mBgColorId);</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getCheckListMode() {</span>
<span class="s2">return </span><span class="s1">mMode;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getNoteId() {</span>
<span class="s2">return </span><span class="s1">mNoteId;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getFolderId() {</span>
<span class="s2">return </span><span class="s1">mFolderId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getWidgetId() {</span>
<span class="s2">return </span><span class="s1">mWidgetId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getWidgetType() {</span>
<span class="s2">return </span><span class="s1">mWidgetType;</span>
<span class="s1">}</span>
<span class="s2">public interface </span><span class="s1">NoteSettingChangedListener {</span>
<span class="s0">/**</span>
<span class="s0">* Called when the background color of current note has just changed</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onBackgroundColorChanged();</span>
<span class="s0">/**</span>
<span class="s0">* Called when user set clock</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onClockAlertChanged(</span><span class="s2">long </span><span class="s1">date, </span><span class="s2">boolean </span><span class="s1">set);</span>
<span class="s0">/**</span>
<span class="s0">* Call when user create note from widget</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onWidgetChanged();</span>
<span class="s0">/**</span>
<span class="s0">* Call when switch between check list mode and normal mode</span>
<span class="s0">* </span><span class="s5">@param </span><span class="s0">oldMode is previous mode before change</span>
<span class="s0">* </span><span class="s5">@param </span><span class="s0">newMode is new mode</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onCheckListModeChanged(</span><span class="s2">int </span><span class="s1">oldMode, </span><span class="s2">int </span><span class="s1">newMode);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>