diff --git a/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java b/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java
index dac566c..d0042d8 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java
@@ -171,6 +171,10 @@ public class Notes {
//是否置顶
public static final String TOP = "top";
+
+ //隐私密码
+ public static final String PASSWORD= "password";
+
}
// 数据列接口
@@ -246,12 +250,12 @@ public class Notes {
public static final class TextNote implements DataColumns {
/**
* 模式,指示文本是否在检查列表模式中
- * 类型: INTEGER 1:检查列表模式 0: 正常模式
+ * 类型: INTEGER 2:隐私模式 1:检查列表模式 0: 正常模式
*/
public static final String MODE = DATA1;
public static final int MODE_CHECK_LIST = 1;
-
+ public static final int MODE_PRIVATE_TYPE = 2;
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; // MIME类型定义
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; // 单项MIME类型定义
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); // 内容URI定义
diff --git a/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
index a24c22d..1f6f680 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
@@ -54,7 +54,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.TOP+ " INTEGER NOT NULL DEFAULT 0" +
+ NoteColumns.TOP+ " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.PASSWORD+" INTEGER NOT NULL DEFAULT 0"+
")";
// 创建DATA表的SQL语句
@@ -337,6 +338,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
upgradeToV5(db);
oldVersion++;
}
+ if (oldVersion == 5) {
+ upgradeToV6(db);
+ oldVersion++;
+ }
if (reCreateTriggers) {
reCreateNoteTableTriggers(db);
reCreateDataTableTriggers(db);
@@ -395,4 +400,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.TOP
+ " INTEGER NOT NULL DEFAULT 0");
}
+ private void upgradeToV6(SQLiteDatabase db){
+ db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.PASSWORD
+ + " INTEGER NOT NULL DEFAULT 0");
+ }
}
\ No newline at end of file
diff --git a/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java b/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java
index c38d7b3..ac3b279 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java
@@ -15,6 +15,7 @@ import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
+import android.widget.Toast;
import net.micode.notes.R;
import net.micode.notes.data.Notes.DataColumns;
@@ -25,7 +26,7 @@ import net.micode.notes.data.NotesDatabaseHelper.TABLE;
public class NotesProvider extends ContentProvider {
private static final UriMatcher mMatcher;
- private NotesDatabaseHelper mHelper;
+ private static NotesDatabaseHelper mHelper;
private static final String TAG = "NotesProvider";
@@ -355,4 +356,21 @@ public class NotesProvider extends ContentProvider {
return null;
}
+ public static boolean isPrivateNote(long id){
+ SQLiteDatabase db;
+ db=mHelper.getReadableDatabase();
+ Cursor cursor = db.query("note", new String[]{NoteColumns.ID,NoteColumns.PASSWORD},//对数据库查询的光标
+ "_id = ?",new String[]{String.valueOf(id)},null,null,null);
+ cursor.moveToFirst();//防止遗漏,先把光标移到最上面
+ //Log.d(TAG, "WithoutPassword: "+cursor.getColumnIndex("_id"));
+ //Log.d(TAG, "WithoutPassword: "+cursor.getColumnIndex("note_password"));
+ String p = cursor.getString(cursor.getColumnIndex("password"));//找对应的密码
+ if(!p.equals("")&&!p.equals("0"))
+ {
+ cursor.close();
+ return true;
+ }
+ cursor.close();
+ return false;
+ }
}
diff --git a/src/Notes/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/src/Notes/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java
index fde879c..dce8b9d 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java
@@ -56,7 +56,7 @@ public class SqlNote {
NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE,
NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID,
NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID,
- NoteColumns.VERSION,NoteColumns.TOP
+ NoteColumns.VERSION, NoteColumns.TOP, NoteColumns.PASSWORD,
};
// 各查询列的索引
@@ -78,6 +78,7 @@ public class SqlNote {
public static final int GTASK_ID_COLUMN = 15;
public static final int VERSION_COLUMN = 16;
public static final int Top_COLUMN = 17;
+ public static final int PASSWORD_COLUMN = 18;
// 上下文和内容解析器,用于访问数据库
private Context mContext;
@@ -101,6 +102,8 @@ public class SqlNote {
private long mOriginParent;
private long mVersion;
private String mTop;
+ private String mPASSWORD="";
+
// 用于存储两次更新之间差异的数据值
private ContentValues mDiffNoteValues;
@@ -132,6 +135,7 @@ public class SqlNote {
mVersion = 0;
mDiffNoteValues = new ContentValues();
mTop=getmTop();
+ mPASSWORD="";
}
/**
@@ -209,6 +213,7 @@ public class SqlNote {
mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);
mVersion = c.getLong(VERSION_COLUMN);
mTop = c.getString(Top_COLUMN);
+ mPASSWORD=c.getString(PASSWORD_COLUMN);
}
/**
diff --git a/src/Notes/app/src/main/java/net/micode/notes/model/WorkingNote.java b/src/Notes/app/src/main/java/net/micode/notes/model/WorkingNote.java
index 9b77a4d..ad785f4 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/model/WorkingNote.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/model/WorkingNote.java
@@ -64,11 +64,14 @@ public class WorkingNote {
private boolean mIsDeleted;
//标记便签是否被制定
- private String mTop="0";
+ private String mTop = "0";
// 笔记设置变化监听器
private NoteSettingChangedListener mNoteSettingStatusListener;
+ //便签的隐私密码
+ private String mPassword="";
+
// 定义一个静态数组,用于在查询时投影数据列
public static final String[] DATA_PROJECTION = new String[]{
DataColumns.ID,
@@ -89,7 +92,8 @@ public class WorkingNote {
NoteColumns.WIDGET_ID,
NoteColumns.WIDGET_TYPE,
NoteColumns.MODIFIED_DATE,
- NoteColumns.TOP
+ NoteColumns.TOP,
+ NoteColumns.PASSWORD
};
// 数据ID列的索引
@@ -124,6 +128,9 @@ public class WorkingNote {
// Note表中修改TOP列的索引
private static final int NOTE_TOP_COLUMN = 6;
+
+ // Note表中修改隐私密码列的索引
+ private static final int NOTE_PASSWORD_COLUMN = 7;
/**
* 新建笔记的构造函数
*
@@ -141,6 +148,7 @@ public class WorkingNote {
mMode = 0;
mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
mTop = String.valueOf(getTopId());
+ mPassword="";
}
/**
@@ -182,6 +190,7 @@ public class WorkingNote {
mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN);
mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN);
mTop = cursor.getString(NOTE_TOP_COLUMN);
+ mPassword=cursor.getString(NOTE_PASSWORD_COLUMN);
}
// 关闭查询结果集
cursor.close();
@@ -324,6 +333,9 @@ public class WorkingNote {
}
}
+ public boolean comparePassword(String inputPwd){
+ return mPassword.equals(inputPwd);
+ }
/**
* 设置笔记设置状态监听器。
*
@@ -350,6 +362,10 @@ public class WorkingNote {
}
}
+ //设置便签密码值
+ public void setmPwd(String password){
+ mNote.setNoteValue(NoteColumns.PASSWORD,String.valueOf(password));
+ }
//设置置顶的变量
public void setTop(String Top){
if (Top != mTop) {
@@ -452,6 +468,10 @@ public class WorkingNote {
}
}
+ public void setmContent(String mContent) {
+ this.mContent = mContent;
+ }
+
/**
* 转换为通话笔记
*
diff --git a/src/Notes/app/src/main/java/net/micode/notes/tool/DataUtils.java b/src/Notes/app/src/main/java/net/micode/notes/tool/DataUtils.java
index 4149710..15f5927 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/tool/DataUtils.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/tool/DataUtils.java
@@ -25,10 +25,12 @@ import android.content.OperationApplicationException;
import android.database.Cursor;
import android.os.RemoteException;
import android.util.Log;
+import android.widget.Toast;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.CallNote;
import net.micode.notes.data.Notes.NoteColumns;
+import net.micode.notes.data.NotesProvider;
import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute;
import java.util.ArrayList;
@@ -62,6 +64,10 @@ public class DataUtils {
Log.e(TAG, "Don't delete system folder root");
continue;
}
+ if(NotesProvider.isPrivateNote(id)){
+ Log.e(TAG, "Don't delete private note.");
+ continue;
+ }
ContentProviderOperation.Builder builder = ContentProviderOperation
.newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
operationList.add(builder.build());
diff --git a/src/Notes/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/Notes/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
index 0b29dc4..7824592 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java
@@ -16,25 +16,40 @@
package net.micode.notes.ui;
+import static android.content.Intent.ACTION_INSERT_OR_EDIT;
+
import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
+import android.app.Dialog;
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.Paint;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
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.TextWatcher;
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,20 +58,18 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
+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;
import android.widget.Toast;
-import android.text.TextWatcher;
-import android.text.Editable; // 如果还使用到了Editable,也要导入
-
-
-
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.TextNote;
@@ -70,6 +83,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;
@@ -148,8 +162,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private TextView textView;
-
-
+ private final int PHOTO_REQUEST=1;//图片请求
private static final String TAG = "NoteEditActivity"; // 日志标签
@@ -195,6 +208,31 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
initResources(); // 初始化资源
count();
+
+ if(mWorkingNote.getCheckListMode()==2) {
+ if (!(mWorkingNote.comparePassword(getIntent().getStringExtra("password")))) {
+ Toast.makeText(getApplicationContext(), "密码错误", Toast.LENGTH_SHORT).show();
+ finish();
+ return;
+ }
+
+
+ }
+
+
+ final ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_button);
+ add_img_btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Log.d(TAG, "onClick: click add image button");
+ Intent loadImage = new Intent(Intent.ACTION_GET_CONTENT);
+ loadImage.addCategory(Intent.CATEGORY_OPENABLE);
+ loadImage.setType("image/*");
+ startActivityForResult(loadImage, PHOTO_REQUEST);
+ }}
+ );
+ initResources(); // 初始化资源
+
}
/**
@@ -259,7 +297,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
- } else if (TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
+ } else if (TextUtils.equals(ACTION_INSERT_OR_EDIT, intent.getAction())) {
// 处理新建或编辑笔记的情况
long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0);
int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,
@@ -358,6 +396,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
// 显示提醒头部信息(当前禁用,因DateTimePicker未准备好)
showAlertHeader();
showTopHeader();
+ convertToImage();
}
/**
* 显示提醒头部信息的方法。
@@ -523,6 +562,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
// 初始化编辑列表
mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
+
editText.addTextChangedListener(new TextWatcher() {
int currentLength = 0;
@@ -532,7 +572,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
- currentLength = editText.getText().length();
+ currentLength = editText.getText().length() - countSpacesAndNewlines(s)[0] - countSpacesAndNewlines(s)[1] - countSpacesAndNewlines(s)[2];
}
@Override
public void afterTextChanged(Editable s) {
@@ -540,6 +580,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
});
+
}
/**
@@ -695,11 +736,17 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else {
menu.findItem(R.id.menu_delete_remind).setVisible(false);
}
-
+ // 根据笔记是否被置顶,更新“置顶”菜单项
if (mWorkingNote.getTopId() == 1 ) {
- menu.findItem(R.id.menu_top).setTitle("取消置顶");
+ menu.findItem(R.id.menu_top).setTitle("Cancel Top");
} else if(mWorkingNote.getTopId() == 0){
- menu.findItem(R.id.menu_top).setTitle("置顶");
+ menu.findItem(R.id.menu_top).setTitle("Top");
+ }
+ // 根据笔记是否为私密笔记,设置隐私便签和撤销隐私便签
+ if (mWorkingNote.getCheckListMode()== TextNote.MODE_PRIVATE_TYPE){
+ menu.findItem(R.id.menu_Private).setTitle("Cancel Private");
+ }else{
+ menu.findItem(R.id.menu_Private).setTitle("Set Private");
}
return true;
}
@@ -727,9 +774,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
+ if(mWorkingNote.getCheckListMode()==TextNote.MODE_PRIVATE_TYPE){
+ Toast.makeText(getApplicationContext(),"私密便签不可删除",Toast.LENGTH_SHORT).show();
+ }
// 确认删除当前笔记并结束当前活动
- deleteCurrentNote();
- finish();
+ else
+ {
+ deleteCurrentNote();
+ finish();
+ }
}
});
builder.setNegativeButton(android.R.string.cancel, null);
@@ -771,23 +824,28 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
showTopHeader();
break;
- case R.id.menu_count_word:
+ case R.id.menu_Private://设置为私密便签
+ if(mNoteEditor.getText().toString().equals("")){
+ Toast.makeText(getApplicationContext(),"为空的便签不能设置密码",Toast.LENGTH_SHORT).show();
+ }else{
+ controlPwd();
+ }
+ case R.id.menu_count_words:
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
builder1.setIcon(android.R.drawable.ic_dialog_alert);
TextView content = (TextView)findViewById(R.id.note_edit_view);
int c = content.length();
builder1.setMessage("all characters num is " + c);
- builder1.setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- });
+ builder1.setPositiveButton(android.R.string.ok, null);
builder1.setNegativeButton(android.R.string.cancel, null);
builder1.show();
break;
+
+
+
+
default:
break;
}
@@ -831,7 +889,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
// 安全地开始一个新的NoteEditActivity
finish();
Intent intent = new Intent(this, NoteEditActivity.class);
- intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
+ intent.setAction(ACTION_INSERT_OR_EDIT);
intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId());
startActivity(intent);
}
@@ -1110,6 +1168,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mEditTextList.setVisibility(View.GONE);
mNoteEditor.setVisibility(View.VISIBLE);
}
+ convertToImage();
}
/**
@@ -1222,23 +1281,244 @@ public class NoteEditActivity extends Activity implements OnClickListener,
Toast.makeText(this, resId, duration).show();
}
+ //获取图片路径
+ public String getPath(final Context context, final Uri uri) {
+ final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+ if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
+ 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;
+ }
+
+ //将路径转为图片
+ private void convertToImage() {
+ NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view);
+ Editable editable = noteEditText.getText();
+ String noteText = editable.toString();
+ int length = editable.length();
+ for(int i = 0; i < length; i++) {
+ for(int j = i; j < length; j++) {//通过穷尽所有可能的字符串,进行查找满足的图片路径
+ String img_fragment = noteText.substring(i, j+1);
+ if(img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")){
+ int limit = 7;
+ int len = img_fragment.length()-15;
+ 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();
+ Log.d(TAG, "图片路径不可decode且路径是:"+path);
+ }
+ if(bitmap!=null){
+ Log.d(TAG, "图片不为null,且图片路径为:"+path);
+ ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap);
+ String ss = "[local]" + path + "[/local]";
+ SpannableString spannableString = new SpannableString(ss);
+ 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);
+ edit_text.insert(i, spannableString);
+ }
+ }
+ }
+ }
+ }
+ //是否为媒体文件
+ public boolean isMediaDocument(Uri uri) {
+ return "com.android.providers.media.documents".equals(uri.getAuthority());
+ }
+
+ 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;
+ }
+
+ 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();
+ 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) {
+ Log.d(TAG, "onActivityResult: bitmap is not null");
+ ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap);
+ String path = getPath(this, originalUri);
+ String img_fragment = "[local]" + path + "[/local]";
+ SpannableString spannableString = new SpannableString(img_fragment);
+ spannableString.setSpan(imageSpan, 0, img_fragment.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ 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.setmContent(e.getText().toString());
+ ContentResolver contentResolver = getContentResolver();
+ ContentValues contentValues = new ContentValues();
+ final long id = mWorkingNote.getNoteId();
+ contentValues.put("snippet", mWorkingNote.getContent());
+ contentResolver.update(Uri.parse("content://micode_notes/note"), contentValues, "_id=?", new String[]{"" + id});
+ ContentValues contentValues1 = new ContentValues();
+ contentValues1.put("content", mWorkingNote.getContent());
+ 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;
+ }
+ }
+
+ //设置隐私模式
+ private void controlPwd() {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);//初始化对话框
+ View view = LayoutInflater.from(this).inflate(R.layout.dialog_pwd, null);//加载对话框的布局文件
+ final EditText etPwd = (EditText) view.findViewById(R.id.set_private_pwd);//初始化对话框里的文本对象
+ showSoftInput();
+ builder.setPositiveButton(android.R.string.ok, null);//确定按钮
+ builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {//取消按钮
+ hideSoftInput(etPwd);
+ }
+ });
+ final Dialog dialog = builder.setView(view).show();//显示出来
+ final Button positive = (Button) dialog.findViewById(android.R.id.button1);//加载确定按钮布局文件
+ positive.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {//设置确定按钮的接收器
+ hideSoftInput(etPwd);
+ String Password = etPwd.getText().toString();
+ if(mWorkingNote.getCheckListMode()==TextNote.MODE_PRIVATE_TYPE){
+ if (!TextUtils.isEmpty(Password) && mWorkingNote.comparePassword(Password) ) {
+ Toast.makeText(getApplicationContext(), "成功撤销私密便签", Toast.LENGTH_SHORT).show();
+ //加到数据库里
+ mWorkingNote.setmPwd("");
+ saveNote();
+ mWorkingNote.setCheckListMode(0);
+ }
+ else{
+ Toast.makeText(getApplicationContext(), "撤销私密便签失败", Toast.LENGTH_SHORT).show();
+ }
+ }
+ else{
+ if (!TextUtils.isEmpty(Password)) {//输入不为空
+ Toast.makeText(getApplicationContext(), "成功设置私密便签", Toast.LENGTH_SHORT).show();
+ //加到数据库里
+ mWorkingNote.setmPwd(Password);
+ saveNote();
+ mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?//改workingnote的mMode的值,对应上文的界面设置
+ TextNote.MODE_PRIVATE_TYPE : 0);
+ }
+ }
+ dialog.dismiss();//撤销对话框
+ }
+
+ });
+ if (TextUtils.isEmpty(etPwd.getText())) {//如果文件夹名称为空,则不能选择确定按钮
+ positive.setEnabled(false);
+ }
+
+ etPwd.addTextChangedListener(new TextWatcher() {//添加文本更改监听器,即判断文本更改状态
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {//文本更改之前(未完成)
+ // TODO Auto-generated method stub
+ }
+
+ public void onTextChanged(CharSequence s, int start, int before, int count) {//当前文本改变触发,
+ if (TextUtils.isEmpty(etPwd.getText())) {//文本为空确定按键不可用,不为空则可用
+ positive.setEnabled(false);
+ } else {
+ positive.setEnabled(true);
+ }
+ }
+
+ public void afterTextChanged(Editable s) {//文本修改之后(未完成)
+ // TODO Auto-generated method stub
+ }
+ });
+ }
+
+ /**
+ * 显示软键盘。
+ */
+ private void showSoftInput() {
+ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ if (inputMethodManager != null) {
+ inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
+ }
+ }
+
+ /**
+ * 隐藏软键盘。
+ *
+ * @param view 触发隐藏软键盘的视图。
+ */
+ private void hideSoftInput(View view) {
+ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
+ }
+
private void count(){
mNoteEditor.addTextChangedListener(new TextWatcher(){
int currentLength = 0;
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- Textchange(s);
+
textView.setText("字符" + currentLength );
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
- Textchange(s);
- currentLength = editText.getText().length() - countSpacesAndNewlines(s)[0] - countSpacesAndNewlines(s)[1];
+
+ /*currentLength = editText.getText().length() + 100;*/
+ currentLength = 100;
}
public void afterTextChanged(Editable s) {
- Textchange(s);
+
textView.setText("字符" + currentLength);
}
@@ -1251,6 +1531,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private int[] countSpacesAndNewlines(CharSequence text) {
int spaceCount = 0;
int newlineCount = 0;
+ int photoCount = 0;
+
for (int i = 0; i < text.length(); i++) {
char currentChar = text.charAt(i);
@@ -1261,10 +1543,40 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
- return new int[]{spaceCount, newlineCount}; // 返回空格和换行的数量
- }
+ for(int i = 0; i < text.length(); i++)
+ {
+ char currentChar = text.charAt(i);
+ if (currentChar == '[' && text.charAt(i + 1) == 'l' &&
+ text.charAt(i + 2) == 'o' && text.charAt(i + 3) == 'c' &&
+ text.charAt(i + 4) == 'a' && text.charAt(i + 5) == 'l' &&
+ text.charAt(i + 6) == ']')
+ {
+ photoCount = photoCount + 7;
+ i = i + 7;
+
+ for(;i? AND " + NoteColumns.ID + "<>?";
- selection = (mState == ListEditState.NOTE_LIST) ? selection :
- "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")";
+ String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID
+ + "<>?";
+ selection = (mState == ListEditState.NOTE_LIST) ? selection
+ : "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")";
mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN,
null,
Notes.CONTENT_NOTE_URI,
FoldersListAdapter.PROJECTION,
selection,
- new String[]{
+ new String[] {
String.valueOf(Notes.TYPE_FOLDER),
String.valueOf(Notes.ID_TRASH_FOLER),
String.valueOf(mCurrentFolderId)
@@ -1406,9 +1499,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void showExportSuccessDialog(String title, String fileName, String fileDir) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(title);
- builder.setMessage(NotesListActivity.this.getString(R.string.format_exported_file_location, fileName, fileDir));
+ builder.setMessage(
+ NotesListActivity.this.getString(R.string.format_exported_file_location, fileName, fileDir));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
}
-
}
diff --git a/src/Notes/app/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/Notes/app/src/main/java/net/micode/notes/ui/NotesListItem.java
index 19d0ee4..2b2f30e 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/ui/NotesListItem.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/ui/NotesListItem.java
@@ -23,6 +23,7 @@ import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
+import android.widget.Toast;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
@@ -43,6 +44,7 @@ public class NotesListItem extends LinearLayout {
private NoteItemData mItemData; // 绑定的笔记数据
private CheckBox mCheckBox; // 选择框,用于多选模式
private ImageView mTop; // 显示置顶图标
+ private ImageView mKey;// 显示隐私图标
/*
* 构造函数,初始化视图组件。
@@ -52,11 +54,12 @@ public class NotesListItem extends LinearLayout {
inflate(context, R.layout.note_item, this);
// 初始化视图组件
mAlert = (ImageView) findViewById(R.id.iv_alert_icon);
+ mTop = (ImageView) findViewById(R.id.iv_top_icon);
+ mKey =(ImageView) findViewById(R.id.iv_key_icon);
mTitle = (TextView) findViewById(R.id.tv_title);
mTime = (TextView) findViewById(R.id.tv_time);
mCallName = (TextView) findViewById(R.id.tv_name);
mCheckBox = (CheckBox) findViewById(android.R.id.checkbox);
- mTop = (ImageView) findViewById(R.id.iv_top_icon);
}
/*
@@ -104,8 +107,6 @@ public class NotesListItem extends LinearLayout {
mCallName.setVisibility(View.GONE);
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
-
-
if (data.getType() == Notes.TYPE_FOLDER) {
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
@@ -127,6 +128,13 @@ public class NotesListItem extends LinearLayout {
}else {
mTop.setVisibility(View.GONE);
}
+ if(!data.getPassWord().equals("")&&!data.getPassWord().equals("0")) {
+ //Toast.makeText(context.getApplicationContext(),data.getPassWord(),Toast.LENGTH_SHORT).show();
+ mKey.setImageResource(R.drawable.key);
+ mKey.setVisibility(View.VISIBLE);
+ }else{
+ mKey.setVisibility(View.GONE);
+ }
// 设置时间显示
mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
diff --git a/src/Notes/app/src/main/res/layout/note_edit.xml b/src/Notes/app/src/main/res/layout/note_edit.xml
index 5e17d64..85237a5 100644
--- a/src/Notes/app/src/main/res/layout/note_edit.xml
+++ b/src/Notes/app/src/main/res/layout/note_edit.xml
@@ -18,7 +18,7 @@
+
+
+
+
+
diff --git a/src/Notes/app/src/main/res/layout/note_list.xml b/src/Notes/app/src/main/res/layout/note_list.xml
index d1f3e9d..5a6ae60 100644
--- a/src/Notes/app/src/main/res/layout/note_list.xml
+++ b/src/Notes/app/src/main/res/layout/note_list.xml
@@ -9,9 +9,7 @@
-
-
-
diff --git a/src/Notes/app/src/main/res/menu/note_edit.xml b/src/Notes/app/src/main/res/menu/note_edit.xml
index 88d581a..9befe79 100644
--- a/src/Notes/app/src/main/res/menu/note_edit.xml
+++ b/src/Notes/app/src/main/res/menu/note_edit.xml
@@ -48,13 +48,19 @@
+
+
+
+ android:id="@+id/menu_Private"
+ android:title="Private"/>
+
diff --git a/src/Notes/app/src/main/res/menu/note_list.xml b/src/Notes/app/src/main/res/menu/note_list.xml
index a9517b0..c867bfb 100644
--- a/src/Notes/app/src/main/res/menu/note_list.xml
+++ b/src/Notes/app/src/main/res/menu/note_list.xml
@@ -41,6 +41,14 @@
+
+
+
+
+
+
+
diff --git a/src/Notes/app/src/main/res/menu/sub_folder.xml b/src/Notes/app/src/main/res/menu/sub_folder.xml
index 5f2f49b..5b86008 100644
--- a/src/Notes/app/src/main/res/menu/sub_folder.xml
+++ b/src/Notes/app/src/main/res/menu/sub_folder.xml
@@ -26,4 +26,5 @@
+
diff --git a/src/Notes/app/src/main/res/values-zh-rCN/strings.xml b/src/Notes/app/src/main/res/values-zh-rCN/strings.xml
index d102ab7..1969527 100644
--- a/src/Notes/app/src/main/res/values-zh-rCN/strings.xml
+++ b/src/Notes/app/src/main/res/values-zh-rCN/strings.xml
@@ -119,12 +119,12 @@
便签
设置
取消
+
私密模式
退出私密模式
- 白天模式
- 夜晚模式
-
+ 亮背景
+ 暗背景
- %1$s 条符合“%2$s”的搜索结果
diff --git a/src/Notes/app/src/main/res/values-zh-rTW/strings.xml b/src/Notes/app/src/main/res/values-zh-rTW/strings.xml
index 5d1f113..8b2a760 100644
--- a/src/Notes/app/src/main/res/values-zh-rTW/strings.xml
+++ b/src/Notes/app/src/main/res/values-zh-rTW/strings.xml
@@ -120,11 +120,12 @@
便籤
設置
取消
+
私密模式
退出私密模式
- 白天模式
- 夜晚模式
+ 亮背景
+ 暗背景
- %1$s 條符合”%2$s“的搜尋結果
diff --git a/src/Notes/app/src/main/res/values/strings.xml b/src/Notes/app/src/main/res/values/strings.xml
index dd259d0..14b094a 100644
--- a/src/Notes/app/src/main/res/values/strings.xml
+++ b/src/Notes/app/src/main/res/values/strings.xml
@@ -15,7 +15,8 @@
limitations under the License.
-->
-
+
Notes
Notes 2x2
Notes 4x4
@@ -125,6 +126,7 @@
Notes
set
cancel
+
secret model
quit secret model
@@ -133,13 +135,13 @@
- - %1$s result for \"%2$s\"
+ - %1$s result for \"%2$s\"
- - %1$s results for \"%2$s\"
+ - %1$s results for \"%2$s\"
Length
SplashActivity
Dummy Button
- HELLO\nWORLD!
+ HELLO\nWORLD!!!
diff --git a/src/Notes/app/src/main/res/values/styles.xml b/src/Notes/app/src/main/res/values/styles.xml
index de24292..103a43b 100644
--- a/src/Notes/app/src/main/res/values/styles.xml
+++ b/src/Notes/app/src/main/res/values/styles.xml
@@ -68,7 +68,6 @@
- visible
-
diff --git a/src/Notes/build.gradle b/src/Notes/build.gradle
index 3cf6627..abf215d 100644
--- a/src/Notes/build.gradle
+++ b/src/Notes/build.gradle
@@ -18,4 +18,5 @@ allprojects {
google()
jcenter()
}
-}
+
+}
\ No newline at end of file
diff --git a/src/Notes/local.properties b/src/Notes/local.properties
index 03a628b..949b141 100644
--- a/src/Notes/local.properties
+++ b/src/Notes/local.properties
@@ -4,5 +4,5 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
-#Fri Dec 13 08:48:50 CST 2024
+#Wed Dec 25 08:38:52 CST 2024
sdk.dir=D\:\\ASSDK