diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
index ff1e45b..d7dfe5a 100644
--- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
+++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
@@ -22,19 +22,34 @@ import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.SearchManager;
import android.appwidget.AppWidgetManager;
+import android.content.ContentResolver;
import android.content.ContentUris;
+import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
import android.graphics.Paint;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
import android.preference.PreferenceManager;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
+import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.style.BackgroundColorSpan;
+import android.text.style.ImageSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -43,10 +58,12 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
+import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
+import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -65,6 +82,7 @@ import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
import net.micode.notes.widget.NoteWidgetProvider_2x;
import net.micode.notes.widget.NoteWidgetProvider_4x;
+import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -149,6 +167,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private String mUserQuery;
private Pattern mPattern;
+ private final int PHOTO_REQUEST = 1;//请求码
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -159,12 +179,27 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return;
}
initResources();
+
+
+ //根据id获取添加图片按钮
+ final ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_btn);
+ //为点击图片按钮设置监听器
+ add_img_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Log.d(TAG, "onClick: click add image button");
+ //ACTION_GET_CONTENT: 允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)
+ Intent loadImage = new Intent(Intent.ACTION_GET_CONTENT);
+ //Category属性用于指定当前动作(Action)被执行的环境.
+ //CATEGORY_OPENABLE; 用来指示一个ACTION_GET_CONTENT的intent
+ loadImage.addCategory(Intent.CATEGORY_OPENABLE);
+ loadImage.setType("image/*");
+ startActivityForResult(loadImage, PHOTO_REQUEST);
+ }
+ });
}
- /**
- * Current activity may be killed when the memory is low. Once it is killed, for another time
- * user load this activity, we should restore the former state
- */
+
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
@@ -263,14 +298,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
- protected void onResume() {
+ protected void onResume() {//能获得用户焦点:可以操作
super.onResume();
- initNoteScreen();
+ initNoteScreen();//初始化便签屏幕
}
private void initNoteScreen() {
- mNoteEditor.setTextAppearance(this, TextAppearanceResources
- .getTexAppearanceResource(mFontSizeId));
+ mNoteEditor.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
switchToListMode(mWorkingNote.getContent());
} else {
@@ -288,11 +322,9 @@ public class NoteEditActivity extends Activity implements OnClickListener,
| DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME
| DateUtils.FORMAT_SHOW_YEAR));
- /**
- * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker
- * is not ready
- */
showAlertHeader();
+ //将有图片路径的位置转换为图片
+ convertToImage();
}
//·ַʽ תΪ ͼƬimageʽ
@@ -455,6 +487,47 @@ public class NoteEditActivity extends Activity implements OnClickListener,
};
}
+ //路径字符串格式 转换为 图片image格式
+ private void convertToImage() {
+ NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view); //获取当前的edit
+ Editable editable = noteEditText.getText();//1.获取text
+ String noteText = editable.toString(); //2.将note内容转换为字符串
+ int length = editable.length(); //内容的长度
+ //3.截取img片段 [local]+uri+[local],提取uri
+ for(int i = 0; i < length; i++) {
+ for(int j = i; j < length; j++) {
+ String img_fragment = noteText.substring(i, j+1); //img_fragment:关于图片路径的片段
+ if(img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")){
+ int limit = 7; //[local]为7个字符
+ //[local][/local]共15个字符,剩下的为真正的path长度
+ int len = img_fragment.length()-15;
+ //从[local]之后的len个字符就是path
+ String path = img_fragment.substring(limit,limit+len);//获取到了图片路径
+ Bitmap bitmap = null;
+ Log.d(TAG, "图片的路径是:"+path);
+ try {
+ bitmap = BitmapFactory.decodeFile(path);//将图片路径解码为图片格式
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if(bitmap!=null){ //若图片存在
+ Log.d(TAG, "图片不为null");
+ ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap);
+ //4.创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
+ String ss = "[local]" + path + "[/local]";
+ SpannableString spannableString = new SpannableString(ss);
+ //5.将指定的标记对象附加到文本的开始...结束范围
+ spannableString.setSpan(imageSpan, 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ Log.d(TAG, "Create spannable string success!");
+ Editable edit_text = noteEditText.getEditableText();
+ edit_text.delete(i,i+len+15); //6.删掉图片路径的文字
+ edit_text.insert(i, spannableString); //7.在路径的起始位置插入图片
+ }
+ }
+ }
+ }
+ }
+
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
@@ -501,8 +574,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|| ev.getX() > (x + view.getWidth())
|| ev.getY() < y
|| ev.getY() > (y + view.getHeight())) {
- return false;
- }
+ return false;
+ }
return true;
}
@@ -561,7 +634,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {
- mWorkingNote.getWidgetId()
+ mWorkingNote.getWidgetId()
});
sendBroadcast(intent);
@@ -573,7 +646,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
if (id == R.id.btn_set_bg_color) {
mNoteBgColorSelector.setVisibility(View.VISIBLE);
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
- - View.VISIBLE);
+ View.VISIBLE);
} else if (sBgSelectorBtnsMap.containsKey(id)) {
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.GONE);
@@ -696,10 +769,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
d.show();
}
- /**
- * Share note to apps that support {@link Intent#ACTION_SEND} action
- * and {@text/plain} type
- */
private void sendTo(Context context, String info) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, info);
@@ -906,12 +975,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
switchToListMode(mNoteEditor.getText().toString());
} else {
if (!getWorkingText()) {
- mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ",
- ""));
+ mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", ""));
}
mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
mEditTextList.setVisibility(View.GONE);
mNoteEditor.setVisibility(View.VISIBLE);
+ convertToImage(); //退出清单模式,应该将有图片的地方显示出来
}
}
@@ -1003,4 +1072,147 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private void showToast(int resId, int duration) {
Toast.makeText(this, resId, duration).show();
}
+
+ @Override
+ //重写onActivityResult()来处理返回的数据
+ protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ super.onActivityResult(requestCode, resultCode, intent);
+ ContentResolver resolver = getContentResolver();
+ switch (requestCode) {
+ case PHOTO_REQUEST:
+ Uri originalUri = intent.getData(); //1.获得图片的真实路径
+ Bitmap bitmap = null;
+ try {
+ bitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));//2.解码图片
+ } catch (FileNotFoundException e) {
+ Log.d(TAG, "onActivityResult: get file_exception");
+ e.printStackTrace();
+ }
+
+ if(bitmap != null){
+ //3.根据Bitmap对象创建ImageSpan对象
+ Log.d(TAG, "onActivityResult: bitmap is not null");
+ ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap);
+ String path = getPath(this,originalUri);
+ //4.使用[local][/local]将path括起来,用于之后方便识别图片路径在note中的位置
+ String img_fragment= "[local]" + path + "[/local]";
+ //创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
+ SpannableString spannableString = new SpannableString(img_fragment);
+ spannableString.setSpan(imageSpan, 0, img_fragment.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ //5.将选择的图片追加到EditText中光标所在位置
+ NoteEditText e = (NoteEditText) findViewById(R.id.note_edit_view);
+ int index = e.getSelectionStart(); //获取光标所在位置
+ Log.d(TAG, "Index是: " + index);
+ Editable edit_text = e.getEditableText();
+ edit_text.insert(index, spannableString); //将图片插入到光标所在位置
+
+ mWorkingNote.mContent = e.getText().toString();
+ //6.把改动提交到数据库中,两个数据库表都要改的
+ ContentResolver contentResolver = getContentResolver();
+ ContentValues contentValues = new ContentValues();
+ final long id = mWorkingNote.getNoteId();
+ contentValues.put("snippet",mWorkingNote.mContent);
+ contentResolver.update(Uri.parse("content://micode_notes/note"), contentValues,"_id=?",new String[]{""+id});
+ ContentValues contentValues1 = new ContentValues();
+ contentValues1.put("content",mWorkingNote.mContent);
+ contentResolver.update(Uri.parse("content://micode_notes/data"), contentValues1,"mime_type=? and note_id=?", new String[]{"vnd.android.cursor.item/text_note",""+id});
+
+ }else{
+ Toast.makeText(NoteEditActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ //获取文件的real path
+ public String getPath(final Context context, final Uri uri) {
+
+ final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+
+ // DocumentProvider
+ if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
+ // ExternalStorageProvider
+// if (isExternalStorageDocument(uri)) {
+// final String docId = DocumentsContract.getDocumentId(uri);
+// final String[] split = docId.split(":");
+// final String type = split[0];
+//
+// if ("primary".equalsIgnoreCase(type)) {
+// return Environment.getExternalStorageDirectory() + "/" + split[1];
+// }
+// }
+// // DownloadsProvider
+// else if (isDownloadsDocument(uri)) {
+// final String id = DocumentsContract.getDocumentId(uri);
+// final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
+// return getDataColumn(context, contentUri, null, null);
+// }
+ // MediaProvider
+// else
+ if (isMediaDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ Uri contentUri = null;
+ if ("image".equals(type)) {
+ contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+ }
+
+ final String selection = "_id=?";
+ final String[] selectionArgs = new String[]{split[1]};
+
+ return getDataColumn(context, contentUri, selection, selectionArgs);
+ }
+ }
+ // Media
+ else if ("content".equalsIgnoreCase(uri.getScheme())) {
+ return getDataColumn(context, uri, null, null);
+ }
+ // File
+ else if ("file".equalsIgnoreCase(uri.getScheme())) {
+ return uri.getPath();
+ }
+ return null;
+ }
+
+
+ //获取数据列_获取此 Uri 的数据列的值。这对MediaStore Uris 和其他基于文件的 ContentProvider。
+ public String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
+
+ Cursor cursor = null;
+ final String column = "_data";
+ final String[] projection = {column};
+
+ try {
+ cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
+ if (cursor != null && cursor.moveToFirst()) {
+ final int column_index = cursor.getColumnIndexOrThrow(column);
+ return cursor.getString(column_index);
+ }
+ } finally {
+ if (cursor != null)
+ cursor.close();
+ }
+ return null;
+ }
+
+
+ //是否为外部存储文件
+// public boolean isExternalStorageDocument(Uri uri) {
+// return "com.android.externalstorage.documents".equals(uri.getAuthority());
+// }
+//
+// //是否为下载文件
+// public boolean isDownloadsDocument(Uri uri) {
+// return "com.android.providers.downloads.documents".equals(uri.getAuthority());
+// }
+
+ //是否为媒体文件
+ public boolean isMediaDocument(Uri uri) {
+ return "com.android.providers.media.documents".equals(uri.getAuthority());
+ }
}
diff --git a/src/Notes-master/app/src/main/res/menu/note_edit.xml b/src/Notes-master/app/src/main/res/menu/note_edit.xml
index 35cacd1..0df6de2 100644
--- a/src/Notes-master/app/src/main/res/menu/note_edit.xml
+++ b/src/Notes-master/app/src/main/res/menu/note_edit.xml
@@ -30,6 +30,10 @@
android:id="@+id/menu_font_size"
android:title="@string/menu_font_size"/>
+
+
@@ -49,4 +53,11 @@
+
\ No newline at end of file
diff --git a/src/Notes-master/app/src/main/res/values-ja/arrays.xml b/src/Notes-master/app/src/main/res/values-ja/arrays.xml
new file mode 100644
index 0000000..40cca69
--- /dev/null
+++ b/src/Notes-master/app/src/main/res/values-ja/arrays.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+ - メールです
+ - メールです
+
+
\ No newline at end of file
diff --git a/src/Notes-master/app/src/main/res/values-ja/strings.xml b/src/Notes-master/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000..8e0b8e9
--- /dev/null
+++ b/src/Notes-master/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+ 付箋
+ 付箋2x2
+ 付箋4x4
+ 関連コンテンツはありません。新しいメモを作成してください
+ ゲストモードでは、メモの内容は表示されません
+ ...
+ 新しい付箋を作成
+ リマインダを削除しました
+ リマインダを作成
+ 期限切れ
+ yyyyMMdd
+ MM月dd日 kk:mm
+ 了解
+ 表示
+ 電話をかける
+ メールを送信
+ ウェブページを閲覧
+ 地図を開く
+
+ フォルダを作成
+ テキストをエクスポート
+ 同期
+ 同期をキャンセル
+ 設定
+ 検索
+ 削除
+ フォルダに移動
+ %d 項目が選択されました
+ 選択された項目はありません
+ すべて選択
+ すべて選択解除
+ 文字のサイズ
+ 小
+ 通常
+ 大
+ 超大
+ リストモードに入る
+ リストモードを終了
+ フォルダを表示
+ フォルダを削除
+ フォルダ名を変更
+ ォルダ %1$s は既に存在しています。別の名前を入力してください
+ 共有
+ デスクトップに送信
+ リマインドする
+ リマインドを削除
+ フォルダを選択
+ 一つ上のフォルダ
+ デスクトップに追加されました
+ 削除
+ 選択した %d 件のメモを削除しますか?
+ このメモを削除しますか?
+ このフォルダと含まれるメモを削除しますか?
+ 選択した %1$d 件のメモを %2$s フォルダに移動しました
+
+ SDカードが使用中のため、操作できません
+ テキストのエクスポート中にエラーが発生しました。SDカードを確認してください
+ 表示するメモが存在しません
+ 空のメモにはアラームのリマインダを設定できません
+ 空のメモをデスクトップに送信することはできません
+ エクスポートに成功しました
+ エクスポートに失敗しました
+ テキストファイル(%1$s)がSDカード(%2$s)のディレクトリに出力されました
+
+ 付箋を同期中...
+ 同期に成功しました
+ 同期に失敗しました
+ 同期がキャンセルされました
+ %1$sとの同期に成功しました
+ 同期に失敗しました。ネットワークとアカウント設定を確認してください
+ 同期に失敗しました。内部エラーが発生しました
+ 同期がキャンセルされました
+ %1$sにログイン中...
+ サーバーのメモリストを取得中...
+ ローカルメモの同期中...
+
+ 設定
+ 同期アカウント
+ Google Tasksとのメモを同期します
+ 前回の同期: %1$s
+ アカウントを追加
+ アカウントを変更
+ アカウントを削除
+ キャンセル
+ 即時同期
+ 同期をキャンセル
+ 現在のアカウント: %1$s
+ 同期アカウントを変更すると、以前のアカウントの同期情報はクリアされ、重複データが発生する可能性があります
+ 付箋の同期
+ Googleアカウントを選択してください。メモは選択したアカウントのGoogle Tasksの内容と同期されます。
+ 同期中のため、同期アカウントを変更できません
+ 同期アカウントは %1$s に設定されました
+ 新規メモの背景色をランダムに表示
+ 削除
+ 通話付箋
+ 名前を入力してください
+ 付箋を検索中
+ 付箋を検索
+ 付箋のテキスト
+ 付箋
+ 設定
+ キャンセル
+ プライベートモード
+ プライベートモードを終了
+
+ - %1$s 条と一致“%2$s”の検索結果
+
+
+
diff --git a/src/Notes-master/app/src/main/res/values/strings.xml b/src/Notes-master/app/src/main/res/values/strings.xml
index 5943ff0..9cb825d 100644
--- a/src/Notes-master/app/src/main/res/values/strings.xml
+++ b/src/Notes-master/app/src/main/res/values/strings.xml
@@ -128,6 +128,8 @@
Notes
set
cancel
+ secret model
+ quit secret model
- %1$s result for \"%2$s\"