diff --git a/gaoheng/AndroidManifest.xml b/gaoheng/AndroidManifest.xml
new file mode 100644
index 00000000..5df8c809
--- /dev/null
+++ b/gaoheng/AndroidManifest.xml
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gaoheng/ChangingPassword.java b/gaoheng/ChangingPassword.java
new file mode 100644
index 00000000..06ec2571
--- /dev/null
+++ b/gaoheng/ChangingPassword.java
@@ -0,0 +1,77 @@
+/*gaoheng*/
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;import android.widget.Toast;
+
+import net.micode.notes.R;
+public class ChangingPassword extends Activity {
+ EditText OldPassword;
+ EditText NewPassword;
+ EditText AckPassword;
+ Button Acknowledged;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_change_password);
+ getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+ | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ OldPassword=(EditText) findViewById(R.id.old_password);
+ NewPassword=(EditText) findViewById(R.id.new_password);
+ AckPassword=(EditText) findViewById(R.id.ack_password);
+ Acknowledged=(Button)findViewById(R.id.Acknowledged);
+ Acknowledged.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String old_password = OldPassword.getText().toString();
+ String new_password = NewPassword.getText().toString();
+ String ack_password = AckPassword.getText().toString();
+ SharedPreferences pref=getSharedPreferences("user management",MODE_PRIVATE);
+ String login_password=pref.getString("password","");
+
+ boolean User_boolean = pref.getBoolean("user",false);//获取用户是否设置了密码
+ if(!User_boolean) //User_boolean = false 时, ( 没有设置密码) , 直接跳转到便签主界面
+ {
+ Toast.makeText(ChangingPassword.this, "已经设置过密码",
+ Toast.LENGTH_SHORT).show();
+ }
+
+ if(old_password.equals("")==true || new_password.equals("")==true
+ || ack_password.equals("")==true) {
+ Toast.makeText(ChangingPassword.this, "密码不能为空",
+ Toast.LENGTH_SHORT).show();
+ }else if (new_password.equals(ack_password) == false) {
+ Toast.makeText(ChangingPassword.this, "新建密码与重复密码不匹配, 请重新输入密码", Toast.LENGTH_SHORT).show();
+ AckPassword.setText("");
+ }else if(old_password.equals(login_password) == false){
+ Toast.makeText(ChangingPassword.this, "原有密码错误, 请重新输入 密码", Toast.LENGTH_SHORT).show();
+ OldPassword.setText("");
+ }else if (new_password.equals(ack_password) == true &&
+ old_password.equals(login_password) == true){
+ SharedPreferences.Editor editor=getSharedPreferences("user management", MODE_PRIVATE).edit();
+ editor.putString("password",new_password);
+ editor.apply();
+ Toast.makeText(ChangingPassword.this, "修改密码成功",
+ Toast.LENGTH_SHORT).show();
+ Intent intent=new
+ Intent(ChangingPassword.this,NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ }
+ });
+ } @
+ Override
+ public void onBackPressed() {
+ Intent intent=new Intent(ChangingPassword.this,NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ }
+}
\ No newline at end of file
diff --git a/gaoheng/DeletingPassword.java b/gaoheng/DeletingPassword.java
new file mode 100644
index 00000000..ed64d7c6
--- /dev/null
+++ b/gaoheng/DeletingPassword.java
@@ -0,0 +1,62 @@
+/*gaoheng*/
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import net.micode.notes.R;
+public class DeletingPassword extends Activity {
+ EditText Dt_password;
+ Button Acknowledged;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_delete_password);
+ getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+ | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ Dt_password=(EditText) findViewById(R.id.thepassword);
+ Acknowledged=(Button)findViewById(R.id.Dt_Acknowledged);
+ Acknowledged.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String text02 = Dt_password.getText().toString();
+ if(text02.equals("")==true)
+ Toast.makeText(DeletingPassword.this, "密码不能为空",
+ Toast.LENGTH_SHORT).show();
+ SharedPreferences pref=getSharedPreferences("user management",MODE_PRIVATE);
+ String password = pref.getString("password","");
+ if(password.equals("")==false&&password.equals(text02)==true){
+ SharedPreferences.Editor editor=getSharedPreferences("user management",
+ MODE_PRIVATE).edit();
+ editor.putBoolean("user",false);//false 表示已经设置登录密码
+ editor.putString("password","");
+ editor.apply();
+ Toast.makeText(DeletingPassword.this, "已删除密码",
+ Toast.LENGTH_SHORT).show();
+ Intent intent=new
+ Intent(DeletingPassword.this,NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ } else{
+ Toast.makeText(DeletingPassword.this, "密码错误",
+ Toast.LENGTH_SHORT).show();
+
+ Dt_password.setText("");//把密码框内输入过的错误密码清空
+ }
+ }
+ });
+ } @
+ Override
+ public void onBackPressed() {Intent intent=new Intent(DeletingPassword.this,NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ }
+}
\ No newline at end of file
diff --git a/gaoheng/LoginActivity.java b/gaoheng/LoginActivity.java
new file mode 100644
index 00000000..c6d7e06e
--- /dev/null
+++ b/gaoheng/LoginActivity.java
@@ -0,0 +1,67 @@
+/*gaoheng*/
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import net.micode.notes.R;
+
+public class LoginActivity extends Activity {
+
+ EditText lg_password;
+ Button lg_login;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+
+
+ SharedPreferences pref = getSharedPreferences("user management", MODE_PRIVATE);
+ boolean userBoolean = pref.getBoolean("user", false); // 获取用户是否设置了密码
+
+ if (!userBoolean) { // userBoolean = false 时(没有设置密码),直接跳转到便签主界面
+ Intent intent = new Intent(LoginActivity.this, NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ }
+
+ setContentView(R.layout.activity_login);
+
+ getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
+ | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+
+ lg_password = (EditText) findViewById(R.id.lg_password);
+ lg_login = (Button) findViewById(R.id.login);
+ lg_login.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ SharedPreferences pref = getSharedPreferences("user management", MODE_PRIVATE);
+ String password = pref.getString("password", "");
+
+ if (!password.equals("") && password.equals(lg_password.getText().toString())) {
+ Intent intent = new Intent(LoginActivity.this, NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ } else {
+ Toast.makeText(LoginActivity.this, "密码错误", Toast.LENGTH_SHORT).show();
+ /*
+ 用来重新登录或者忘记密码的时候更改
+ SharedPreferences.Editor editor = null;
+ editor.putString("password", "1234567");
+ editor.apply();
+ */
+ lg_password.setText(""); // 把密码框内输入过的错误密码清空
+ }
+ }
+ });
+ }
+}
diff --git a/gaoheng/NoteEditActivity.java b/gaoheng/NoteEditActivity.java
new file mode 100644
index 00000000..1b2911a4
--- /dev/null
+++ b/gaoheng/NoteEditActivity.java
@@ -0,0 +1,965 @@
+/*
+ * 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.
+ */
+
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.app.AlertDialog;
+import android.app.PendingIntent;
+import android.app.SearchManager;
+import android.appwidget.AppWidgetManager;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Paint;
+import android.graphics.Typeface;
+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.format.DateUtils;
+import android.text.style.BackgroundColorSpan;
+import android.text.style.ImageSpan;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.WindowManager;
+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;
+/*gaoheng*/
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TextToSpeech.OnInitListener;
+
+import net.micode.notes.R;
+import net.micode.notes.data.Notes;
+import net.micode.notes.data.Notes.TextNote;
+import net.micode.notes.model.WorkingNote;
+import net.micode.notes.model.WorkingNote.NoteSettingChangedListener;
+import net.micode.notes.tool.DataUtils;
+import net.micode.notes.tool.ResourceParser;
+import net.micode.notes.tool.ResourceParser.TextAppearanceResources;
+import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener;
+import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
+import net.micode.notes.widget.NoteWidgetProvider_2x;
+import net.micode.notes.widget.NoteWidgetProvider_4x;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+
+public class NoteEditActivity extends Activity implements OnClickListener,
+ NoteSettingChangedListener, OnTextViewChangeListener {
+ private class HeadViewHolder {
+ public TextView tvModified;
+
+ public ImageView ivAlertIcon;
+
+ public TextView tvAlertDate;
+
+ public ImageView ibSetBgColor;
+ }
+
+ private static final Map sBgSelectorBtnsMap = new HashMap();
+ static {
+ sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW);
+ sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED);
+ sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE);
+ sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN);
+ sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE);
+ }
+
+ private static final Map sBgSelectorSelectionMap = new HashMap();
+ static {
+ sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select);
+ sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select);
+ sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select);
+ sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select);
+ sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select);
+ }
+
+ private static final Map sFontSizeBtnsMap = new HashMap();
+ static {
+ sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE);
+ sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL);
+ sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM);
+ sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER);
+ }
+
+ private static final Map sFontSelectorSelectionMap = new HashMap();
+ static {
+ sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select);
+ sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select);
+ sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select);
+ sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select);
+ }
+
+ private static final String TAG = "NoteEditActivity";
+
+ private HeadViewHolder mNoteHeaderHolder;
+
+ private View mHeadViewPanel;
+
+ private View mNoteBgColorSelector;
+
+ private View mFontSizeSelector;
+
+ private EditText mNoteEditor;
+
+ private View mNoteEditorPanel;
+
+ private WorkingNote mWorkingNote;
+
+ private SharedPreferences mSharedPrefs;
+ private int mFontSizeId;
+
+ private static final String PREFERENCE_FONT_SIZE = "pref_font_size";
+
+ private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10;
+
+ public static final String TAG_CHECKED = String.valueOf('\u221A');
+ public static final String TAG_UNCHECKED = String.valueOf('\u25A1');
+
+ private LinearLayout mEditTextList;
+
+ private String mUserQuery;
+ private Pattern mPattern;
+ /*gaoheng*/
+ private TextToSpeech mTts ;
+ ;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ this.setContentView(R.layout.note_edit);
+
+ if (savedInstanceState == null && !initActivityState(getIntent())) {
+ finish();
+ return;
+ }
+ initResources();
+
+ }
+
+ /**
+ * 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);
+ if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID));
+ if (!initActivityState(intent)) {
+ finish();
+ return;
+ }
+ Log.d(TAG, "Restoring from killed activity");
+ }
+ }
+
+ private boolean initActivityState(Intent intent) {
+ /**
+ * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id,
+ * then jump to the NotesListActivity
+ */
+ mWorkingNote = null;
+ if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {
+ long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0);
+ mUserQuery = "";
+
+ /**
+ * Starting from the searched result
+ */
+ if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) {
+ noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
+ mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);
+ }
+
+ if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {
+ Intent jump = new Intent(this, NotesListActivity.class);
+ startActivity(jump);
+ showToast(R.string.error_note_not_exist);
+ finish();
+ return false;
+ } else {
+ mWorkingNote = WorkingNote.load(this, noteId);
+ if (mWorkingNote == null) {
+ Log.e(TAG, "load note failed with note id" + noteId);
+ finish();
+ return false;
+ }
+ }
+ 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())) {
+ // New note
+ long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0);
+ int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID);
+ int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE,
+ Notes.TYPE_WIDGET_INVALIDE);
+ int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID,
+ ResourceParser.getDefaultBgId(this));
+
+ // Parse call-record note
+ String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
+ long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0);
+ if (callDate != 0 && phoneNumber != null) {
+ if (TextUtils.isEmpty(phoneNumber)) {
+ Log.w(TAG, "The call record number is null");
+ }
+ long noteId = 0;
+ if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(),
+ phoneNumber, callDate)) > 0) {
+ mWorkingNote = WorkingNote.load(this, noteId);
+ if (mWorkingNote == null) {
+ Log.e(TAG, "load call note failed with note id" + noteId);
+ finish();
+ return false;
+ }
+ } else {
+ mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId,
+ widgetType, bgResId);
+ mWorkingNote.convertToCallNote(phoneNumber, callDate);
+ }
+ } else {
+ mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType,
+ bgResId);
+ }
+
+ getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+ | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ } else {
+ Log.e(TAG, "Intent not specified action, should not support");
+ finish();
+ return false;
+ }
+ mWorkingNote.setOnSettingStatusChangedListener(this);
+ return true;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ initNoteScreen();
+ }
+
+ private void initNoteScreen() {
+ mNoteEditor.setTextAppearance(this, TextAppearanceResources
+ .getTexAppearanceResource(mFontSizeId));
+ if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
+ switchToListMode(mWorkingNote.getContent());
+ } else {
+ mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
+ mNoteEditor.setSelection(mNoteEditor.getText().length());
+ }
+ for (Integer id : sBgSelectorSelectionMap.keySet()) {
+ findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE);
+ }
+ mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
+ mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
+
+ mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this,
+ mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE
+ | 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();
+ }
+
+ private void showAlertHeader() {
+ if (mWorkingNote.hasClockAlert()) {
+ long time = System.currentTimeMillis();
+ if (time > mWorkingNote.getAlertDate()) {
+ mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);
+ } else {
+ mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString(
+ mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS));
+ }
+ mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE);
+ mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE);
+ } else {
+ mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE);
+ mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE);
+ };
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ initActivityState(intent);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ /**
+ * For new note without note id, we should firstly save it to
+ * generate a id. If the editing note is not worth saving, there
+ * is no id which is equivalent to create new note
+ */
+ if (!mWorkingNote.existInDatabase()) {
+ saveNote();
+ }
+ outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId());
+ Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState");
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ if (mNoteBgColorSelector.getVisibility() == View.VISIBLE
+ && !inRangeOfView(mNoteBgColorSelector, ev)) {
+ mNoteBgColorSelector.setVisibility(View.GONE);
+ return true;
+ }
+
+ if (mFontSizeSelector.getVisibility() == View.VISIBLE
+ && !inRangeOfView(mFontSizeSelector, ev)) {
+ mFontSizeSelector.setVisibility(View.GONE);
+ return true;
+ }
+ return super.dispatchTouchEvent(ev);
+ }
+
+ private boolean inRangeOfView(View view, MotionEvent ev) {
+ int []location = new int[2];
+ view.getLocationOnScreen(location);
+ int x = location[0];
+ int y = location[1];
+ if (ev.getX() < x
+ || ev.getX() > (x + view.getWidth())
+ || ev.getY() < y
+ || ev.getY() > (y + view.getHeight())) {
+ return false;
+ }
+ return true;
+ }
+
+ private void initResources() {
+ mTts = new TextToSpeech(this, new OnInitListener() {
+ @Override
+ /*gaoheng*/
+ public void onInit(int status) {
+ if (status == TextToSpeech.SUCCESS) {
+ //设置首选语言为中文,注意,语言可能是不可用的,结果将指示此
+ int result = mTts.setLanguage(Locale.US);
+ if (result == TextToSpeech.LANG_MISSING_DATA ||
+ result == TextToSpeech.LANG_NOT_SUPPORTED) {
+ //语言数据丢失或不支持该语言。
+ Log.e(TAG, "语言数据丢失或不支持该语言");
+ }
+ } else {
+ // 初始化失败
+ Log.e(TAG, "初始化失败");
+ }
+ }
+ });
+ mHeadViewPanel = findViewById(R.id.note_title);
+ mNoteHeaderHolder = new HeadViewHolder();
+ mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date);
+ mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon);
+ mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date);
+ mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color);
+ mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this);
+ mNoteEditor = (EditText) findViewById(R.id.note_edit_view);
+ mNoteEditorPanel = findViewById(R.id.sv_note_edit);
+ mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);
+ for (int id : sBgSelectorBtnsMap.keySet()) {
+ ImageView iv = (ImageView) findViewById(id);
+ iv.setOnClickListener(this);
+ }
+
+ mFontSizeSelector = findViewById(R.id.font_size_selector);
+ for (int id : sFontSizeBtnsMap.keySet()) {
+ View view = findViewById(id);
+ view.setOnClickListener(this);
+ };
+ mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE);
+ /**
+ * HACKME: Fix bug of store the resource id in shared preference.
+ * The id may larger than the length of resources, in this case,
+ * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE}
+ */
+ if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) {
+ mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;
+ }
+ mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
+
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ if(saveNote()) {
+ Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length());
+ }
+ clearSettingState();
+ }
+
+ private void updateWidget() {
+ Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
+ if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {
+ intent.setClass(this, NoteWidgetProvider_2x.class);
+ } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) {
+ intent.setClass(this, NoteWidgetProvider_4x.class);
+ } else {
+ Log.e(TAG, "Unspported widget type");
+ return;
+ }
+
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {
+ mWorkingNote.getWidgetId()
+ });
+
+ sendBroadcast(intent);
+ setResult(RESULT_OK, intent);
+ }
+
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.btn_set_bg_color) {
+ mNoteBgColorSelector.setVisibility(View.VISIBLE);
+ findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
+ View.VISIBLE);
+ } else if (sBgSelectorBtnsMap.containsKey(id)) {
+ findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
+ View.GONE);
+ mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));
+ mNoteBgColorSelector.setVisibility(View.GONE);
+ } else if (sFontSizeBtnsMap.containsKey(id)) {
+ findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);
+ mFontSizeId = sFontSizeBtnsMap.get(id);
+ mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit();
+ findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
+ if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
+ getWorkingText();
+ switchToListMode(mWorkingNote.getContent());
+ } else {
+ mNoteEditor.setTextAppearance(this,
+ TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
+ }
+ mFontSizeSelector.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ if(clearSettingState()) {
+ return;
+ }
+
+ saveNote();
+ super.onBackPressed();
+ }
+
+ private boolean clearSettingState() {
+ if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) {
+ mNoteBgColorSelector.setVisibility(View.GONE);
+ return true;
+ } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) {
+ mFontSizeSelector.setVisibility(View.GONE);
+ return true;
+ }
+ return false;
+ }
+
+ public void onBackgroundColorChanged() {
+ findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
+ View.VISIBLE);
+ mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
+ mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ if (isFinishing()) {
+ return true;
+ }
+ clearSettingState();
+ menu.clear();
+ if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) {
+ getMenuInflater().inflate(R.menu.call_note_edit, menu);
+ } else {
+ getMenuInflater().inflate(R.menu.note_edit, menu);
+ }
+ if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
+ menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode);
+ } else {
+ menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);
+ }
+ if (mWorkingNote.hasClockAlert()) {
+ menu.findItem(R.id.menu_alert).setVisible(false);
+ } else {
+ menu.findItem(R.id.menu_delete_remind).setVisible(false);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int itemId = item.getItemId();
+ if (itemId == R.id.menu_new_note) {
+ createNewNote();
+ } else if (itemId == R.id.menu_delete) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(getString(R.string.alert_title_delete));
+ builder.setIcon(android.R.drawable.ic_dialog_alert);
+ builder.setMessage(getString(R.string.alert_message_delete_note));
+ builder.setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ deleteCurrentNote();
+ finish();
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel, null);
+ builder.show();
+ } else if (itemId == R.id.menu_font_size) {
+ mFontSizeSelector.setVisibility(View.VISIBLE);
+ findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
+ } else if (itemId == R.id.menu_list_mode) {
+ mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
+ TextNote.MODE_CHECK_LIST : 0);
+ } else if (itemId == R.id.menu_share) {
+ getWorkingText();
+ sendTo(this, mWorkingNote.getContent());
+ } else if (itemId == R.id.menu_send_to_desktop) {
+ sendToDesktop();
+ } else if (itemId == R.id.menu_alert) {
+ setReminder();
+ } else if (itemId == R.id.menu_delete_remind) {
+ mWorkingNote.setAlertDate(0, false);
+ }
+ /*gaoheng*/
+ else if (itemId == R.id.menu_read_contain) {
+ testToSpeech();
+ } else if (itemId == R.id.menu_change_font) {
+ changeFont();
+ }
+
+
+ return true;
+ }
+ /*gaoheng*/
+ private void testToSpeech(){
+ mTts.speak(mNoteEditor.getText().toString(),TextToSpeech.QUEUE_FLUSH,null);
+
+ }
+ /*gaoheng*/
+ //弹出单选对话框选择不同字体
+ public void changeFont() {
+ final String[] items = {"普通", "非衬线", "衬线", "等宽", "简体"};
+ AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
+ alertBuilder.setTitle("更换字体");
+ alertBuilder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ switch (i) {
+ case 0:
+ mNoteEditor.setTypeface(Typeface.DEFAULT);
+ break;
+ case 1:
+ mNoteEditor.setTypeface(Typeface.SANS_SERIF);
+ break;
+ case 2:
+ mNoteEditor.setTypeface(Typeface.SERIF);
+ break;
+ case 3:
+ mNoteEditor.setTypeface(Typeface.MONOSPACE);
+ break;
+ case 4:
+ Typeface typeface0 = Typeface.createFromAsset(getAssets(), "main/assets/font/simsunb.ttf");
+ mNoteEditor.setTypeface(typeface0);
+ break;
+ }
+ Toast.makeText(NoteEditActivity.this, items[i],
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ alertBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ dialogInterface.dismiss();
+ }
+ });
+
+ alertBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ dialogInterface.dismiss();
+ }
+ });
+
+ AlertDialog alertDialog = alertBuilder.create();
+ alertDialog.show();
+ }
+
+
+
+ private void setReminder() {
+ DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis());
+ d.setOnDateTimeSetListener(new OnDateTimeSetListener() {
+ public void OnDateTimeSet(AlertDialog dialog, long date) {
+ mWorkingNote.setAlertDate(date , true);
+ }
+ });
+ 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);
+ intent.setType("text/plain");
+ context.startActivity(intent);
+ }
+
+ private void createNewNote() {
+ // Firstly, save current editing notes
+ saveNote();
+
+ // For safety, start a new NoteEditActivity
+ finish();
+ Intent intent = new Intent(this, NoteEditActivity.class);
+ intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
+ intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId());
+ startActivity(intent);
+ }
+
+ private void deleteCurrentNote() {
+ if (mWorkingNote.existInDatabase()) {
+ HashSet ids = new HashSet();
+ long id = mWorkingNote.getNoteId();
+ if (id != Notes.ID_ROOT_FOLDER) {
+ ids.add(id);
+ } else {
+ Log.d(TAG, "Wrong note id, should not happen");
+ }
+ if (!isSyncMode()) {
+ if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {
+ Log.e(TAG, "Delete Note error");
+ }
+ } else {
+ if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) {
+ Log.e(TAG, "Move notes to trash folder error, should not happens");
+ }
+ }
+ }
+ mWorkingNote.markDeleted(true);
+ }
+
+ private boolean isSyncMode() {
+ return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
+ }
+
+ public void onClockAlertChanged(long date, boolean set) {
+ /**
+ * User could set clock to an unsaved note, so before setting the
+ * alert clock, we should save the note first
+ */
+ if (!mWorkingNote.existInDatabase()) {
+ saveNote();
+ }
+ if (mWorkingNote.getNoteId() > 0) {
+ Intent intent = new Intent(this, AlarmReceiver.class);
+ intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId()));
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
+ AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE));
+ showAlertHeader();
+ if(!set) {
+ alarmManager.cancel(pendingIntent);
+ } else {
+ alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);
+ }
+ } else {
+ /**
+ * There is the condition that user has input nothing (the note is
+ * not worthy saving), we have no note id, remind the user that he
+ * should input something
+ */
+ Log.e(TAG, "Clock alert setting error");
+ showToast(R.string.error_note_empty_for_clock);
+ }
+ }
+
+ public void onWidgetChanged() {
+ updateWidget();
+ }
+
+ public void onEditTextDelete(int index, String text) {
+ int childCount = mEditTextList.getChildCount();
+ if (childCount == 1) {
+ return;
+ }
+
+ for (int i = index + 1; i < childCount; i++) {
+ ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text))
+ .setIndex(i - 1);
+ }
+
+ mEditTextList.removeViewAt(index);
+ NoteEditText edit = null;
+ if(index == 0) {
+ edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById(
+ R.id.et_edit_text);
+ } else {
+ edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById(
+ R.id.et_edit_text);
+ }
+ int length = edit.length();
+ edit.append(text);
+ edit.requestFocus();
+ edit.setSelection(length);
+ }
+
+ public void onEditTextEnter(int index, String text) {
+ /**
+ * Should not happen, check for debug
+ */
+ if(index > mEditTextList.getChildCount()) {
+ Log.e(TAG, "Index out of mEditTextList boundrary, should not happen");
+ }
+
+ View view = getListItem(text, index);
+ mEditTextList.addView(view, index);
+ NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
+ edit.requestFocus();
+ edit.setSelection(0);
+ for (int i = index + 1; i < mEditTextList.getChildCount(); i++) {
+ ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text))
+ .setIndex(i);
+ }
+ }
+
+ private void switchToListMode(String text) {
+ mEditTextList.removeAllViews();
+ String[] items = text.split("\n");
+ int index = 0;
+ for (String item : items) {
+ if(!TextUtils.isEmpty(item)) {
+ mEditTextList.addView(getListItem(item, index));
+ index++;
+ }
+ }
+ mEditTextList.addView(getListItem("", index));
+ mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus();
+
+ mNoteEditor.setVisibility(View.GONE);
+ mEditTextList.setVisibility(View.VISIBLE);
+ }
+
+ private Spannable getHighlightQueryResult(String fullText, String userQuery) {
+ SpannableString spannable = new SpannableString(fullText == null ? "" : fullText);
+ if (!TextUtils.isEmpty(userQuery)) {
+ mPattern = Pattern.compile(userQuery);
+ Matcher m = mPattern.matcher(fullText);
+ int start = 0;
+ while (m.find(start)) {
+ spannable.setSpan(
+ new BackgroundColorSpan(this.getResources().getColor(
+ R.color.user_query_highlight)), m.start(), m.end(),
+ Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+ start = m.end();
+ }
+ }
+ return spannable;
+ }
+
+ private View getListItem(String item, int index) {
+ View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null);
+ final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
+ edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
+ CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item));
+ cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
+ } else {
+ edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
+ }
+ }
+ });
+
+ if (item.startsWith(TAG_CHECKED)) {
+ cb.setChecked(true);
+ edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
+ item = item.substring(TAG_CHECKED.length(), item.length()).trim();
+ } else if (item.startsWith(TAG_UNCHECKED)) {
+ cb.setChecked(false);
+ edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
+ item = item.substring(TAG_UNCHECKED.length(), item.length()).trim();
+ }
+
+ edit.setOnTextViewChangeListener(this);
+ edit.setIndex(index);
+ edit.setText(getHighlightQueryResult(item, mUserQuery));
+ return view;
+ }
+
+ public void onTextChange(int index, boolean hasText) {
+ if (index >= mEditTextList.getChildCount()) {
+ Log.e(TAG, "Wrong index, should not happen");
+ return;
+ }
+ if(hasText) {
+ mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE);
+ } else {
+ mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE);
+ }
+ }
+
+ public void onCheckListModeChanged(int oldMode, int newMode) {
+ if (newMode == TextNote.MODE_CHECK_LIST) {
+ switchToListMode(mNoteEditor.getText().toString());
+ } else {
+ if (!getWorkingText()) {
+ mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ",
+ ""));
+ }
+ mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
+ mEditTextList.setVisibility(View.GONE);
+ mNoteEditor.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private boolean getWorkingText() {
+ boolean hasChecked = false;
+ if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < mEditTextList.getChildCount(); i++) {
+ View view = mEditTextList.getChildAt(i);
+ NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
+ if (!TextUtils.isEmpty(edit.getText())) {
+ if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) {
+ sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n");
+ hasChecked = true;
+ } else {
+ sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n");
+ }
+ }
+ }
+ mWorkingNote.setWorkingText(sb.toString());
+ } else {
+ mWorkingNote.setWorkingText(mNoteEditor.getText().toString());
+ }
+ return hasChecked;
+ }
+
+ private boolean saveNote() {
+ getWorkingText();
+ boolean saved = mWorkingNote.saveNote();
+ if (saved) {
+ /**
+ * There are two modes from List view to edit view, open one note,
+ * create/edit a node. Opening node requires to the original
+ * position in the list when back from edit view, while creating a
+ * new node requires to the top of the list. This code
+ * {@link #RESULT_OK} is used to identify the create/edit state
+ */
+ setResult(RESULT_OK);
+ }
+ return saved;
+ }
+
+ private void sendToDesktop() {
+ /**
+ * Before send message to home, we should make sure that current
+ * editing note is exists in databases. So, for new note, firstly
+ * save it
+ */
+ if (!mWorkingNote.existInDatabase()) {
+ saveNote();
+ }
+
+ if (mWorkingNote.getNoteId() > 0) {
+ Intent sender = new Intent();
+ Intent shortcutIntent = new Intent(this, NoteEditActivity.class);
+ shortcutIntent.setAction(Intent.ACTION_VIEW);
+ shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId());
+ sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
+ sender.putExtra(Intent.EXTRA_SHORTCUT_NAME,
+ makeShortcutIconTitle(mWorkingNote.getContent()));
+ sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
+ Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app));
+ sender.putExtra("duplicate", true);
+ sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
+ showToast(R.string.info_note_enter_desktop);
+ sendBroadcast(sender);
+ } else {
+ /**
+ * There is the condition that user has input nothing (the note is
+ * not worthy saving), we have no note id, remind the user that he
+ * should input something
+ */
+ Log.e(TAG, "Send to desktop error");
+ showToast(R.string.error_note_empty_for_send_to_desktop);
+ }
+ }
+
+ private String makeShortcutIconTitle(String content) {
+ content = content.replace(TAG_CHECKED, "");
+ content = content.replace(TAG_UNCHECKED, "");
+ return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0,
+ SHORTCUT_ICON_TITLE_MAX_LEN) : content;
+ }
+
+ private void showToast(int resId) {
+ showToast(resId, Toast.LENGTH_SHORT);
+ }
+
+ private void showToast(int resId, int duration) {
+ Toast.makeText(this, resId, duration).show();
+ }
+}
diff --git a/gaoheng/SettingPassword.java b/gaoheng/SettingPassword.java
new file mode 100644
index 00000000..c642c530
--- /dev/null
+++ b/gaoheng/SettingPassword.java
@@ -0,0 +1,70 @@
+/*gaoheng*/
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import net.micode.notes.R;
+public class SettingPassword extends Activity {
+ EditText password;
+ EditText password_ack;
+ Button acknowledge;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_set_loginpassword);
+ getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+ | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ password=(EditText) findViewById(R.id.password);
+ password_ack=(EditText) findViewById(R.id.password_ack);
+ acknowledge=(Button)findViewById(R.id.acknowledge);
+ acknowledge.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ SharedPreferences pref=getSharedPreferences("user management",MODE_PRIVATE);
+ boolean User_boolean = pref.getBoolean("user",false);//获取用户是否设置了密码
+ if(User_boolean) //User_boolean = false 时, ( 没有设置密码) , 直接跳转到便签主界面
+ {
+ Toast.makeText(SettingPassword.this, "已经设置过密码",
+ Toast.LENGTH_SHORT).show();
+ }
+ String text02 = password.getText().toString();
+ String text03 = password_ack.getText().toString();
+ if(text02.equals("")==true) {Toast.makeText(SettingPassword.this, "密码不能为空",
+ Toast.LENGTH_SHORT).show();
+ }else if (text02.equals(text03) == false) {
+ Toast.makeText(SettingPassword.this, "密码不匹配, 请重新输入密码 ", Toast.LENGTH_SHORT).show();
+ password_ack.setText("");
+ }else if (text02.equals(text03) == true){
+ SharedPreferences.Editor editor=getSharedPreferences("user management",
+ MODE_PRIVATE).edit();
+ editor.putBoolean("user",true);//true 表示已经设置登录密码
+ editor.putString("password",text02);
+ editor.apply();
+ Log.d("RegisterLoginPassword","password is "+text02);
+ Toast.makeText(SettingPassword.this, "设置密码成功",
+ Toast.LENGTH_SHORT).show();
+ Intent intent=new
+ Intent(SettingPassword.this,NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ }
+ });
+ } @
+ Override
+ public void onBackPressed() {
+ Intent intent=new Intent(SettingPassword.this,NotesListActivity.class);
+ startActivity(intent);
+ finish();
+ }
+}
\ No newline at end of file
diff --git a/gaoheng/activity_change_password.xml b/gaoheng/activity_change_password.xml
new file mode 100644
index 00000000..e0f7d0f3
--- /dev/null
+++ b/gaoheng/activity_change_password.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gaoheng/activity_delete_password.xml b/gaoheng/activity_delete_password.xml
new file mode 100644
index 00000000..552853fc
--- /dev/null
+++ b/gaoheng/activity_delete_password.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gaoheng/activity_login.xml b/gaoheng/activity_login.xml
new file mode 100644
index 00000000..a1e68698
--- /dev/null
+++ b/gaoheng/activity_login.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gaoheng/activity_set_loginpassword.xml b/gaoheng/activity_set_loginpassword.xml
new file mode 100644
index 00000000..46bdca9b
--- /dev/null
+++ b/gaoheng/activity_set_loginpassword.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gaoheng/assets/font/simsunb.ttf b/gaoheng/assets/font/simsunb.ttf
new file mode 100644
index 00000000..e85793ac
Binary files /dev/null and b/gaoheng/assets/font/simsunb.ttf differ
diff --git a/gaoheng/note_edit.xml b/gaoheng/note_edit.xml
new file mode 100644
index 00000000..0891e272
--- /dev/null
+++ b/gaoheng/note_edit.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
diff --git a/gaoheng/note_list.xml b/gaoheng/note_list.xml
new file mode 100644
index 00000000..fb6d2e88
--- /dev/null
+++ b/gaoheng/note_list.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
diff --git a/gaoheng/strings.xml b/gaoheng/strings.xml
new file mode 100644
index 00000000..c7f5b612
--- /dev/null
+++ b/gaoheng/strings.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+ Notes
+ Notes 2x2
+ Notes 4x4
+ No associated note found, click to create associated note.
+ Privacy mode,can not see note content
+ ...
+ Add note
+ Delete reminder successfully
+ Set reminder
+ Expired
+ yyyyMMdd
+ MMMd kk:mm
+ Got it
+ Take a look
+ Call
+ Send email
+ Browse web
+ Open map
+
+ /MIUI/notes/
+ notes_%s.txt
+
+ (%d)
+ New Folder
+ Export text
+ Sync
+ Cancel syncing
+ Settings
+ Search
+ Delete
+ Move to folder
+ %d selected
+ Nothing selected, the operation is invalid
+ Select all
+ Deselect all
+ Font size
+ Small
+ Medium
+ Large
+ Super
+ Enter check list
+ Leave check list
+ View folder
+ Delete folder
+ Change folder name
+ The folder %1$s exist, please rename
+ Share
+ Send to home
+ Remind me
+ Delete reminder
+ Select folder
+ Parent folder
+
+ read contain
+ setting password
+ delete password
+ change password
+ change font
+
+ translate
+ Note added to home
+ Confirm to delete folder and its notes?
+ Delete selected notes
+ Confirm to delete the selected %d notes?
+ Confirm to delete this note?
+ Have moved selected %1$d notes to %2$s folder
+
+ SD card busy, not available now
+ Export failed, please check SD card
+ The note is not exist
+ Sorry, can not set clock on empty note
+ Sorry, can not send and empty note to home
+ Export successful
+ Export fail
+ Export text file (%1$s) to SD (%2$s) directory
+
+ Syncing notes...
+ Sync is successful
+ Sync is failed
+ Sync is canceled
+ Sync is successful with account %1$s
+ Sync failed, please check network and account settings
+ Sync failed, internal error occurs
+ Sync is canceled
+ Logging into %1$s...
+ Getting remote note list...
+ Synchronize local notes with Google Task...
+
+ Settings
+ Sync account
+ Sync notes with google task
+ Last sync time %1$s
+ yyyy-MM-dd hh:mm:ss
+ Add account
+ Change sync account
+ Remove sync account
+ Cancel
+ Sync immediately
+ Cancel syncing
+ Current account %1$s
+ All sync related information will be deleted, which may result in duplicated items sometime
+ Sync notes
+ Please select a google account. Local notes will be synced with google task.
+ Cannot change the account because sync is in progress
+ %1$s has been set as the sync account
+ New note background color random
+
+ Delete
+ Call notes
+ Input name
+
+ Searching Notes
+ Search notes
+ Text in your notes
+ Notes
+ set
+ cancel
+
+ - %1$s result for \"%2$s\"
+
+ - %1$s results for \"%2$s\"
+
+
+
diff --git a/gaoheng/屏幕截图 2024-01-18 184534.png b/gaoheng/屏幕截图 2024-01-18 184534.png
new file mode 100644
index 00000000..1c817b19
Binary files /dev/null and b/gaoheng/屏幕截图 2024-01-18 184534.png differ