|
|
<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 "License");
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
* You may obtain a copy of the License at
|
|
|
*
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
*
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
* See the License for the specific language governing permissions and
|
|
|
* limitations under the License.
|
|
|
*/</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<Integer, Integer> sBgSelectorBtnsMap = </span><span class="s2">new </span><span class="s1">HashMap<Integer, Integer>();</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<Integer, Integer> sBgSelectorSelectionMap = </span><span class="s2">new </span><span class="s1">HashMap<Integer, Integer>();</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<Integer, Integer> sFontSizeBtnsMap = </span><span class="s2">new </span><span class="s1">HashMap<Integer, Integer>();</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<Integer, Integer> sFontSelectorSelectionMap = </span><span class="s2">new </span><span class="s1">HashMap<Integer, Integer>();</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">"NoteEditActivity"</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">"pref_font_size"</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 && !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">&& !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">"onClick: click add image button"</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">"image/*"</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">&& 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">"Restoring from killed activity"</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">""</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">"load note failed with note id" </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">&& 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">"The call record number is null"</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)) > </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">"load call note failed with note id" </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">"Intent not specified action, should not support"</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 > 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 < length; i++) {</span>
|
|
|
<span class="s2">for</span><span class="s1">(</span><span class="s2">int </span><span class="s1">j = i; j < 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() > </span><span class="s4">15 </span><span class="s1">&& img_fragment.endsWith(</span><span class="s3">"[/local]"</span><span class="s1">) && img_fragment.startsWith(</span><span class="s3">"[local]"</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">"图片的路径是:"</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">"图片不为null"</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">"[local]" </span><span class="s1">+ path + </span><span class="s3">"[/local]"</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">"Create spannable string success!"</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">"Save working note id: " </span><span class="s1">+ mWorkingNote.getNoteId() + </span><span class="s3">" onSaveInstanceState"</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">&& !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">&& !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() < x</span>
|
|
|
<span class="s1">|| ev.getX() > (x + view.getWidth())</span>
|
|
|
<span class="s1">|| ev.getY() < y</span>
|
|
|
<span class="s1">|| ev.getY() > (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 >= 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">"Note data was saved with length:" </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">"Unspported widget type"</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">"text/plain"</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<Long> ids = </span><span class="s2">new </span><span class="s1">HashSet<Long>();</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">"Wrong note id, should not happen"</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">"Delete Note error"</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">"Move notes to trash folder error, should not happens"</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() > </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() > </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">"Clock alert setting error"</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 < 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 > mEditTextList.getChildCount()) {</span>
|
|
|
<span class="s1">Log.e(TAG, </span><span class="s3">"Index out of mEditTextList boundrary, should not happen"</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 < 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">"</span><span class="s5">\n</span><span class="s3">"</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">""</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">"" </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 >= mEditTextList.getChildCount()) {</span>
|
|
|
<span class="s1">Log.e(TAG, </span><span class="s3">"Wrong index, should not happen"</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">" "</span><span class="s1">,</span>
|
|
|
<span class="s3">""</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 < 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">" "</span><span class="s1">).append(edit.getText()).append(</span><span class="s3">"</span><span class="s5">\n</span><span class="s3">"</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">" "</span><span class="s1">).append(edit.getText()).append(</span><span class="s3">"</span><span class="s5">\n</span><span class="s3">"</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() > </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">"duplicate"</span><span class="s1">, </span><span class="s2">true</span><span class="s1">);</span>
|
|
|
<span class="s1">sender.setAction(</span><span class="s3">"com.android.launcher.action.INSTALL_SHORTCUT"</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">"Send to desktop error"</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">""</span><span class="s1">);</span>
|
|
|
<span class="s1">content = content.replace(TAG_UNCHECKED, </span><span class="s3">""</span><span class="s1">);</span>
|
|
|
<span class="s2">return </span><span class="s1">content.length() > 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 >= 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 >= android.os.Build.VERSION_CODES.KITKAT;</span>
|
|
|
<span class="s0">// DocumentProvider</span>
|
|
|
<span class="s2">if </span><span class="s1">(isKitKat && 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(":");</span>
|
|
|
<span class="s0">// final String type = split[0];</span>
|
|
|
<span class="s0">//</span>
|
|
|
<span class="s0">// if ("primary".equalsIgnoreCase(type)) {</span>
|
|
|
<span class="s0">// return Environment.getExternalStorageDirectory() + "/" + 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("content://downloads/public_downloads"), 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">":"</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">"image"</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">"_id=?"</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">"content"</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">"file"</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">"_data"</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">&& 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 "com.android.externalstorage.documents".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 "com.android.providers.downloads.documents".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">"com.android.providers.media.documents"</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">"onActivityResult: get file_exception"</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">"onActivityResult: bitmap is not null"</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">"[local]" </span><span class="s1">+ path + </span><span class="s3">"[/local]"</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">"Index是: " </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">"snippet"</span><span class="s1">, mWorkingNote.mContent);</span>
|
|
|
<span class="s1">contentResolver.update(Uri.parse(</span><span class="s3">"content://micode_notes/note"</span><span class="s1">), contentValues, </span><span class="s3">"_id=?"</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[]{</span><span class="s3">"" </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">"content"</span><span class="s1">, mWorkingNote.mContent);</span>
|
|
|
<span class="s1">contentResolver.update(Uri.parse(</span><span class="s3">"content://micode_notes/data"</span><span class="s1">), contentValues1, </span><span class="s3">"mime_type=? and note_id=?"</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[]{</span><span class="s3">"vnd.android.cursor.item/text_note"</span><span class="s1">, </span><span class="s3">"" </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">"获取图片失败"</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> |