更新了功能

master
JLY 2 months ago
parent a9cc5f93ef
commit 40cf91cf9e

@ -89,7 +89,9 @@ public class NotesProvider extends ContentProvider {
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
Cursor c = null;
SQLiteDatabase db = mHelper.getReadableDatabase();
SQLiteDatabase db = null;
try {
db = mHelper.getReadableDatabase();
String id = null;
switch (mMatcher.match(uri)) {
case URI_NOTE:
@ -144,13 +146,22 @@ public class NotesProvider extends ContentProvider {
if (c != null) {
c.setNotificationUri(getContext().getContentResolver(), uri);
}
} catch (Exception e) {
Log.e(TAG, "Error querying database: " + e.getMessage());
if (c != null) {
c.close();
}
return null;
}
return c;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mHelper.getWritableDatabase();
SQLiteDatabase db = null;
long dataId = 0, noteId = 0, insertedId = 0;
try {
db = mHelper.getWritableDatabase();
switch (mMatcher.match(uri)) {
case URI_NOTE:
insertedId = noteId = db.insert(TABLE.NOTE, null, values);
@ -177,7 +188,10 @@ public class NotesProvider extends ContentProvider {
getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);
}
} catch (Exception e) {
Log.e(TAG, "Error inserting into database: " + e.getMessage());
return null;
}
return ContentUris.withAppendedId(uri, insertedId);
}

@ -53,7 +53,7 @@ public class AlarmInitReceiver extends BroadcastReceiver {
long alertDate = c.getLong(COLUMN_ALERTED_DATE);
Intent sender = new Intent(context, AlarmReceiver.class);
sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID)));
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, PendingIntent.FLAG_IMMUTABLE);
AlarmManager alermManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent);

@ -27,6 +27,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.preference.PreferenceManager;
@ -51,6 +52,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ImageButton;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
@ -128,7 +130,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private View mFontSizeSelector;
private EditText mNoteEditor;
private NoteEditText mNoteEditor;
private View mNoteEditorPanel;
@ -149,6 +151,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private String mUserQuery;
private Pattern mPattern;
private ImageButton mBoldButton;
private ImageButton mItalicButton;
private ImageButton mTextColorButton;
private static final int[] COLORS = {
Color.BLACK, Color.RED, Color.GREEN, Color.BLUE,
Color.YELLOW, Color.CYAN, Color.MAGENTA, Color.GRAY
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -371,7 +381,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
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);
mNoteEditor = (NoteEditText) 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()) {
@ -395,6 +405,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;
}
mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
mBoldButton = (ImageButton) findViewById(R.id.btn_bold);
mItalicButton = (ImageButton) findViewById(R.id.btn_italic);
mTextColorButton = (ImageButton) findViewById(R.id.btn_text_color);
mBoldButton.setOnClickListener(this);
mItalicButton.setOnClickListener(this);
mTextColorButton.setOnClickListener(this);
}
@Override
@ -425,12 +443,19 @@ public class NoteEditActivity extends Activity implements OnClickListener,
setResult(RESULT_OK, intent);
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_set_bg_color) {
if (id == R.id.btn_bold) {
mNoteEditor.setBold(!mNoteEditor.isBold());
} else if (id == R.id.btn_italic) {
mNoteEditor.setItalic(!mNoteEditor.isItalic());
} else if (id == R.id.btn_text_color) {
showColorPickerDialog();
} else if (id == R.id.btn_set_bg_color) {
mNoteBgColorSelector.setVisibility(View.VISIBLE);
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
- View.VISIBLE);
View.VISIBLE);
} else if (sBgSelectorBtnsMap.containsKey(id)) {
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.GONE);
@ -623,7 +648,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
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);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE));
showAlertHeader();
if(!set) {
@ -870,4 +895,30 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private void showToast(int resId, int duration) {
Toast.makeText(this, resId, duration).show();
}
private void showColorPickerDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.format_text_color);
final View colorView = getLayoutInflater().inflate(R.layout.color_picker, null);
builder.setView(colorView);
final AlertDialog dialog = builder.create();
dialog.show();
for (int i = 0; i < COLORS.length; i++) {
final int color = COLORS[i];
View colorButton = colorView.findViewWithTag("color_" + i);
if (colorButton != null) {
colorButton.setBackgroundColor(color);
colorButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mNoteEditor.setTextColor(color);
dialog.dismiss();
}
});
}
}
}
}

