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.
gitProject1/01src/net/micode/notes/ui/NoteEditActivity.java.html

1131 lines
91 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<html>
<head>
<title>NoteEditActivity.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: #0037a6;}
.s6 { 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">
NoteEditActivity.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.ui;</span>
<span class="s2">import </span><span class="s1">android.app.Activity;</span>
<span class="s2">import </span><span class="s1">android.app.AlarmManager;</span>
<span class="s2">import </span><span class="s1">android.app.AlertDialog;</span>
<span class="s2">import </span><span class="s1">android.app.PendingIntent;</span>
<span class="s2">import </span><span class="s1">android.app.SearchManager;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.content.ContentResolver;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.DialogInterface;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">import </span><span class="s1">android.content.SharedPreferences;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.graphics.Bitmap;</span>
<span class="s2">import </span><span class="s1">android.graphics.BitmapFactory;</span>
<span class="s2">import </span><span class="s1">android.graphics.Paint;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">import </span><span class="s1">android.os.Bundle;</span>
<span class="s2">import </span><span class="s1">android.preference.PreferenceManager;</span>
<span class="s2">import </span><span class="s1">android.provider.DocumentsContract;</span>
<span class="s2">import </span><span class="s1">android.provider.MediaStore;</span>
<span class="s2">import </span><span class="s1">android.text.Editable;</span>
<span class="s2">import </span><span class="s1">android.text.Spannable;</span>
<span class="s2">import </span><span class="s1">android.text.SpannableString;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.text.format.DateUtils;</span>
<span class="s2">import </span><span class="s1">android.text.style.BackgroundColorSpan;</span>
<span class="s2">import </span><span class="s1">android.text.style.ImageSpan;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">android.view.LayoutInflater;</span>
<span class="s2">import </span><span class="s1">android.view.Menu;</span>
<span class="s2">import </span><span class="s1">android.view.MenuItem;</span>
<span class="s2">import </span><span class="s1">android.view.MotionEvent;</span>
<span class="s2">import </span><span class="s1">android.view.View;</span>
<span class="s2">import </span><span class="s1">android.view.View.OnClickListener;</span>
<span class="s2">import </span><span class="s1">android.view.WindowManager;</span>
<span class="s2">import </span><span class="s1">android.widget.CheckBox;</span>
<span class="s2">import </span><span class="s1">android.widget.CompoundButton;</span>
<span class="s2">import </span><span class="s1">android.widget.CompoundButton.OnCheckedChangeListener;</span>
<span class="s2">import </span><span class="s1">android.widget.EditText;</span>
<span class="s2">import </span><span class="s1">android.widget.ImageButton;</span>
<span class="s2">import </span><span class="s1">android.widget.ImageView;</span>
<span class="s2">import </span><span class="s1">android.widget.LinearLayout;</span>
<span class="s2">import </span><span class="s1">android.widget.TextView;</span>
<span class="s2">import </span><span class="s1">android.widget.Toast;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</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.TextNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.model.WorkingNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.model.WorkingNote.NoteSettingChangedListener;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.DataUtils;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser.TextAppearanceResources;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.widget.NoteWidgetProvider_2x;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.widget.NoteWidgetProvider_4x;</span>
<span class="s2">import </span><span class="s1">java.io.FileNotFoundException;</span>
<span class="s2">import </span><span class="s1">java.util.HashMap;</span>
<span class="s2">import </span><span class="s1">java.util.HashSet;</span>
<span class="s2">import </span><span class="s1">java.util.Map;</span>
<span class="s2">import </span><span class="s1">java.util.regex.Matcher;</span>
<span class="s2">import </span><span class="s1">java.util.regex.Pattern;</span>
<span class="s0">//import android.os.Build;</span>
<span class="s0">//import Build.VERSION_CODES;</span>
<span class="s2">public class </span><span class="s1">NoteEditActivity </span><span class="s2">extends </span><span class="s1">Activity </span><span class="s2">implements </span><span class="s1">OnClickListener,</span>
<span class="s1">NoteSettingChangedListener, OnTextViewChangeListener {</span>
<span class="s2">private </span><span class="s1">Notes.NoteColumns Build;</span>
<span class="s2">private class </span><span class="s1">HeadViewHolder {</span>
<span class="s2">public </span><span class="s1">TextView tvModified;</span>
<span class="s2">public </span><span class="s1">ImageView ivAlertIcon;</span>
<span class="s2">public </span><span class="s1">TextView tvAlertDate;</span>
<span class="s2">public </span><span class="s1">ImageView ibSetBgColor;</span>
<span class="s1">}</span>
<span class="s2">private static final </span><span class="s1">Map&lt;Integer, Integer&gt; sBgSelectorBtnsMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;Integer, Integer&gt;();</span>
<span class="s2">static </span><span class="s1">{</span>
<span class="s1">sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW);</span>
<span class="s1">sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED);</span>
<span class="s1">sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE);</span>
<span class="s1">sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN);</span>
<span class="s1">sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE);</span>
<span class="s1">}</span>
<span class="s2">private static final </span><span class="s1">Map&lt;Integer, Integer&gt; sBgSelectorSelectionMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;Integer, Integer&gt;();</span>
<span class="s2">static </span><span class="s1">{</span>
<span class="s1">sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select);</span>
<span class="s1">sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select);</span>
<span class="s1">sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select);</span>
<span class="s1">sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select);</span>
<span class="s1">sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select);</span>
<span class="s1">}</span>
<span class="s2">private static final </span><span class="s1">Map&lt;Integer, Integer&gt; sFontSizeBtnsMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;Integer, Integer&gt;();</span>
<span class="s2">static </span><span class="s1">{</span>
<span class="s1">sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE);</span>
<span class="s1">sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL);</span>
<span class="s1">sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM);</span>
<span class="s1">sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER);</span>
<span class="s1">}</span>
<span class="s2">private static final </span><span class="s1">Map&lt;Integer, Integer&gt; sFontSelectorSelectionMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;Integer, Integer&gt;();</span>
<span class="s2">static </span><span class="s1">{</span>
<span class="s1">sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select);</span>
<span class="s1">sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select);</span>
<span class="s1">sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select);</span>
<span class="s1">sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select);</span>
<span class="s1">}</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NoteEditActivity&quot;</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">HeadViewHolder mNoteHeaderHolder;</span>
<span class="s2">private </span><span class="s1">View mHeadViewPanel;</span>
<span class="s2">private </span><span class="s1">View mNoteBgColorSelector;</span>
<span class="s2">private </span><span class="s1">View mFontSizeSelector;</span>
<span class="s2">private </span><span class="s1">EditText mNoteEditor;</span>
<span class="s2">private </span><span class="s1">View mNoteEditorPanel;</span>
<span class="s2">private </span><span class="s1">WorkingNote mWorkingNote;</span>
<span class="s2">private </span><span class="s1">SharedPreferences mSharedPrefs;</span>
<span class="s2">private int </span><span class="s1">mFontSizeId;</span>
<span class="s2">private static final </span><span class="s1">String PREFERENCE_FONT_SIZE = </span><span class="s3">&quot;pref_font_size&quot;</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">SHORTCUT_ICON_TITLE_MAX_LEN = </span><span class="s4">10</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String TAG_CHECKED = String.valueOf(</span><span class="s3">'</span><span class="s5">\u221A</span><span class="s3">'</span><span class="s1">);</span>
<span class="s2">public static final </span><span class="s1">String TAG_UNCHECKED = String.valueOf(</span><span class="s3">'</span><span class="s5">\u25A1</span><span class="s3">'</span><span class="s1">);</span>
<span class="s2">private </span><span class="s1">LinearLayout mEditTextList;</span>
<span class="s2">private </span><span class="s1">String mUserQuery;</span>
<span class="s2">private </span><span class="s1">Pattern mPattern;</span>
<span class="s0">// @Override</span>
<span class="s0">// protected void onCreate(Bundle savedInstanceState) {</span>
<span class="s0">// super.onCreate(savedInstanceState);</span>
<span class="s0">// this.setContentView(R.layout.note_edit);</span>
<span class="s0">//</span>
<span class="s0">// if (savedInstanceState == null &amp;&amp; !initActivityState(getIntent())) {</span>
<span class="s0">// finish();</span>
<span class="s0">// return;</span>
<span class="s0">// }</span>
<span class="s0">// initResources();</span>
<span class="s0">// }</span>
<span class="s2">private final int </span><span class="s1">PHOTO_REQUEST=</span><span class="s4">1</span><span class="s1">;</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onCreate(Bundle savedInstanceState) {</span>
<span class="s2">super</span><span class="s1">.onCreate(savedInstanceState);</span>
<span class="s2">this</span><span class="s1">.setContentView(R.layout.note_edit);</span>
<span class="s2">if </span><span class="s1">(savedInstanceState == </span><span class="s2">null </span><span class="s1">&amp;&amp; !initActivityState(getIntent())) {</span>
<span class="s1">finish();</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">initResources();</span>
<span class="s0">//根据id获取添加图片按钮</span>
<span class="s2">final </span><span class="s1">ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_btn);</span>
<span class="s0">//为点击图片按钮设置监听器</span>
<span class="s1">add_img_btn.setOnClickListener(</span><span class="s2">new </span><span class="s1">View.OnClickListener() {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onClick(View view) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;onClick: click add image button&quot;</span><span class="s1">);</span>
<span class="s0">//ACTION_GET_CONTENT: 允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)</span>
<span class="s1">Intent loadImage = </span><span class="s2">new </span><span class="s1">Intent(Intent.ACTION_GET_CONTENT);</span>
<span class="s0">//Category属性用于指定当前动作Action被执行的环境.</span>
<span class="s0">//CATEGORY_OPENABLE; 用来指示一个ACTION_GET_CONTENT的intent</span>
<span class="s1">loadImage.addCategory(Intent.CATEGORY_OPENABLE);</span>
<span class="s1">loadImage.setType(</span><span class="s3">&quot;image/*&quot;</span><span class="s1">);</span>
<span class="s1">startActivityForResult(loadImage, PHOTO_REQUEST);</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Current activity may be killed when the memory is low. Once it is killed, for another time</span>
<span class="s0">* user load this activity, we should restore the former state</span>
<span class="s0">*/</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onRestoreInstanceState(Bundle savedInstanceState) {</span>
<span class="s2">super</span><span class="s1">.onRestoreInstanceState(savedInstanceState);</span>
<span class="s2">if </span><span class="s1">(savedInstanceState != </span><span class="s2">null </span><span class="s1">&amp;&amp; savedInstanceState.containsKey(Intent.EXTRA_UID)) {</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(Intent.ACTION_VIEW);</span>
<span class="s1">intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID));</span>
<span class="s2">if </span><span class="s1">(!initActivityState(intent)) {</span>
<span class="s1">finish();</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Restoring from killed activity&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">initActivityState(Intent intent) {</span>
<span class="s0">/**</span>
<span class="s0">* If the user specified the {</span><span class="s6">@link </span><span class="s0">Intent#ACTION_VIEW} but not provided with id,</span>
<span class="s0">* then jump to the NotesListActivity</span>
<span class="s0">*/</span>
<span class="s1">mWorkingNote = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {</span>
<span class="s2">long </span><span class="s1">noteId = intent.getLongExtra(Intent.EXTRA_UID, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">mUserQuery = </span><span class="s3">&quot;&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Starting from the searched result</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) {</span>
<span class="s1">noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));</span>
<span class="s1">mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {</span>
<span class="s1">Intent jump = </span><span class="s2">new </span><span class="s1">Intent(</span><span class="s2">this</span><span class="s1">, NotesListActivity.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">startActivity(jump);</span>
<span class="s1">showToast(R.string.error_note_not_exist);</span>
<span class="s1">finish();</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="s1">mWorkingNote = WorkingNote.load(</span><span class="s2">this</span><span class="s1">, noteId);</span>
<span class="s2">if </span><span class="s1">(mWorkingNote == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;load note failed with note id&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">finish();</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">getWindow().setSoftInputMode(</span>
<span class="s1">WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN</span>
<span class="s1">| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);</span>
<span class="s1">} </span><span class="s2">else if</span><span class="s1">(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {</span>
<span class="s0">// New note</span>
<span class="s2">long </span><span class="s1">folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s2">int </span><span class="s1">widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,</span>
<span class="s1">AppWidgetManager.INVALID_APPWIDGET_ID);</span>
<span class="s2">int </span><span class="s1">widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE,</span>
<span class="s1">Notes.TYPE_WIDGET_INVALIDE);</span>
<span class="s2">int </span><span class="s1">bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID,</span>
<span class="s1">ResourceParser.getDefaultBgId(</span><span class="s2">this</span><span class="s1">));</span>
<span class="s0">// Parse call-record note</span>
<span class="s1">String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);</span>
<span class="s2">long </span><span class="s1">callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(callDate != </span><span class="s4">0 </span><span class="s1">&amp;&amp; phoneNumber != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(TextUtils.isEmpty(phoneNumber)) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;The call record number is null&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">long </span><span class="s1">noteId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(),</span>
<span class="s1">phoneNumber, callDate)) &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mWorkingNote = WorkingNote.load(</span><span class="s2">this</span><span class="s1">, noteId);</span>
<span class="s2">if </span><span class="s1">(mWorkingNote == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;load call note failed with note id&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">finish();</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mWorkingNote = WorkingNote.createEmptyNote(</span><span class="s2">this</span><span class="s1">, folderId, widgetId,</span>
<span class="s1">widgetType, bgResId);</span>
<span class="s1">mWorkingNote.convertToCallNote(phoneNumber, callDate);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mWorkingNote = WorkingNote.createEmptyNote(</span><span class="s2">this</span><span class="s1">, folderId, widgetId, widgetType,</span>
<span class="s1">bgResId);</span>
<span class="s1">}</span>
<span class="s1">getWindow().setSoftInputMode(</span>
<span class="s1">WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE</span>
<span class="s1">| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);</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;Intent not specified action, should not support&quot;</span><span class="s1">);</span>
<span class="s1">finish();</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mWorkingNote.setOnSettingStatusChangedListener(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onResume() {</span>
<span class="s2">super</span><span class="s1">.onResume();</span>
<span class="s1">initNoteScreen();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">initNoteScreen() {</span>
<span class="s1">mNoteEditor.setTextAppearance(</span><span class="s2">this</span><span class="s1">, TextAppearanceResources</span>
<span class="s1">.getTexAppearanceResource(mFontSizeId));</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {</span>
<span class="s1">switchToListMode(mWorkingNote.getContent());</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));</span>
<span class="s1">mNoteEditor.setSelection(mNoteEditor.getText().length());</span>
<span class="s1">}</span>
<span class="s2">for </span><span class="s1">(Integer id : sBgSelectorSelectionMap.keySet()) {</span>
<span class="s1">findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE);</span>
<span class="s1">}</span>
<span class="s1">mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());</span>
<span class="s1">mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());</span>
<span class="s1">mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(</span><span class="s2">this</span><span class="s1">,</span>
<span class="s1">mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE</span>
<span class="s1">| DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME</span>
<span class="s1">| DateUtils.FORMAT_SHOW_YEAR));</span>
<span class="s0">/**</span>
<span class="s0">* TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker</span>
<span class="s0">* is not ready</span>
<span class="s0">*/</span>
<span class="s1">showAlertHeader();</span>
<span class="s1">convertToImage();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">showAlertHeader() {</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.hasClockAlert()) {</span>
<span class="s2">long </span><span class="s1">time = System.currentTimeMillis();</span>
<span class="s2">if </span><span class="s1">(time &gt; mWorkingNote.getAlertDate()) {</span>
<span class="s1">mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString(</span>
<span class="s1">mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS));</span>
<span class="s1">}</span>
<span class="s1">mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE);</span>
<span class="s1">mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE);</span>
<span class="s1">mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE);</span>
<span class="s1">};</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">convertToImage() {</span>
<span class="s1">NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view); </span><span class="s0">//获取当前的edit</span>
<span class="s1">Editable editable = noteEditText.getText();</span><span class="s0">//1.获取text</span>
<span class="s1">String noteText = editable.toString(); </span><span class="s0">//2.将note内容转换为字符串</span>
<span class="s2">int </span><span class="s1">length = editable.length(); </span><span class="s0">//内容的长度</span>
<span class="s0">//3.截取img片段 [local]+uri+[local]提取uri</span>
<span class="s2">for</span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s4">0</span><span class="s1">; i &lt; length; i++) {</span>
<span class="s2">for</span><span class="s1">(</span><span class="s2">int </span><span class="s1">j = i; j &lt; length; j++) {</span>
<span class="s1">String img_fragment = noteText.substring(i, j+</span><span class="s4">1</span><span class="s1">); </span><span class="s0">//img_fragment关于图片路径的片段</span>
<span class="s2">if</span><span class="s1">(img_fragment.length() &gt; </span><span class="s4">15 </span><span class="s1">&amp;&amp; img_fragment.endsWith(</span><span class="s3">&quot;[/local]&quot;</span><span class="s1">) &amp;&amp; img_fragment.startsWith(</span><span class="s3">&quot;[local]&quot;</span><span class="s1">)){</span>
<span class="s2">int </span><span class="s1">limit = </span><span class="s4">7</span><span class="s1">; </span><span class="s0">//[local]为7个字符</span>
<span class="s0">//[local][/local]共15个字符剩下的为真正的path长度</span>
<span class="s2">int </span><span class="s1">len = img_fragment.length()-</span><span class="s4">15</span><span class="s1">;</span>
<span class="s0">//从[local]之后的len个字符就是path</span>
<span class="s1">String path = img_fragment.substring(limit,limit+len);</span><span class="s0">//获取到了图片路径</span>
<span class="s1">Bitmap bitmap = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;图片的路径是:&quot;</span><span class="s1">+path);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">bitmap = BitmapFactory.decodeFile(path);</span><span class="s0">//将图片路径解码为图片格式</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(Exception e) {</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s2">if</span><span class="s1">(bitmap!=</span><span class="s2">null</span><span class="s1">){ </span><span class="s0">//若图片存在</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;图片不为null&quot;</span><span class="s1">);</span>
<span class="s1">ImageSpan imageSpan = </span><span class="s2">new </span><span class="s1">ImageSpan(NoteEditActivity.</span><span class="s2">this</span><span class="s1">, bitmap);</span>
<span class="s0">//4.创建一个SpannableString对象以便插入用ImageSpan对象封装的图像</span>
<span class="s1">String ss = </span><span class="s3">&quot;[local]&quot; </span><span class="s1">+ path + </span><span class="s3">&quot;[/local]&quot;</span><span class="s1">;</span>
<span class="s1">SpannableString spannableString = </span><span class="s2">new </span><span class="s1">SpannableString(ss);</span>
<span class="s0">//5.将指定的标记对象附加到文本的开始...结束范围</span>
<span class="s1">spannableString.setSpan(imageSpan, </span><span class="s4">0</span><span class="s1">, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Create spannable string success!&quot;</span><span class="s1">);</span>
<span class="s1">Editable edit_text = noteEditText.getEditableText();</span>
<span class="s1">edit_text.delete(i,i+len+</span><span class="s4">15</span><span class="s1">); </span><span class="s0">//6.删掉图片路径的文字</span>
<span class="s1">edit_text.insert(i, spannableString); </span><span class="s0">//7.在路径的起始位置插入图片</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onNewIntent(Intent intent) {</span>
<span class="s2">super</span><span class="s1">.onNewIntent(intent);</span>
<span class="s1">initActivityState(intent);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onSaveInstanceState(Bundle outState) {</span>
<span class="s2">super</span><span class="s1">.onSaveInstanceState(outState);</span>
<span class="s0">/**</span>
<span class="s0">* For new note without note id, we should firstly save it to</span>
<span class="s0">* generate a id. If the editing note is not worth saving, there</span>
<span class="s0">* is no id which is equivalent to create new note</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(!mWorkingNote.existInDatabase()) {</span>
<span class="s1">saveNote();</span>
<span class="s1">}</span>
<span class="s1">outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId());</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Save working note id: &quot; </span><span class="s1">+ mWorkingNote.getNoteId() + </span><span class="s3">&quot; onSaveInstanceState&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">dispatchTouchEvent(MotionEvent ev) {</span>
<span class="s2">if </span><span class="s1">(mNoteBgColorSelector.getVisibility() == View.VISIBLE</span>
<span class="s1">&amp;&amp; !inRangeOfView(mNoteBgColorSelector, ev)) {</span>
<span class="s1">mNoteBgColorSelector.setVisibility(View.GONE);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mFontSizeSelector.getVisibility() == View.VISIBLE</span>
<span class="s1">&amp;&amp; !inRangeOfView(mFontSizeSelector, ev)) {</span>
<span class="s1">mFontSizeSelector.setVisibility(View.GONE);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return super</span><span class="s1">.dispatchTouchEvent(ev);</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">inRangeOfView(View view, MotionEvent ev) {</span>
<span class="s2">int </span><span class="s1">[]location = </span><span class="s2">new int</span><span class="s1">[</span><span class="s4">2</span><span class="s1">];</span>
<span class="s1">view.getLocationOnScreen(location);</span>
<span class="s2">int </span><span class="s1">x = location[</span><span class="s4">0</span><span class="s1">];</span>
<span class="s2">int </span><span class="s1">y = location[</span><span class="s4">1</span><span class="s1">];</span>
<span class="s2">if </span><span class="s1">(ev.getX() &lt; x</span>
<span class="s1">|| ev.getX() &gt; (x + view.getWidth())</span>
<span class="s1">|| ev.getY() &lt; y</span>
<span class="s1">|| ev.getY() &gt; (y + view.getHeight())) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">initResources() {</span>
<span class="s1">mHeadViewPanel = findViewById(R.id.note_title);</span>
<span class="s1">mNoteHeaderHolder = </span><span class="s2">new </span><span class="s1">HeadViewHolder();</span>
<span class="s1">mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date);</span>
<span class="s1">mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon);</span>
<span class="s1">mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date);</span>
<span class="s1">mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color);</span>
<span class="s1">mNoteHeaderHolder.ibSetBgColor.setOnClickListener(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">mNoteEditor = (EditText) findViewById(R.id.note_edit_view);</span>
<span class="s1">mNoteEditorPanel = findViewById(R.id.sv_note_edit);</span>
<span class="s1">mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">id : sBgSelectorBtnsMap.keySet()) {</span>
<span class="s1">ImageView iv = (ImageView) findViewById(id);</span>
<span class="s1">iv.setOnClickListener(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">mFontSizeSelector = findViewById(R.id.font_size_selector);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">id : sFontSizeBtnsMap.keySet()) {</span>
<span class="s1">View view = findViewById(id);</span>
<span class="s1">view.setOnClickListener(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">};</span>
<span class="s1">mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE);</span>
<span class="s0">/**</span>
<span class="s0">* HACKME: Fix bug of store the resource id in shared preference.</span>
<span class="s0">* The id may larger than the length of resources, in this case,</span>
<span class="s0">* return the {</span><span class="s6">@link </span><span class="s0">ResourceParser#BG_DEFAULT_FONT_SIZE}</span>
<span class="s0">*/</span>
<span class="s2">if</span><span class="s1">(mFontSizeId &gt;= TextAppearanceResources.getResourcesSize()) {</span>
<span class="s1">mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;</span>
<span class="s1">}</span>
<span class="s1">mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onPause() {</span>
<span class="s2">super</span><span class="s1">.onPause();</span>
<span class="s2">if</span><span class="s1">(saveNote()) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Note data was saved with length:&quot; </span><span class="s1">+ mWorkingNote.getContent().length());</span>
<span class="s1">}</span>
<span class="s1">clearSettingState();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateWidget() {</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {</span>
<span class="s1">intent.setClass(</span><span class="s2">this</span><span class="s1">, NoteWidgetProvider_2x.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) {</span>
<span class="s1">intent.setClass(</span><span class="s2">this</span><span class="s1">, NoteWidgetProvider_4x.</span><span class="s2">class</span><span class="s1">);</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;Unspported widget type&quot;</span><span class="s1">);</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, </span><span class="s2">new int</span><span class="s1">[] {</span>
<span class="s1">mWorkingNote.getWidgetId()</span>
<span class="s1">});</span>
<span class="s1">sendBroadcast(intent);</span>
<span class="s1">setResult(RESULT_OK, intent);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onClick(View v) {</span>
<span class="s2">int </span><span class="s1">id = v.getId();</span>
<span class="s2">if </span><span class="s1">(id == R.id.btn_set_bg_color) {</span>
<span class="s1">mNoteBgColorSelector.setVisibility(View.VISIBLE);</span>
<span class="s1">findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(</span>
<span class="s1">View.VISIBLE);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(sBgSelectorBtnsMap.containsKey(id)) {</span>
<span class="s1">findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(</span>
<span class="s1">View.GONE);</span>
<span class="s1">mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));</span>
<span class="s1">mNoteBgColorSelector.setVisibility(View.GONE);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(sFontSizeBtnsMap.containsKey(id)) {</span>
<span class="s1">findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);</span>
<span class="s1">mFontSizeId = sFontSizeBtnsMap.get(id);</span>
<span class="s1">mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit();</span>
<span class="s1">findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {</span>
<span class="s1">getWorkingText();</span>
<span class="s1">switchToListMode(mWorkingNote.getContent());</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mNoteEditor.setTextAppearance(</span><span class="s2">this</span><span class="s1">,</span>
<span class="s1">TextAppearanceResources.getTexAppearanceResource(mFontSizeId));</span>
<span class="s1">}</span>
<span class="s1">mFontSizeSelector.setVisibility(View.GONE);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onBackPressed() {</span>
<span class="s2">if</span><span class="s1">(clearSettingState()) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">saveNote();</span>
<span class="s2">super</span><span class="s1">.onBackPressed();</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">clearSettingState() {</span>
<span class="s2">if </span><span class="s1">(mNoteBgColorSelector.getVisibility() == View.VISIBLE) {</span>
<span class="s1">mNoteBgColorSelector.setVisibility(View.GONE);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(mFontSizeSelector.getVisibility() == View.VISIBLE) {</span>
<span class="s1">mFontSizeSelector.setVisibility(View.GONE);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onBackgroundColorChanged() {</span>
<span class="s1">findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(</span>
<span class="s1">View.VISIBLE);</span>
<span class="s1">mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());</span>
<span class="s1">mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">onPrepareOptionsMenu(Menu menu) {</span>
<span class="s2">if </span><span class="s1">(isFinishing()) {</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">clearSettingState();</span>
<span class="s1">menu.clear();</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) {</span>
<span class="s1">getMenuInflater().inflate(R.menu.call_note_edit, menu);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">getMenuInflater().inflate(R.menu.note_edit, menu);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {</span>
<span class="s1">menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.hasClockAlert()) {</span>
<span class="s1">menu.findItem(R.id.menu_alert).setVisible(</span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">menu.findItem(R.id.menu_delete_remind).setVisible(</span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">onOptionsItemSelected(MenuItem item) {</span>
<span class="s2">switch </span><span class="s1">(item.getItemId()) {</span>
<span class="s2">case </span><span class="s1">R.id.menu_new_note:</span>
<span class="s1">createNewNote();</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">R.id.menu_delete:</span>
<span class="s1">AlertDialog.Builder builder = </span><span class="s2">new </span><span class="s1">AlertDialog.Builder(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">builder.setTitle(getString(R.string.alert_title_delete));</span>
<span class="s1">builder.setIcon(android.R.drawable.ic_dialog_alert);</span>
<span class="s1">builder.setMessage(getString(R.string.alert_message_delete_note));</span>
<span class="s1">builder.setPositiveButton(android.R.string.ok,</span>
<span class="s2">new </span><span class="s1">DialogInterface.OnClickListener() {</span>
<span class="s2">public void </span><span class="s1">onClick(DialogInterface dialog, </span><span class="s2">int </span><span class="s1">which) {</span>
<span class="s1">deleteCurrentNote();</span>
<span class="s1">finish();</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">builder.setNegativeButton(android.R.string.cancel, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">builder.show();</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">R.id.menu_font_size:</span>
<span class="s1">mFontSizeSelector.setVisibility(View.VISIBLE);</span>
<span class="s1">findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">R.id.menu_list_mode:</span>
<span class="s1">mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == </span><span class="s4">0 </span><span class="s1">?</span>
<span class="s1">TextNote.MODE_CHECK_LIST : </span><span class="s4">0</span><span class="s1">);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">R.id.menu_share:</span>
<span class="s1">getWorkingText();</span>
<span class="s1">sendTo(</span><span class="s2">this</span><span class="s1">, mWorkingNote.getContent());</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">R.id.menu_send_to_desktop:</span>
<span class="s1">sendToDesktop();</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">R.id.menu_alert:</span>
<span class="s1">setReminder();</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">R.id.menu_delete_remind:</span>
<span class="s1">mWorkingNote.setAlertDate(</span><span class="s4">0</span><span class="s1">, </span><span class="s2">false</span><span class="s1">);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">setReminder() {</span>
<span class="s1">DateTimePickerDialog d = </span><span class="s2">new </span><span class="s1">DateTimePickerDialog(</span><span class="s2">this</span><span class="s1">, System.currentTimeMillis());</span>
<span class="s1">d.setOnDateTimeSetListener(</span><span class="s2">new </span><span class="s1">OnDateTimeSetListener() {</span>
<span class="s2">public void </span><span class="s1">OnDateTimeSet(AlertDialog dialog, </span><span class="s2">long </span><span class="s1">date) {</span>
<span class="s1">mWorkingNote.setAlertDate(date , </span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">d.show();</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Share note to apps that support {</span><span class="s6">@link </span><span class="s0">Intent#ACTION_SEND} action</span>
<span class="s0">* and {</span><span class="s6">@text/plain</span><span class="s0">} type</span>
<span class="s0">*/</span>
<span class="s2">private void </span><span class="s1">sendTo(Context context, String info) {</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(Intent.ACTION_SEND);</span>
<span class="s1">intent.putExtra(Intent.EXTRA_TEXT, info);</span>
<span class="s1">intent.setType(</span><span class="s3">&quot;text/plain&quot;</span><span class="s1">);</span>
<span class="s1">context.startActivity(intent);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">createNewNote() {</span>
<span class="s0">// Firstly, save current editing notes</span>
<span class="s1">saveNote();</span>
<span class="s0">// For safety, start a new NoteEditActivity</span>
<span class="s1">finish();</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(</span><span class="s2">this</span><span class="s1">, NoteEditActivity.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.setAction(Intent.ACTION_INSERT_OR_EDIT);</span>
<span class="s1">intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId());</span>
<span class="s1">startActivity(intent);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">deleteCurrentNote() {</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.existInDatabase()) {</span>
<span class="s1">HashSet&lt;Long&gt; ids = </span><span class="s2">new </span><span class="s1">HashSet&lt;Long&gt;();</span>
<span class="s2">long </span><span class="s1">id = mWorkingNote.getNoteId();</span>
<span class="s2">if </span><span class="s1">(id != Notes.ID_ROOT_FOLDER) {</span>
<span class="s1">ids.add(id);</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 id, should not happen&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!isSyncMode()) {</span>
<span class="s2">if </span><span class="s1">(!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Delete Note error&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Move notes to trash folder error, should not happens&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mWorkingNote.markDeleted(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">isSyncMode() {</span>
<span class="s2">return </span><span class="s1">NotesPreferenceActivity.getSyncAccountName(</span><span class="s2">this</span><span class="s1">).trim().length() &gt; </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public 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">* User could set clock to an unsaved note, so before setting the</span>
<span class="s0">* alert clock, we should save the note first</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(!mWorkingNote.existInDatabase()) {</span>
<span class="s1">saveNote();</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getNoteId() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(</span><span class="s2">this</span><span class="s1">, AlarmReceiver.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId()));</span>
<span class="s1">PendingIntent pendingIntent = PendingIntent.getBroadcast(</span><span class="s2">this</span><span class="s1">, </span><span class="s4">0</span><span class="s1">, intent, PendingIntent.FLAG_IMMUTABLE);</span>
<span class="s1">AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE));</span>
<span class="s1">showAlertHeader();</span>
<span class="s2">if</span><span class="s1">(!set) {</span>
<span class="s1">alarmManager.cancel(pendingIntent);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">/**</span>
<span class="s0">* There is the condition that user has input nothing (the note is</span>
<span class="s0">* not worthy saving), we have no note id, remind the user that he</span>
<span class="s0">* should input something</span>
<span class="s0">*/</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Clock alert setting error&quot;</span><span class="s1">);</span>
<span class="s1">showToast(R.string.error_note_empty_for_clock);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onWidgetChanged() {</span>
<span class="s1">updateWidget();</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onEditTextDelete(</span><span class="s2">int </span><span class="s1">index, String text) {</span>
<span class="s2">int </span><span class="s1">childCount = mEditTextList.getChildCount();</span>
<span class="s2">if </span><span class="s1">(childCount == </span><span class="s4">1</span><span class="s1">) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = index + </span><span class="s4">1</span><span class="s1">; i &lt; childCount; i++) {</span>
<span class="s1">((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text))</span>
<span class="s1">.setIndex(i - </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">mEditTextList.removeViewAt(index);</span>
<span class="s1">NoteEditText edit = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if</span><span class="s1">(index == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">edit = (NoteEditText) mEditTextList.getChildAt(</span><span class="s4">0</span><span class="s1">).findViewById(</span>
<span class="s1">R.id.et_edit_text);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">edit = (NoteEditText) mEditTextList.getChildAt(index - </span><span class="s4">1</span><span class="s1">).findViewById(</span>
<span class="s1">R.id.et_edit_text);</span>
<span class="s1">}</span>
<span class="s2">int </span><span class="s1">length = edit.length();</span>
<span class="s1">edit.append(text);</span>
<span class="s1">edit.requestFocus();</span>
<span class="s1">edit.setSelection(length);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onEditTextEnter(</span><span class="s2">int </span><span class="s1">index, String text) {</span>
<span class="s0">/**</span>
<span class="s0">* Should not happen, check for debug</span>
<span class="s0">*/</span>
<span class="s2">if</span><span class="s1">(index &gt; mEditTextList.getChildCount()) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Index out of mEditTextList boundrary, should not happen&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">View view = getListItem(text, index);</span>
<span class="s1">mEditTextList.addView(view, index);</span>
<span class="s1">NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);</span>
<span class="s1">edit.requestFocus();</span>
<span class="s1">edit.setSelection(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = index + </span><span class="s4">1</span><span class="s1">; i &lt; mEditTextList.getChildCount(); i++) {</span>
<span class="s1">((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text))</span>
<span class="s1">.setIndex(i);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">switchToListMode(String text) {</span>
<span class="s1">mEditTextList.removeAllViews();</span>
<span class="s1">String[] items = text.split(</span><span class="s3">&quot;</span><span class="s5">\n</span><span class="s3">&quot;</span><span class="s1">);</span>
<span class="s2">int </span><span class="s1">index = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">for </span><span class="s1">(String item : items) {</span>
<span class="s2">if</span><span class="s1">(!TextUtils.isEmpty(item)) {</span>
<span class="s1">mEditTextList.addView(getListItem(item, index));</span>
<span class="s1">index++;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mEditTextList.addView(getListItem(</span><span class="s3">&quot;&quot;</span><span class="s1">, index));</span>
<span class="s1">mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus();</span>
<span class="s1">mNoteEditor.setVisibility(View.GONE);</span>
<span class="s1">mEditTextList.setVisibility(View.VISIBLE);</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">Spannable getHighlightQueryResult(String fullText, String userQuery) {</span>
<span class="s1">SpannableString spannable = </span><span class="s2">new </span><span class="s1">SpannableString(fullText == </span><span class="s2">null </span><span class="s1">? </span><span class="s3">&quot;&quot; </span><span class="s1">: fullText);</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(userQuery)) {</span>
<span class="s1">mPattern = Pattern.compile(userQuery);</span>
<span class="s1">Matcher m = mPattern.matcher(fullText);</span>
<span class="s2">int </span><span class="s1">start = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">while </span><span class="s1">(m.find(start)) {</span>
<span class="s1">spannable.setSpan(</span>
<span class="s2">new </span><span class="s1">BackgroundColorSpan(</span><span class="s2">this</span><span class="s1">.getResources().getColor(</span>
<span class="s1">R.color.user_query_highlight)), m.start(), m.end(),</span>
<span class="s1">Spannable.SPAN_INCLUSIVE_EXCLUSIVE);</span>
<span class="s1">start = m.end();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">spannable;</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">View getListItem(String item, </span><span class="s2">int </span><span class="s1">index) {</span>
<span class="s1">View view = LayoutInflater.from(</span><span class="s2">this</span><span class="s1">).inflate(R.layout.note_edit_list_item, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">final </span><span class="s1">NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);</span>
<span class="s1">edit.setTextAppearance(</span><span class="s2">this</span><span class="s1">, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));</span>
<span class="s1">CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item));</span>
<span class="s1">cb.setOnCheckedChangeListener(</span><span class="s2">new </span><span class="s1">OnCheckedChangeListener() {</span>
<span class="s2">public void </span><span class="s1">onCheckedChanged(CompoundButton buttonView, </span><span class="s2">boolean </span><span class="s1">isChecked) {</span>
<span class="s2">if </span><span class="s1">(isChecked) {</span>
<span class="s1">edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s2">if </span><span class="s1">(item.startsWith(TAG_CHECKED)) {</span>
<span class="s1">cb.setChecked(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);</span>
<span class="s1">item = item.substring(TAG_CHECKED.length(), item.length()).trim();</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(item.startsWith(TAG_UNCHECKED)) {</span>
<span class="s1">cb.setChecked(</span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);</span>
<span class="s1">item = item.substring(TAG_UNCHECKED.length(), item.length()).trim();</span>
<span class="s1">}</span>
<span class="s1">edit.setOnTextViewChangeListener(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">edit.setIndex(index);</span>
<span class="s1">edit.setText(getHighlightQueryResult(item, mUserQuery));</span>
<span class="s2">return </span><span class="s1">view;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onTextChange(</span><span class="s2">int </span><span class="s1">index, </span><span class="s2">boolean </span><span class="s1">hasText) {</span>
<span class="s2">if </span><span class="s1">(index &gt;= mEditTextList.getChildCount()) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Wrong index, should not happen&quot;</span><span class="s1">);</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if</span><span class="s1">(hasText) {</span>
<span class="s1">mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public 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="s2">if </span><span class="s1">(newMode == TextNote.MODE_CHECK_LIST) {</span>
<span class="s1">switchToListMode(mNoteEditor.getText().toString());</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(!getWorkingText()) {</span>
<span class="s1">mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + </span><span class="s3">&quot; &quot;</span><span class="s1">,</span>
<span class="s3">&quot;&quot;</span><span class="s1">));</span>
<span class="s1">}</span>
<span class="s1">mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));</span>
<span class="s1">mEditTextList.setVisibility(View.GONE);</span>
<span class="s1">mNoteEditor.setVisibility(View.VISIBLE);</span>
<span class="s1">convertToImage();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">getWorkingText() {</span>
<span class="s2">boolean </span><span class="s1">hasChecked = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {</span>
<span class="s1">StringBuilder sb = </span><span class="s2">new </span><span class="s1">StringBuilder();</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s4">0</span><span class="s1">; i &lt; mEditTextList.getChildCount(); i++) {</span>
<span class="s1">View view = mEditTextList.getChildAt(i);</span>
<span class="s1">NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(edit.getText())) {</span>
<span class="s2">if </span><span class="s1">(((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) {</span>
<span class="s1">sb.append(TAG_CHECKED).append(</span><span class="s3">&quot; &quot;</span><span class="s1">).append(edit.getText()).append(</span><span class="s3">&quot;</span><span class="s5">\n</span><span class="s3">&quot;</span><span class="s1">);</span>
<span class="s1">hasChecked = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">sb.append(TAG_UNCHECKED).append(</span><span class="s3">&quot; &quot;</span><span class="s1">).append(edit.getText()).append(</span><span class="s3">&quot;</span><span class="s5">\n</span><span class="s3">&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mWorkingNote.setWorkingText(sb.toString());</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mWorkingNote.setWorkingText(mNoteEditor.getText().toString());</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">hasChecked;</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">saveNote() {</span>
<span class="s1">getWorkingText();</span>
<span class="s2">boolean </span><span class="s1">saved = mWorkingNote.saveNote();</span>
<span class="s2">if </span><span class="s1">(saved) {</span>
<span class="s0">/**</span>
<span class="s0">* There are two modes from List view to edit view, open one note,</span>
<span class="s0">* create/edit a node. Opening node requires to the original</span>
<span class="s0">* position in the list when back from edit view, while creating a</span>
<span class="s0">* new node requires to the top of the list. This code</span>
<span class="s0">* {</span><span class="s6">@link </span><span class="s0">#RESULT_OK} is used to identify the create/edit state</span>
<span class="s0">*/</span>
<span class="s1">setResult(RESULT_OK);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">saved;</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">sendToDesktop() {</span>
<span class="s0">/**</span>
<span class="s0">* Before send message to home, we should make sure that current</span>
<span class="s0">* editing note is exists in databases. So, for new note, firstly</span>
<span class="s0">* save it</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(!mWorkingNote.existInDatabase()) {</span>
<span class="s1">saveNote();</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mWorkingNote.getNoteId() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Intent sender = </span><span class="s2">new </span><span class="s1">Intent();</span>
<span class="s1">Intent shortcutIntent = </span><span class="s2">new </span><span class="s1">Intent(</span><span class="s2">this</span><span class="s1">, NoteEditActivity.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">shortcutIntent.setAction(Intent.ACTION_VIEW);</span>
<span class="s1">shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId());</span>
<span class="s1">sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);</span>
<span class="s1">sender.putExtra(Intent.EXTRA_SHORTCUT_NAME,</span>
<span class="s1">makeShortcutIconTitle(mWorkingNote.getContent()));</span>
<span class="s1">sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,</span>
<span class="s1">Intent.ShortcutIconResource.fromContext(</span><span class="s2">this</span><span class="s1">, R.drawable.icon_app));</span>
<span class="s1">sender.putExtra(</span><span class="s3">&quot;duplicate&quot;</span><span class="s1">, </span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">sender.setAction(</span><span class="s3">&quot;com.android.launcher.action.INSTALL_SHORTCUT&quot;</span><span class="s1">);</span>
<span class="s1">showToast(R.string.info_note_enter_desktop);</span>
<span class="s1">sendBroadcast(sender);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">/**</span>
<span class="s0">* There is the condition that user has input nothing (the note is</span>
<span class="s0">* not worthy saving), we have no note id, remind the user that he</span>
<span class="s0">* should input something</span>
<span class="s0">*/</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Send to desktop error&quot;</span><span class="s1">);</span>
<span class="s1">showToast(R.string.error_note_empty_for_send_to_desktop);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">String makeShortcutIconTitle(String content) {</span>
<span class="s1">content = content.replace(TAG_CHECKED, </span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">content = content.replace(TAG_UNCHECKED, </span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">content.length() &gt; SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(</span><span class="s4">0</span><span class="s1">,</span>
<span class="s1">SHORTCUT_ICON_TITLE_MAX_LEN) : content;</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">showToast(</span><span class="s2">int </span><span class="s1">resId) {</span>
<span class="s1">showToast(resId, Toast.LENGTH_SHORT);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">showToast(</span><span class="s2">int </span><span class="s1">resId, </span><span class="s2">int </span><span class="s1">duration) {</span>
<span class="s1">Toast.makeText(</span><span class="s2">this</span><span class="s1">, resId, duration).show();</span>
<span class="s1">}</span>
<span class="s0">//获取文件的real path</span>
<span class="s2">public </span><span class="s1">String getPath(</span><span class="s2">final </span><span class="s1">Context context, </span><span class="s2">final </span><span class="s1">Uri uri) {</span>
<span class="s0">// final boolean isKitKat;</span>
<span class="s0">// if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.KITKAT) isKitKat = true;</span>
<span class="s0">// else isKitKat = false;</span>
<span class="s2">final boolean </span><span class="s1">isKitKat = android.os.Build.VERSION.SDK_INT &gt;= android.os.Build.VERSION_CODES.KITKAT;</span>
<span class="s0">// DocumentProvider</span>
<span class="s2">if </span><span class="s1">(isKitKat &amp;&amp; DocumentsContract.isDocumentUri(context, uri)) {</span>
<span class="s0">// ExternalStorageProvider</span>
<span class="s0">// if (isExternalStorageDocument(uri)) {</span>
<span class="s0">// final String docId = DocumentsContract.getDocumentId(uri);</span>
<span class="s0">// final String[] split = docId.split(&quot;:&quot;);</span>
<span class="s0">// final String type = split[0];</span>
<span class="s0">//</span>
<span class="s0">// if (&quot;primary&quot;.equalsIgnoreCase(type)) {</span>
<span class="s0">// return Environment.getExternalStorageDirectory() + &quot;/&quot; + split[1];</span>
<span class="s0">// }</span>
<span class="s0">// }</span>
<span class="s0">// // DownloadsProvider</span>
<span class="s0">// else if (isDownloadsDocument(uri)) {</span>
<span class="s0">// final String id = DocumentsContract.getDocumentId(uri);</span>
<span class="s0">// final Uri contentUri = ContentUris.withAppendedId(Uri.parse(&quot;content://downloads/public_downloads&quot;), Long.valueOf(id));</span>
<span class="s0">// return getDataColumn(context, contentUri, null, null);</span>
<span class="s0">// }</span>
<span class="s0">// MediaProvider</span>
<span class="s0">// else</span>
<span class="s2">if </span><span class="s1">(isMediaDocument(uri)) {</span>
<span class="s2">final </span><span class="s1">String docId = DocumentsContract.getDocumentId(uri);</span>
<span class="s2">final </span><span class="s1">String[] split = docId.split(</span><span class="s3">&quot;:&quot;</span><span class="s1">);</span>
<span class="s2">final </span><span class="s1">String type = split[</span><span class="s4">0</span><span class="s1">];</span>
<span class="s1">Uri contentUri = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(</span><span class="s3">&quot;image&quot;</span><span class="s1">.equals(type)) {</span>
<span class="s1">contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;</span>
<span class="s1">}</span>
<span class="s2">final </span><span class="s1">String selection = </span><span class="s3">&quot;_id=?&quot;</span><span class="s1">;</span>
<span class="s2">final </span><span class="s1">String[] selectionArgs = </span><span class="s2">new </span><span class="s1">String[]{split[</span><span class="s4">1</span><span class="s1">]};</span>
<span class="s2">return </span><span class="s1">getDataColumn(context, contentUri, selection, selectionArgs);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// Media</span>
<span class="s2">else if </span><span class="s1">(</span><span class="s3">&quot;content&quot;</span><span class="s1">.equalsIgnoreCase(uri.getScheme())) {</span>
<span class="s2">return </span><span class="s1">getDataColumn(context, uri, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s0">// File</span>
<span class="s2">else if </span><span class="s1">(</span><span class="s3">&quot;file&quot;</span><span class="s1">.equalsIgnoreCase(uri.getScheme())) {</span>
<span class="s2">return </span><span class="s1">uri.getPath();</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">//获取数据列_获取此 Uri 的数据列的值。这对MediaStore Uris 和其他基于文件的 ContentProvider。</span>
<span class="s2">public </span><span class="s1">String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {</span>
<span class="s1">Cursor cursor = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">final </span><span class="s1">String column = </span><span class="s3">&quot;_data&quot;</span><span class="s1">;</span>
<span class="s2">final </span><span class="s1">String[] projection = {column};</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, </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">&amp;&amp; cursor.moveToFirst()) {</span>
<span class="s2">final int </span><span class="s1">column_index = cursor.getColumnIndexOrThrow(column);</span>
<span class="s2">return </span><span class="s1">cursor.getString(column_index);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </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="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">//是否为外部存储文件</span>
<span class="s0">// public boolean isExternalStorageDocument(Uri uri) {</span>
<span class="s0">// return &quot;com.android.externalstorage.documents&quot;.equals(uri.getAuthority());</span>
<span class="s0">// }</span>
<span class="s0">//</span>
<span class="s0">// //是否为下载文件</span>
<span class="s0">// public boolean isDownloadsDocument(Uri uri) {</span>
<span class="s0">// return &quot;com.android.providers.downloads.documents&quot;.equals(uri.getAuthority());</span>
<span class="s0">// }</span>
<span class="s0">//是否为媒体文件</span>
<span class="s2">public boolean </span><span class="s1">isMediaDocument(Uri uri) {</span>
<span class="s2">return </span><span class="s3">&quot;com.android.providers.media.documents&quot;</span><span class="s1">.equals(uri.getAuthority());</span>
<span class="s1">}</span>
<span class="s2">protected void </span><span class="s1">onActivityResult(</span><span class="s2">int </span><span class="s1">requestCode, </span><span class="s2">int </span><span class="s1">resultCode, Intent intent) {</span>
<span class="s2">super</span><span class="s1">.onActivityResult(requestCode, resultCode, intent);</span>
<span class="s1">ContentResolver resolver = getContentResolver();</span>
<span class="s2">switch </span><span class="s1">(requestCode) {</span>
<span class="s2">case </span><span class="s1">PHOTO_REQUEST:</span>
<span class="s1">Uri originalUri = intent.getData(); </span><span class="s0">//1.获得图片的真实路径</span>
<span class="s1">Bitmap bitmap = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">bitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));</span><span class="s0">//2.解码图片</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(FileNotFoundException e) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;onActivityResult: get file_exception&quot;</span><span class="s1">);</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(bitmap != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s0">//3.根据Bitmap对象创建ImageSpan对象</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;onActivityResult: bitmap is not null&quot;</span><span class="s1">);</span>
<span class="s1">ImageSpan imageSpan = </span><span class="s2">new </span><span class="s1">ImageSpan(NoteEditActivity.</span><span class="s2">this</span><span class="s1">, bitmap);</span>
<span class="s1">String path = getPath(</span><span class="s2">this</span><span class="s1">, originalUri);</span>
<span class="s0">//4.使用[local][/local]将path括起来用于之后方便识别图片路径在note中的位置</span>
<span class="s1">String img_fragment = </span><span class="s3">&quot;[local]&quot; </span><span class="s1">+ path + </span><span class="s3">&quot;[/local]&quot;</span><span class="s1">;</span>
<span class="s0">//创建一个SpannableString对象以便插入用ImageSpan对象封装的图像</span>
<span class="s1">SpannableString spannableString = </span><span class="s2">new </span><span class="s1">SpannableString(img_fragment);</span>
<span class="s1">spannableString.setSpan(imageSpan, </span><span class="s4">0</span><span class="s1">, img_fragment.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);</span>
<span class="s0">//5.将选择的图片追加到EditText中光标所在位置</span>
<span class="s1">NoteEditText e = (NoteEditText) findViewById(R.id.note_edit_view);</span>
<span class="s2">int </span><span class="s1">index = e.getSelectionStart(); </span><span class="s0">//获取光标所在位置</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Index是: &quot; </span><span class="s1">+ index);</span>
<span class="s1">Editable edit_text = e.getEditableText();</span>
<span class="s1">edit_text.insert(index, spannableString); </span><span class="s0">//将图片插入到光标所在位置</span>
<span class="s1">mWorkingNote.mContent = e.getText().toString();</span>
<span class="s0">//6.把改动提交到数据库中,两个数据库表都要改的</span>
<span class="s1">ContentResolver contentResolver = getContentResolver();</span>
<span class="s1">ContentValues contentValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s2">final long </span><span class="s1">id = mWorkingNote.getNoteId();</span>
<span class="s1">contentValues.put(</span><span class="s3">&quot;snippet&quot;</span><span class="s1">, mWorkingNote.mContent);</span>
<span class="s1">contentResolver.update(Uri.parse(</span><span class="s3">&quot;content://micode_notes/note&quot;</span><span class="s1">), contentValues, </span><span class="s3">&quot;_id=?&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[]{</span><span class="s3">&quot;&quot; </span><span class="s1">+ id});</span>
<span class="s1">ContentValues contentValues1 = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">contentValues1.put(</span><span class="s3">&quot;content&quot;</span><span class="s1">, mWorkingNote.mContent);</span>
<span class="s1">contentResolver.update(Uri.parse(</span><span class="s3">&quot;content://micode_notes/data&quot;</span><span class="s1">), contentValues1, </span><span class="s3">&quot;mime_type=? and note_id=?&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[]{</span><span class="s3">&quot;vnd.android.cursor.item/text_note&quot;</span><span class="s1">, </span><span class="s3">&quot;&quot; </span><span class="s1">+ id});</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Toast.makeText(NoteEditActivity.</span><span class="s2">this</span><span class="s1">, </span><span class="s3">&quot;获取图片失败&quot;</span><span class="s1">, Toast.LENGTH_SHORT).show();</span>
<span class="s1">}</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">//</span>
<span class="s1">}</span>
</pre>
</body>
</html>