diff --git a/doc/开源软件维护.docx b/doc/开源软件维护.docx new file mode 100644 index 0000000..a2b3f94 Binary files /dev/null and b/doc/开源软件维护.docx differ diff --git a/doc/开源软件维护方案及成果.docx b/doc/开源软件维护方案及成果.docx index 1bbf94f..d150239 100644 Binary files a/doc/开源软件维护方案及成果.docx and b/doc/开源软件维护方案及成果.docx differ diff --git a/src/Notes-master/AndroidManifest.xml b/src/Notes-master/AndroidManifest.xml index 94ddf2d..255cc1a 100644 --- a/src/Notes-master/AndroidManifest.xml +++ b/src/Notes-master/AndroidManifest.xml @@ -82,12 +82,12 @@ android:resource="@xml/searchable" /> - - - - + android:name=".ui.PassWordEditActivity" + android:theme="@style/NoteActionBarStyle"> + + + + - - \ No newline at end of file + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:gravity="center_vertical"> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/res/layout/note_item.xml b/src/Notes-master/res/layout/note_item.xml index d541f6a..8875507 100644 --- a/src/Notes-master/res/layout/note_item.xml +++ b/src/Notes-master/res/layout/note_item.xml @@ -17,6 +17,7 @@ @@ -75,4 +76,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top|right"/> + + diff --git a/src/Notes-master/src/net/micode/notes/data/Notes.java b/src/Notes-master/src/net/micode/notes/data/Notes.java index 216867b..7c37534 100644 --- a/src/Notes-master/src/net/micode/notes/data/Notes.java +++ b/src/Notes-master/src/net/micode/notes/data/Notes.java @@ -62,6 +62,10 @@ public class Notes { public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); public interface NoteColumns { + /** + * 标志已经上锁,不可删除且需密码验证 + */ + public static final String LOCKER="_locker"; /** * 储存密码 */ diff --git a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java index e4feff3..85f3b15 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java @@ -62,7 +62,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.PASSWORD+ " TEXT NOT NULL DEFAULT ''," + - NoteColumns.TOP+" INTEGER NOT NULL DEFAULT 0"+ + NoteColumns.TOP+" INTEGER NOT NULL DEFAULT 0,"+ + NoteColumns.LOCKER + " INTEGER NOT NULL DEFAULT 0" + //NoteColumns.PASSWORD+ " INTEGER NOT NULL DEFAULT 0" + ")"; @@ -329,6 +330,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { upgradeToV5(db); oldVersion++; } + if (oldVersion == 5) { + upgradeToV6(db); + oldVersion++; + } if (reCreateTriggers) { reCreateNoteTableTriggers(db); @@ -371,5 +376,9 @@ 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.LOCKER + + " INTEGER NOT NULL DEFAULT 0"); + } } diff --git a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java index edb0a60..d6aef7d 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java @@ -33,13 +33,14 @@ import net.micode.notes.R; import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.NotesDatabaseHelper.TABLE; +import net.micode.notes.gtask.data.SqlNote; public class NotesProvider extends ContentProvider { private static final UriMatcher mMatcher; - private NotesDatabaseHelper mHelper; - + //创建帮助找到下了锁的对应的便签 + private static NotesDatabaseHelper mFind_Locker_Helper; private static final String TAG = "NotesProvider"; private static final int URI_NOTE = 1; @@ -82,6 +83,7 @@ public class NotesProvider extends ContentProvider { @Override public boolean onCreate() { mHelper = NotesDatabaseHelper.getInstance(getContext()); + mFind_Locker_Helper=NotesDatabaseHelper.getInstance(getContext()); return true; } @@ -301,5 +303,25 @@ public class NotesProvider extends ContentProvider { // TODO Auto-generated method stub return null; } + //判断是否上锁 + public static boolean isLockedNote(Long id) { + SQLiteDatabase db = mFind_Locker_Helper.getReadableDatabase(); + Cursor cursor = null; + cursor = db.query(NotesDatabaseHelper.TABLE.NOTE, null, null, null, null, null, null); + //判断游标是否为空 + System.out.println(cursor.getCount()); + if (cursor.moveToFirst()) { + //遍历游标 + for (int index = 1; index < cursor.getCount(); index++) { + if (cursor.getLong(SqlNote.ID_COLUMN) == id && !cursor.getString(SqlNote.LOCKER_COLUMN).equals("0")) { + cursor.close(); + return true; + } + cursor.moveToNext(); + } + } + cursor.close(); + return false; + } } diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java index 79a4095..6e16102 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java @@ -49,7 +49,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.VERSION,NoteColumns.LOCKER }; public static final int ID_COLUMN = 0; @@ -85,6 +85,7 @@ public class SqlNote { public static final int GTASK_ID_COLUMN = 15; public static final int VERSION_COLUMN = 16; + public static final int LOCKER_COLUMN = 17; private Context mContext; diff --git a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java index 4dd4123..d088f22 100644 --- a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java +++ b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java @@ -64,6 +64,8 @@ public class WorkingNote { private NoteSettingChangedListener mNoteSettingStatusListener; //新添加的密码变量 private String mPassword; + //添加密码标志 + private String mLocker; public static final String[] DATA_PROJECTION = new String[] { DataColumns.ID, @@ -85,6 +87,7 @@ public class WorkingNote { //增加一个密码项 NoteColumns.PASSWORD, NoteColumns.TOP, + NoteColumns.LOCKER, }; private static final int DATA_ID_COLUMN = 0; @@ -108,6 +111,8 @@ public class WorkingNote { private static final int NOTE_MODIFIED_DATE_COLUMN = 5; //密码 private static final int NOTE_PASSWORD_COLUMN=6; + //密码标志 + private static final int NOTE_LOCKER_COLUMN=8; /** @@ -140,6 +145,11 @@ public class WorkingNote { public String getmPassword(){ return mPassword; } + //设置密码标志 + public void setLocker(String mlocker){ + mLocker=mlocker;//1标志为上锁了 0标志为没有上锁 + mNote.setNoteValue(NoteColumns.LOCKER,mLocker); + } // New note construct private WorkingNote(Context context, long folderId) { @@ -183,6 +193,8 @@ public class WorkingNote { mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); //密码 mPassword= cursor.getString(NOTE_PASSWORD_COLUMN); + //密码标志 + mLocker=cursor.getString(NOTE_LOCKER_COLUMN); } cursor.close(); } else { diff --git a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java index 2a14982..9e222a9 100644 --- a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java @@ -25,10 +25,14 @@ 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.NoteEditActivity; +import net.micode.notes.ui.NotesListActivity; import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; import java.util.ArrayList; @@ -53,6 +57,12 @@ public class DataUtils { Log.e(TAG, "Don't delete system folder root"); continue; } + /** + * 如果可以删除,判断是否上锁,上锁则无法删除 + */ + if (NotesProvider.isLockedNote(id)){ + continue; + } ContentProviderOperation.Builder builder = ContentProviderOperation .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); operationList.add(builder.build()); diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java index d53101e..c18427a 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java @@ -151,6 +151,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, private String mUserQuery; private Pattern mPattern; + //private int flag=0;//作为判断删除密码时有无验证通过 @Override protected void onCreate(Bundle savedInstanceState) { @@ -279,16 +280,23 @@ public class NoteEditActivity extends Activity implements OnClickListener, //创建dialog,插入edittext,用户输入密码并做出检验。 final AlertDialog.Builder builder = new AlertDialog.Builder(this); View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); - //编辑Text + //编辑dialog界面 + final EditText etNameOld= (EditText)view.findViewById(R.id.et_foler_name_old);//只需要验证原密码 final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); - etName.setText(""); - etName.setHint("请输入密码"); + etName.setVisibility(view.GONE); + final TextView etName_View=(TextView)view.findViewById(R.id.et_foler_name_view); + etName_View.setVisibility(view.GONE); + final EditText etNameAgain = (EditText) view.findViewById(R.id.et_foler_name_again); + etNameAgain.setVisibility(view.GONE); + final TextView etNameAgain_View=(TextView)view.findViewById(R.id.et_foler_name_again_view); + etNameAgain_View.setVisibility(view.GONE); + // builder.setTitle("密码检验"); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //获取输入的字符串 - String password = etName.getText().toString(); + String password = etNameOld.getText().toString(); Log.d("mPassword: ", mPassword); Log.d("password: ", password); //判断密码正确性 @@ -296,22 +304,24 @@ public class NoteEditActivity extends Activity implements OnClickListener, Log.d("密码不正确,正确密码是:",mPassword); Toast.makeText(NoteEditActivity.this, "密码错误", Toast.LENGTH_SHORT).show(); dialog.dismiss(); - onBackPressed(); + //onBackPressed(); //关闭软键盘 InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(etName.getWindowToken(),0); } else{ - Toast.makeText(NoteEditActivity.this, "密码正确", Toast.LENGTH_SHORT).show(); + //flag=1;//密码验证正确的标志 + deletePassword(); + Toast.makeText(NoteEditActivity.this, "密码正确,删除密码成功。", Toast.LENGTH_SHORT).show(); + return; } } }); builder.setNegativeButton("cancel", new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - onBackPressed(); + finish(); } }); final Dialog dialog = builder.setView(view).show(); @@ -578,9 +588,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - deleteCurrentNote(); - finish(); - } + if (!mWorkingNote.hasPassword()) {//判断有无密码,有密码则无法删除 + deleteCurrentNote(); + finish(); + } + else{ + Toast.makeText(NoteEditActivity.this, "无法删除设密便签", Toast.LENGTH_SHORT).show(); + return; + } + } }); builder.setNegativeButton(android.R.string.cancel, null); builder.show(); @@ -613,8 +629,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, //删除密码 case R.id.menu_delete_passwd: //删除密码前要检验密码 - checkPassword(); - deletePassword(); + checkPassword();//并且在里边一并执行deletepassword函数 break; case R.id.top: mWorkingNote.setTop((mWorkingNote.getTopId()) == 1 ? "0" : "1"); @@ -629,17 +644,59 @@ public class NoteEditActivity extends Activity implements OnClickListener, final AlertDialog.Builder builder = new AlertDialog.Builder(this); final View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text,null); //编辑Text - final EditText etName = (EditText)view.findViewById(R.id.et_foler_name); + final EditText etNameOld= (EditText)view.findViewById(R.id.et_foler_name_old);//如果设置了密码,这是原密码 + etNameOld.setVisibility(view.GONE); + final TextView etNameOld_View=(TextView)view.findViewById(R.id.et_foler_name_old_view); + etNameOld_View.setVisibility(view.GONE); + if (mWorkingNote.hasPassword()){//如果设置了密码 + etNameOld.setVisibility(view.VISIBLE); + etNameOld_View.setVisibility(view.VISIBLE); + etNameOld.setText(""); + etNameOld.setHint("请输入原密码"); + } + final EditText etName = (EditText)view.findViewById(R.id.et_foler_name);//要设置的密码 + final EditText etNameAgain=(EditText)view.findViewById(R.id.et_foler_name_again);//确认密码 + //final EditText finalEtNameOld = etNameOld; etName.setText(""); etName.setHint("请输入密码"); - builder.setTitle("为便签设置新密码"); + etNameAgain.setText(""); + etNameAgain.setHint("请确认密码"); + builder.setTitle("设置密码"); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //获取输入的字符串 String password = etName.getText().toString(); + String password_again=etNameAgain.getText().toString(); + String password_old = null; + if (mWorkingNote.hasPassword()){ + password_old= etNameOld.getText().toString(); + } + //当输入原密码不对时 + if (mWorkingNote.hasPassword()) { + if(!password_old.equals(mWorkingNote.getmPassword())) { + Toast.makeText(NoteEditActivity.this, "原密码错误", Toast.LENGTH_SHORT).show(); + return; + } + } + //当设置的密码为空的时候 + if (password==null || password.length()==0){ + //关闭软键盘 + InputMethodManager inputMethodManager = (InputMethodManager) + getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(etName.getWindowToken(),0); + dialog.dismiss(); + Toast.makeText(NoteEditActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show(); + return; + } + //当确认密码不对时 + if (!password.equals(password_again)){ + Toast.makeText(NoteEditActivity.this, "密码不一致", Toast.LENGTH_SHORT).show(); + return; + } //设置密码 mWorkingNote.setPassword(password); + mWorkingNote.setLocker("1");//设置密码标志为上锁 //设置密码成功提示 Toast.makeText(NoteEditActivity.this, "密码设置成功", Toast.LENGTH_SHORT).show(); //关闭软键盘 @@ -666,6 +723,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, public void deletePassword() { mWorkingNote.setPassword(""); + mWorkingNote.setLocker("0");//设置密码标志为没有锁 + //onBackPressed(); } diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java b/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java index 0f5a878..6904587 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java @@ -19,6 +19,7 @@ package net.micode.notes.ui; import android.content.Context; import android.database.Cursor; import android.text.TextUtils; +import android.util.Log; import net.micode.notes.data.Contact; import net.micode.notes.data.Notes; @@ -40,6 +41,7 @@ public class NoteItemData { NoteColumns.TYPE, NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, + NoteColumns.LOCKER, }; private static final int ID_COLUMN = 0; @@ -54,6 +56,8 @@ public class NoteItemData { private static final int TYPE_COLUMN = 9; private static final int WIDGET_ID_COLUMN = 10; private static final int WIDGET_TYPE_COLUMN = 11; + //密码标志 + private static final int LOCKER_COLUMN=12; private long mId; private long mAlertDate; @@ -69,6 +73,8 @@ public class NoteItemData { private int mWidgetType; private String mName; private String mPhoneNumber; + //密码标志 + private String mLocker; private boolean mIsLastItem; private boolean mIsFirstItem; @@ -76,6 +82,17 @@ public class NoteItemData { private boolean mIsOneNoteFollowingFolder; private boolean mIsMultiNotesFollowingFolder; + //判断是否上锁 + public boolean isLocked(){ + if(mLocker.equals("0")) { + Log.d("标志是", mLocker); + return false; + }else { + Log.d("标志是", mLocker); + return true; + } + + } public NoteItemData(Context context, Cursor cursor) { mId = cursor.getLong(ID_COLUMN); mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); @@ -91,6 +108,7 @@ public class NoteItemData { mType = cursor.getInt(TYPE_COLUMN); mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); + mLocker = cursor.getString(LOCKER_COLUMN); mPhoneNumber = ""; if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java index 1f398a3..6a53db8 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java @@ -910,7 +910,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt case SUB_FOLDER: case CALL_RECORD_FOLDER: if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); + //打开PassWordEditAcitivity类,并传递noteid + Intent intent = new Intent(NotesListActivity.this, PassWordEditActivity.class); + long noteId = item.getId(); + intent.putExtra("noteId", noteId); + startActivity(intent); + // + //openNode(item); } else { Log.e(TAG, "Wrong note type in SUB_FOLDER"); } diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java b/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java index 1221e80..785cd09 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java @@ -37,7 +37,7 @@ public class NotesListItem extends LinearLayout { private TextView mCallName; private NoteItemData mItemData; private CheckBox mCheckBox; - + private ImageView mLocker; public NotesListItem(Context context) { super(context); inflate(context, R.layout.note_item, this); @@ -46,6 +46,8 @@ public class NotesListItem extends LinearLayout { mTime = (TextView) findViewById(R.id.tv_time); mCallName = (TextView) findViewById(R.id.tv_name); mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); + //添加锁的标志 + mLocker =(ImageView)findViewById(R.id.iv_locker_icon); } public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { @@ -75,6 +77,14 @@ public class NotesListItem extends LinearLayout { } else { mAlert.setVisibility(View.GONE); } + /**设置密码标志 + if(data.isLocked()){ + mLocker.setImageResource(R.drawable.ic_lock_idle_lock); + mLocker.setVisibility(View.VISIBLE); + } else{ + mLocker.setVisibility(View.GONE); + } + */ } else { mCallName.setVisibility(View.GONE); mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); @@ -92,6 +102,16 @@ public class NotesListItem extends LinearLayout { } else { mAlert.setVisibility(View.GONE); } + //设置密码标志以及使加密便签内容不可见,未加密则可见。 + if(data.isLocked()){ + mLocker.setImageResource(R.drawable.ic_lock_idle_lock); + mLocker.setVisibility(View.VISIBLE); + String text = "已加密"; + mTitle.setText(text); + } else{ + mLocker.setVisibility(View.GONE); + } + // } } mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));