@ -23,6 +23,9 @@ import android.text.Selection;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.URLSpan;
import android.text.style.StyleSpan;
import android.text.style.ForegroundColorSpan;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ContextMenu;
@ -31,6 +34,8 @@ import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
import android.widget.EditText;
import android.text.Spannable;
import android.text.SpannableString;
import net.micode.notes.R;
@ -214,4 +219,85 @@ public class NoteEditText extends EditText {
}
super.onCreateContextMenu(menu);
}
public void setBold(boolean bold) {
int start = getSelectionStart();
int end = getSelectionEnd();
if (start < end) {
SpannableString spannableString = new SpannableString(getText());
if (bold) {
spannableString.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
StyleSpan[] spans = spannableString.getSpans(start, end, StyleSpan.class);
for (StyleSpan span : spans) {
if (span.getStyle() == android.graphics.Typeface.BOLD) {
spannableString.removeSpan(span);
}
}
}
setText(spannableString);
setSelection(start, end);
}
}
public void setItalic(boolean italic) {
int start = getSelectionStart();
int end = getSelectionEnd();
if (start < end) {
SpannableString spannableString = new SpannableString(getText());
if (italic) {
spannableString.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
StyleSpan[] spans = spannableString.getSpans(start, end, StyleSpan.class);
for (StyleSpan span : spans) {
if (span.getStyle() == android.graphics.Typeface.ITALIC) {
spannableString.removeSpan(span);
}
}
}
setText(spannableString);
setSelection(start, end);
}
}
public void setTextColor(int color) {
int start = getSelectionStart();
int end = getSelectionEnd();
if (start < end) {
SpannableString spannableString = new SpannableString(getText());
spannableString.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setText(spannableString);
setSelection(start, end);
}
}
public boolean isBold() {
int start = getSelectionStart();
int end = getSelectionEnd();
if (start < end) {
SpannableString spannableString = new SpannableString(getText());
StyleSpan[] spans = spannableString.getSpans(start, end, StyleSpan.class);
for (StyleSpan span : spans) {
if (span.getStyle() == android.graphics.Typeface.BOLD) {
return true;
}
}
}
return false;
}
public boolean isItalic() {
int start = getSelectionStart();
int end = getSelectionEnd();
if (start < end) {
SpannableString spannableString = new SpannableString(getText());
StyleSpan[] spans = spannableString.getSpans(start, end, StyleSpan.class);
for (StyleSpan span : spans) {
if (span.getStyle() == android.graphics.Typeface.ITALIC) {
return true;
}
}
}
return false;
}
}

