/* * 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.Manifest; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Typeface; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.net.Uri; import android.os.Build; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.speech.tts.TextToSpeech; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; 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.Paint; import android.os.Bundle; import android.preference.PreferenceManager; import android.telecom.Call; 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; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; 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.ui.translate_demo.RespondBean; import net.micode.notes.widget.NoteWidgetProvider_2x; import net.micode.notes.widget.NoteWidgetProvider_4x; import java.io.FileNotFoundException; import java.net.URI; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.micode.notes.ui.translate_demo.MD5Utils; import net.micode.notes.ui.translate_demo.BaiduTranslateService; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class NoteEditActivity<关闭> extends AppCompatActivity implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener { private class HeadViewHolder { public TextView tvModified; public ImageView ivAlertIcon; public TextView tvToptext; 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'); public static final int TAKE_PHOTO = 1; public static final int CHOOSE_PHOTO = 2; private final int PHOTO_SUCCESS = 3; private final int CAMERA_SUCCESS = 4; // TextToSpeech tts; TextView num_word; TextView location; public static final int LOCATION_CODE = 301; private LocationManager locationManager; private String locationProvider = null; private final int PHOTO_REQUEST = 1; private AlertDialog alertDialog2; private CharSequence restore_translate = null; private boolean mIsRvoke = false; private LinearLayout mEditTextList; private String mUserQuery; private Pattern mPattern; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.note_edit); if (savedInstanceState == null && !initActivityState(getIntent())) { finish(); return; } initResources(); final ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_btn); add_img_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "onClick: click add image button"); Intent loadImage = new Intent(Intent.ACTION_GET_CONTENT); loadImage.addCategory(Intent.CATEGORY_OPENABLE); loadImage.setType("image/*"); startActivityForResult(loadImage, PHOTO_REQUEST); } }); } /** * Current activity may be killed when the memory is low. Once it is killed, for another time * user load this activity, we should restore the former state */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); 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(); convertToImage(); showTopHeader(); } 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); } } private void showTopHeader() { mNoteHeaderHolder.tvToptext.setText(R.string.menu_set_top); if (mWorkingNote.getTopId() == 1) { mNoteHeaderHolder.tvToptext.setVisibility(View.VISIBLE); } else { mNoteHeaderHolder.tvToptext.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() { 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.tvToptext = (TextView) findViewById(R.id.tv_set_top); mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); mNoteEditor = (EditText) findViewById(R.id.note_edit_view); mNoteEditor.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) {//文本更改后 if (!mIsRvoke) { saveMyChanged(); } else { mIsRvoke = false; } } }); 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); speech_sum(); local_sel(); translate(); } @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.getTopId() == 1) { menu.findItem(R.id.menu_set_top).setVisible(false); } else if (mWorkingNote.getTopId() == 0) { menu.findItem(R.id.menu_cancel_top).setVisible(false); } 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) { switch (item.getItemId()) { case R.id.menu_new_note: createNewNote(); break; case R.id.menu_revoke: doRevoke(); break; case R.id.menu_set_top: mWorkingNote.setTop((mWorkingNote.getTopId()) == 1 ? "0" : "1"); break; case R.id.menu_cancel_top: mWorkingNote.setTop((mWorkingNote.getTopId()) == 0 ? "1" : "0"); break; case 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(); break; case R.id.menu_font_size: mFontSizeSelector.setVisibility(View.VISIBLE); findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); break; case R.id.menu_list_mode: mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? TextNote.MODE_CHECK_LIST : 0); break; case R.id.menu_share: getWorkingText(); sendTo(this, mWorkingNote.getContent()); break; case R.id.menu_send_to_desktop: sendToDesktop(); break; case R.id.menu_alert: setReminder(); break; case R.id.menu_delete_remind: mWorkingNote.setAlertDate(0, false); break; case R.id.menu_font_select: showSingleAlertDiglog(); break; case R.id.menu_count_word://数字统计 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("带符号字数总和统计为:" + c); builder1.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } });//确定按钮 builder1.setNegativeButton(android.R.string.cancel, null);//取消按钮 builder1.show();//对话框启动 break; default: break; } return true; } 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 onTopChanged(String Top) { /** * User could set clock to an unsaved note, so before setting the * alert clock, we should save the note first */ saveNote(); if (mWorkingNote.getNoteId() > 0) { showTopHeader(); } 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, "Top setting error"); showToast(R.string.error_note_empty_for_top); } } 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(); } private String getLocation() { //1.获取位置管理器 String city = null; locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //2.获取位置提供器,GPS或是NetWork List providers = locationManager.getProviders(true); if (providers.contains(LocationManager.GPS_PROVIDER)) { //如果是GPS locationProvider = LocationManager.GPS_PROVIDER; Log.v("TAG", "定位方式GPS"); } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) { //如果是Network locationProvider = LocationManager.NETWORK_PROVIDER; Log.v("TAG", "定位方式Network"); } else { Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show(); return null; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //获取权限(如果没有开启权限,会弹出对话框,询问是否开启权限) if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE); } else { //3.获取上次的位置,一般第一次运行,此值为null Location location = locationManager.getLastKnownLocation(locationProvider); if (location != null) { Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show(); Log.v("TAG", "获取上次的位置-经纬度:" + location.getLongitude() + " " + location.getLatitude()); city = getAddress(location); } else { //监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener); } } } else { Location location = locationManager.getLastKnownLocation(locationProvider); if (location != null) { Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show(); Log.v("TAG", "获取上次的位置-经纬度:" + location.getLongitude() + " " + location.getLatitude()); city = getAddress(location); } else { //监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace locationManager.requestLocationUpdates(locationProvider, 3000, 1, locationListener); } } return city; } public LocationListener locationListener = new LocationListener() { // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 @Override public void onStatusChanged(String provider, int status, Bundle extras) { } // Provider被enable时触发此函数,比如GPS被打开 @Override public void onProviderEnabled(String provider) { } // Provider被disable时触发此函数,比如GPS被关闭 @Override public void onProviderDisabled(String provider) { } //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 @Override public void onLocationChanged(Location location) { if (location != null) { //如果位置发生变化,重新显示地理位置经纬度 Toast.makeText(NoteEditActivity.this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show(); Log.v("TAG", "监视地理位置变化-经纬度:" + location.getLongitude() + " " + location.getLatitude()); } } }; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case LOCATION_CODE: if (grantResults.length > 0 && grantResults[0] == getPackageManager().PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "申请权限", Toast.LENGTH_LONG).show(); try { List providers = locationManager.getProviders(true); if (providers.contains(LocationManager.NETWORK_PROVIDER)) { //如果是Network locationProvider = LocationManager.NETWORK_PROVIDER; } else if (providers.contains(LocationManager.GPS_PROVIDER)) { //如果是GPS locationProvider = LocationManager.GPS_PROVIDER; } Location location = locationManager.getLastKnownLocation(locationProvider); if (location != null) { Toast.makeText(this, location.getLongitude() + " " + location.getLatitude() + "", Toast.LENGTH_SHORT).show(); Log.v("TAG", "获取上次的位置-经纬度:" + location.getLongitude() + " " + location.getLatitude()); } else { // 监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener); } } catch (SecurityException e) { e.printStackTrace(); } } else { Toast.makeText(this, "缺少权限", Toast.LENGTH_LONG).show(); finish(); } break; } } //获取地址信息:城市、街道等信息 private String getAddress(Location location) { List
result = null; String city = null; try { if (location != null) { Geocoder gc = new Geocoder(this, Locale.getDefault()); result = gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1); city = result.get(0).getAddressLine(0).toString(); Toast.makeText(this, "获取地址信息:" + city, Toast.LENGTH_LONG).show(); Log.v("TAG", "获取地址信息:" + city); } } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, city); return city; } private void local_sel() { final Button get_local = findViewById(R.id.location); get_local.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { Button local1 = new Button(NoteEditActivity.this); final Button local2 = new Button(NoteEditActivity.this); local1.setText("获取地理信息"); local2.setText("清除地理信息"); LinearLayout linear = new LinearLayout(NoteEditActivity.this); linear.setOrientation(LinearLayout.VERTICAL); linear.addView(local1); linear.addView(local2); AlertDialog.Builder builder = new AlertDialog.Builder(NoteEditActivity.this); builder.setView(linear); builder.setTitle("请选择功能"); AlertDialog choose_local = builder.create(); choose_local.show(); local1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(NoteEditActivity.this, "获取地理信息", Toast.LENGTH_SHORT).show(); String city = null; city = getLocation(); if (city == null) { get_local.setText("点击获得地理信息"); } else { get_local.setText(city); } } }); local2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(NoteEditActivity.this, "清除地理信息", Toast.LENGTH_SHORT).show(); get_local.setText("点击获得地理信息"); } }); } // builder.setTitle("choose"); // AlertDialog choose_local = builder.create(); // choose_local.show(); }); } public void speech_sum() { EditText editable = findViewById(R.id.note_edit_view); //Toast.makeText(NoteEditActivity.this, editable.getText().toString(), Toast.LENGTH_SHORT).show(); final Button speak = findViewById(R.id.iatBtn); final int[] tmp = new int[1]; final TextToSpeech[] tts = new TextToSpeech[1]; tts[0] = new TextToSpeech(NoteEditActivity.this, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { tts[0].setLanguage(Locale.US); } }); editable.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { tmp[0] = cutOfimage(operateText(s.toString())).length(); TextView number_word = findViewById(R.id.num_word); number_word.setText("字符数:" + tmp[0]); final String temp = cutOfimage(s.toString()); speak.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { tts[0].speak(temp.toString(), TextToSpeech.QUEUE_FLUSH, null); } }); } @Override public void afterTextChanged(Editable s) { } }); } public String operateText(String str) { String dest = ""; Pattern p = Pattern.compile("\\s*|t|r|n"); Matcher m = p.matcher(str); dest = m.replaceAll(""); return dest; } public String cutOfimage(String str) { String dest = str; int index1 = dest.indexOf("[local]"); int index2 = dest.indexOf("[/local]"); while (index1 != -1 && index2 != -1) { dest = dest.substring(0, index1) + dest.substring(index2 + 8); index1 = dest.indexOf("[local]"); index2 = dest.indexOf("[/local]"); } return dest; } 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(); } if (bitmap != null) { Log.d(TAG, "图片不为null"); 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); } } } } } @RequiresApi(api = Build.VERSION_CODES.KITKAT) 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; } } @RequiresApi(api = Build.VERSION_CODES.KITKAT) 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; } public String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } public boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } public void showSingleAlertDiglog() { 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(), "font/simfang.ttf"); mNoteEditor.setTypeface(typeface0); break; case 5: Typeface typeface1 = Typeface.createFromAsset(getAssets(), "font/simhei.ttf"); mNoteEditor.setTypeface(typeface1); break; case 6: Typeface typeface2 = Typeface.createFromAsset(getAssets(), "font/simkai.ttf"); mNoteEditor.setTypeface(typeface2); break; case 7: Typeface typeface3 = Typeface.createFromAsset(getAssets(), "font/FZYTK.TTF"); mNoteEditor.setTypeface(typeface3); break; case 8: Typeface typeface4 = Typeface.createFromAsset(getAssets(), "font/STLITI.TTF"); mNoteEditor.setTypeface(typeface4); break; case 9: Typeface typeface5 = Typeface.createFromAsset(getAssets(), "font/STXINGKA.TTF"); mNoteEditor.setTypeface(typeface5); break; case 10: Typeface typeface6 = Typeface.createFromAsset(getAssets(), "font/STXINWEI.TTF"); mNoteEditor.setTypeface(typeface6); break; case 11: Typeface typeface7 = Typeface.createFromAsset(getAssets(), "font/STZHONGS.TTF"); mNoteEditor.setTypeface(typeface7); break; } Toast.makeText(NoteEditActivity.this, items[i], Toast.LENGTH_SHORT).show(); } }); alertBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { alertDialog2.dismiss(); } }); alertBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { alertDialog2.dismiss(); } }); alertDialog2 = alertBuilder.create(); alertDialog2.show(); } public void translate() { final EditText editable = findViewById(R.id.note_edit_view); final Button get_local = findViewById(R.id.translate); get_local.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { Button trans1 = new Button(NoteEditActivity.this); Button trans2 = new Button(NoteEditActivity.this); Button trans3 = new Button(NoteEditActivity.this); trans1.setText("中文翻译为英文"); trans2.setText("英文翻译为中文"); trans3.setText("还原"); LinearLayout linear = new LinearLayout(NoteEditActivity.this); linear.setOrientation(LinearLayout.VERTICAL); linear.addView(trans1); linear.addView(trans2); linear.addView(trans3); AlertDialog.Builder builder = new AlertDialog.Builder(NoteEditActivity.this); builder.setView(linear); builder.setTitle("请选择翻译模式"); AlertDialog choose_trans = builder.create(); choose_trans.show(); trans1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { restore_translate = editable.getText(); translate_z2u(); Toast.makeText(NoteEditActivity.this, "中文翻译为英文", Toast.LENGTH_SHORT).show(); } }); trans2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { restore_translate = editable.getText(); translate_u2z(); Toast.makeText(NoteEditActivity.this, "英文翻译为中文", Toast.LENGTH_SHORT).show(); } }); trans3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (restore_translate == null || restore_translate.toString().equals(editable.getText().toString())) { Toast.makeText(NoteEditActivity.this, "无可还原内容", Toast.LENGTH_SHORT).show(); } else { editable.setText(restore_translate); Toast.makeText(NoteEditActivity.this, "已还原", Toast.LENGTH_SHORT).show(); } } }); } }); } public void translate_z2u() { final EditText editable = findViewById(R.id.note_edit_view); String word = editable.getText().toString(); word = word.replaceAll("\\n", "//"); String from = "auto"; String to = "en"; String appid = "20221021001406789"; String salt = (int) (Math.random() * 100 + 1) + ""; String key = "eWky8SSKgL99Dh4rHMog"; String secretKey = appid + word + salt + key; String sign = MD5Utils.getMD5Code(secretKey); Log.d(TAG, "secretKey:" + secretKey); Log.d(TAG, "sign: " + sign); Retrofit retrofitBaidu = new Retrofit.Builder() .baseUrl("https://fanyi-api.baidu.com/api/trans/vip/") .addConverterFactory(GsonConverterFactory.create()) .build(); BaiduTranslateService baiduTranslateService = retrofitBaidu.create(BaiduTranslateService.class); retrofit2.Call call = baiduTranslateService.translate(word, from, to, appid, salt, sign); call.enqueue(new Callback() { @Override public void onResponse(retrofit2.Call call, Response response) { Log.d(TAG, "onResponse: 请求成功"); RespondBean respondBean = response.body(); String result = respondBean.getTrans_result().get(0).getDst(); editable.setText(result); Log.d(TAG, "中译英结果" + result); } @Override public void onFailure(retrofit2.Call call, Throwable t) { Log.d(TAG, "onResponse: 请求失败 " + t); } }); } public void translate_u2z() { final EditText editable = findViewById(R.id.note_edit_view); String word = editable.getText().toString(); word = word.replaceAll("\\n", "//"); Log.d(TAG, word); String from = "auto"; String to = "zh"; String appid = "20221021001406789"; String salt = (int) (Math.random() * 100 + 1) + ""; String key = "eWky8SSKgL99Dh4rHMog"; String secretKey = appid + word + salt + key; String sign = MD5Utils.getMD5Code(secretKey); Log.d(TAG, "secretKey:" + secretKey); Log.d(TAG, "sign: " + sign); Retrofit retrofitBaidu = new Retrofit.Builder() .baseUrl("https://fanyi-api.baidu.com/api/trans/vip/") .addConverterFactory(GsonConverterFactory.create()) .build(); BaiduTranslateService baiduTranslateService = retrofitBaidu.create(BaiduTranslateService.class); retrofit2.Call call = baiduTranslateService.translate(word, from, to, appid, salt, sign); call.enqueue(new Callback() { @Override public void onResponse(retrofit2.Call call, Response response) { Log.d(TAG, "onResponse: 请求成功"); RespondBean respondBean = response.body(); String result = respondBean.getTrans_result().get(0).getDst(); editable.setText(result); Log.d(TAG, "中译英结果" + result); } @Override public void onFailure(retrofit2.Call call, Throwable t) { Log.d(TAG, "onResponse: 请求失败 " + t); } }); } private static final int MAX_TIME_OF_RVOKE_TIME = 100; private int MAX_OF_RVOKE_TIME = 100; private Vector mChanged = new Vector(MAX_OF_RVOKE_TIME); private void saveMyChanged() { SpannableString text = new SpannableString(mNoteEditor.getText());//用getText方法获取每次编辑的内容 if (mChanged.size() >= MAX_TIME_OF_RVOKE_TIME) {//如果栈中的数据大于最大撤销次数,就把第一次修改的内容删除 mChanged.removeElementAt(0); } mChanged.add(text);//然后把本次修改的内容加入栈中 } private void doRevoke() { int size = mChanged.size();//获取当前栈大小 AlertDialog.Builder dialog = new AlertDialog.Builder(this);//创建一个alertdialog窗口 dialog.setTitle(R.string.tips_of_revoke);//设置title信息 dialog.setCancelable(true);//设置为可取消 dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {//只需要设置一个OK键即可 @Override public void onClick(DialogInterface dialog, int which) { } }); mIsRvoke = true;//把是否已执行撤销的标记设置为true if (size <= 1) {//如果栈中元素过少,打印提示信息 dialog.setMessage(R.string.have_not_input_anything);//提示用户您还没有输入任何信息 dialog.show();//显示当前alertdialog return; } else { mNoteEditor.setText((CharSequence) mChanged.elementAt(size - 2));//在textview中设置撤销的内容 mNoteEditor.setSelection(mNoteEditor.length()); mChanged.removeElementAt(size - 1);//删除元素 if (size == 2) { dialog.setMessage(R.string.can_not_revoke);//如果只有一次操作,那么提示用户不能再撤销了 dialog.show();//显示当前alertdialog } } } }