@ -141,10 +141,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
setContentView(R.layout.note_list);
initResources();
/**
* Insert an introduction when user firstly use this application
*/
try {
setAppInfoFromRawRes();
} catch (Exception e) {
Log.e(TAG, "Failed to set app info: " + e.getMessage());
// Continue without introduction note
}
}
@Override
@ -177,28 +179,34 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return;
}
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Failed to read introduction: " + e.getMessage());
return;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e(TAG, "Failed to close introduction stream: " + e.getMessage());
}
}
}
try {
WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER,
AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE,
ResourceParser.RED);
if (note != null) {
note.setWorkingText(sb.toString());
if (note.saveNote()) {
sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit();
} else {
Log.e(TAG, "Save introduction note error");
return;
}
} else {
Log.e(TAG, "Failed to create empty note");
}
} catch (Exception e) {
Log.e(TAG, "Failed to create introduction note: " + e.getMessage());
}
}
}
@ -206,7 +214,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
protected void onStart() {
super.onStart();
try {
startAsyncNotesListQuery();
} catch (Exception e) {
Log.e(TAG, "Failed to start notes query: " + e.getMessage());
Toast.makeText(this, R.string.error_loading_notes, Toast.LENGTH_SHORT).show();
}
}
private void initResources() {
@ -409,12 +422,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
};
private void startAsyncNotesListQuery() {
try {
String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION
: NORMAL_SELECTION;
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] {
String.valueOf(mCurrentFolderId)
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
} catch (Exception e) {
Log.e(TAG, "Failed to start notes query: " + e.getMessage());
Toast.makeText(this, R.string.error_loading_notes, Toast.LENGTH_SHORT).show();
}
}
private final class BackgroundQueryHandler extends AsyncQueryHandler {
@ -424,20 +442,31 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
try {
switch (token) {
case FOLDER_NOTE_LIST_QUERY_TOKEN:
if (cursor != null) {
mNotesListAdapter.changeCursor(cursor);
} else {
Log.e(TAG, "Query notes failed: cursor is null");
Toast.makeText(NotesListActivity.this, R.string.error_loading_notes, Toast.LENGTH_SHORT).show();
}
break;
case FOLDER_LIST_QUERY_TOKEN:
if (cursor != null && cursor.getCount() > 0) {
showFolderListMenu(cursor);
} else {
Log.e(TAG, "Query folder failed");
Toast.makeText(NotesListActivity.this, R.string.error_loading_folders, Toast.LENGTH_SHORT).show();
}
break;
default:
return;
}
} catch (Exception e) {
Log.e(TAG, "Error in query complete: " + e.getMessage());
Toast.makeText(NotesListActivity.this, R.string.error_loading_notes, Toast.LENGTH_SHORT).show();
}
}
}

@ -111,11 +111,11 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider {
rv.setTextViewText(R.id.widget_text,
context.getString(R.string.widget_under_visit_mode));
pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent(
context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
context, NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE);
} else {
rv.setTextViewText(R.id.widget_text, snippet);
pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.FLAG_IMMUTABLE);
}
rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent);

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:pathData="M6,4h8c2.21,0 4,1.79 4,4s-1.79,4 -4,4H6V4zM6,12h9c2.21,0 4,1.79 4,4s-1.79,4 -4,4H6V12z"/>
</vector>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:pathData="M2,20h20v4H2v-4zM5.49,17h2.42l1.27,-3.58h5.65L16.09,17h2.42L13.25,3h-2.5L5.49,17zM9.91,11.39l2.03,-5.79h0.12l2.03,5.79H9.91z"/>
</vector>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:pathData="M10,4v3h2.21l-3.42,8H6v3h8v-3h-2.21l3.42,-8H18V4z"/>
</vector>

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<GridLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:columnCount="4"
android:rowCount="2">
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/black"
android:tag="color_0" />
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/holo_red_dark"
android:tag="color_1" />
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/holo_green_dark"
android:tag="color_2" />
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/holo_blue_dark"
android:tag="color_3" />
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/holo_orange_light"
android:tag="color_4" />
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/holo_purple"
android:tag="color_5" />
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/holo_blue_light"
android:tag="color_6" />
<View
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="4dp"
android:background="@android:color/darker_gray"
android:tag="color_7" />
</GridLayout>
</LinearLayout>

@ -63,6 +63,39 @@
android:background="@drawable/bg_btn_set_color" />
</LinearLayout>
<LinearLayout
android:id="@+id/formatting_toolbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp"
android:background="#F5F5F5">
<ImageButton
android:id="@+id/btn_bold"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_format_bold"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/format_bold" />
<ImageButton
android:id="@+id/btn_italic"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_format_italic"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/format_italic" />
<ImageButton
android:id="@+id/btn_text_color"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_format_color_text"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/format_text_color" />
</LinearLayout>
<LinearLayout
android:id="@+id/sv_note_edit"
android:layout_width="fill_parent"

@ -132,4 +132,12 @@
<item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> results for \"<xliff:g id="search" example="???">%2$s</xliff:g>\"</item>
</plurals>
<string name="format_bold">Bold</string>
<string name="format_italic">Italic</string>
<string name="format_text_color">Text Color</string>
<!-- Error messages -->
<string name="error_loading_notes">Failed to load notes</string>
<string name="error_loading_folders">Failed to load folders</string>
</resources>

Loading…
Cancel
Save