Compare commits

..

36 Commits

Author SHA1 Message Date
Dingzijian 436492524d Merge branch 'master' of https://bdgit.educoder.net/pz4kybsvg/mi_maintenance
3 years ago
Dingzijian 3c9ea38321 更新
3 years ago
pz4kybsvg f73669b67f Merge pull request '更新' (#12) from dingzijian_branch into master
3 years ago
Dingzijian 97b44d4c18 更新
3 years ago
Dingzijian 1b70eaf491 1
3 years ago
Dingzijian e3a505ffb9 1
3 years ago
Dingzijian 5415bb363b Merge branch 'master' into dingzijian_branch
3 years ago
pz4kybsvg 0b1576ba66 Update README.md
3 years ago
Dingzijian 60b8253be9 更新
3 years ago
Dingzijian 02dad9d08f 更新
3 years ago
Dingzijian 737e8b0a97 更新
3 years ago
Dingzijian 8f5e3848fe 更新
3 years ago
p95lsv6nx 84b05ec823 Update README.md
3 years ago
p95lsv6nx e606a7f396 Merge pull request '更新到master' (#11) from develop into master
3 years ago
p95lsv6nx c094612243 Merge pull request '更新' (#10) from hongyang_branch into develop
3 years ago
hongyang 84603398db 更新
3 years ago
pz4kybsvg db7681cc0f Update README.md
3 years ago
pz4kybsvg 9162659535 Update README.md
3 years ago
pz4kybsvg 67da182a49 Merge pull request '合并显示字数、修改字体的功能到master' (#9) from develop into master
3 years ago
pz4kybsvg 9b2cfa5299 Merge pull request '合并显示字数、修改字体的功能' (#8) from dingzijian_branch into develop
3 years ago
Dingzijian b673ef2b6b 合并显示字数、修改字体的功能
3 years ago
Dingzijian 7b751cbcb0 添加注释
3 years ago
pz4kybsvg 2278fa1499 Merge pull request '个性化背景,朗读,欢迎界面' (#6) from develop into master
3 years ago
pz4kybsvg 2151ed998f Merge pull request '三种功能的Release版本' (#5) from dingzijian_branch into develop
3 years ago
Dingzijian 92579b6b2c 三种功能的Release版本
3 years ago
pz4kybsvg a995accef7 Merge pull request '修了一个bug' (#4) from dingzijian_branch into develop
3 years ago
Dingzijian 338ed8affc 修了一个bug
3 years ago
pz4kybsvg fc0aeab379 Merge pull request '修复第一次个性化主界面会延迟显示图片的bug' (#3) from dingzijian_branch into develop
3 years ago
Dingzijian 5f1eb416ab 修复第一次个性化主界面会延迟显示图片的bug
3 years ago
pz4kybsvg ecd4626d61 Merge pull request '增加个性化背景功能(可自主选择图片)' (#2) from dingzijian_branch into develop
3 years ago
Dingzijian 8f87ae54e0 增加个性化背景,朗读,欢迎界面的功能
3 years ago
pz4kybsvg 2956b56ee4 Merge pull request '增加功能' (#1) from dingzijian_branch into develop
3 years ago
Dingzijian 6e70afeb19 更新代码
3 years ago
Dingzijian cdbea3f485 更新
3 years ago
Dingzijian b91e253af6 1
3 years ago
pz4kybsvg bfb795fe14 Update README.md
3 years ago

@ -1,2 +1 @@
# project_maintenance
# 小米便签项目维护

@ -1,26 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="net.micode.notes"
android:versionCode="1"
android:versionName="0.1" >
android:versionName="0.1">
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
@ -31,47 +16,57 @@
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:icon="@drawable/icon_app"
android:label="@string/app_name" >
android:label="@string/app_name"
android:requestLegacyExternalStorage="true">
<activity
android:name=".ui.NotesListActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:name=".ui.WelcomeActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustPan" >
android:theme="@style/Theme.Notesmaster.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.NotesListActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustPan">
</activity>
<activity
android:name=".ui.NoteEditActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/NoteTheme" >
<intent-filter>
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
<intent-filter android:scheme="http"
tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT_OR_EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
@ -87,7 +82,7 @@
<receiver
android:name=".widget.NoteWidgetProvider_2x"
android:label="@string/app_widget2x2" >
android:label="@string/app_widget2x2">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
@ -100,8 +95,7 @@
</receiver>
<receiver
android:name=".widget.NoteWidgetProvider_4x"
android:label="@string/app_widget4x4" >
android:label="@string/app_widget4x4">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
@ -112,39 +106,43 @@
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
</receiver>
<receiver android:name=".ui.AlarmInitReceiver" >
<receiver android:name=".ui.AlarmInitReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name="net.micode.notes.ui.AlarmReceiver"
android:process=":remote" >
</receiver>
android:name=".ui.AlarmReceiver"
android:process=":remote"></receiver>
<activity
android:name=".ui.AlarmAlertActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
</activity>
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar"></activity>
<activity
android:name="net.micode.notes.ui.NotesPreferenceActivity"
android:name=".ui.NotesPreferenceActivity"
android:label="@string/preferences_title"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Holo.Light" >
</activity>
android:theme="@android:style/Theme.Holo.Light"></activity>
<service
android:name="net.micode.notes.gtask.remote.GTaskSyncService"
android:exported="false" >
</service>
android:exported="false"></service>
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.NoteEditActivity" />
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
<activity
android:name=".ui.UCropPictureActivity"
android:label="@string/preferences_title"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"></activity>
</application>
</manifest>
</manifest>

@ -46,7 +46,7 @@ public class Contact {
}
String selection = CALLER_ID_SELECTION.replace("+",
PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); //https://developer.android.google.cn/reference/android/telephony/PhoneNumberUtils#public-methods
Cursor cursor = context.getContentResolver().query(
Data.CONTENT_URI,
new String [] { Phone.DISPLAY_NAME },

@ -78,8 +78,8 @@ public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
NotesListActivity.class), 0);
}
/**notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
pendingIntent);
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);**/
pendingIntent);**/
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
}
@Override

@ -16,6 +16,8 @@
package net.micode.notes.ui;
import static net.micode.notes.R.drawable.list_background;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
@ -27,13 +29,19 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.preference.PreferenceManager;
//import android.support.v7.app.AppCompatActivity;
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.util.Log;
@ -52,6 +60,12 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
//维护_丁梓坚_朗读
//import android.support.v7.app.AppCompatActivity;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import androidx.appcompat.app.AppCompatActivity;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
@ -66,14 +80,17 @@ import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
import net.micode.notes.widget.NoteWidgetProvider_2x;
import net.micode.notes.widget.NoteWidgetProvider_4x;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
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,
public class NoteEditActivity extends AppCompatActivity implements OnClickListener,
NoteSettingChangedListener, OnTextViewChangeListener {
private class HeadViewHolder {
public TextView tvModified;
@ -119,10 +136,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select);
}
private AlertDialog alertDialog2;
private static final String TAG = "NoteEditActivity";
private HeadViewHolder mNoteHeaderHolder;
@ -154,6 +167,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private String mUserQuery;
private Pattern mPattern;
//维护_丁梓坚_朗读
private TextToSpeech mNoteRead;
//维护_王京
CharSequence tmp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -163,9 +182,9 @@ public class NoteEditActivity extends Activity implements OnClickListener,
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
@ -400,8 +419,76 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;
}
mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
//维护_丁梓坚_朗读
mNoteRead = new TextToSpeech(this, new OnInitListener()
{
@Override
public void onInit(int status) {
if(status==TextToSpeech.SUCCESS){
int result=mNoteRead.setLanguage(Locale.US);
//(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
// Toast.makeText(NoteEditActivity.this,"Language not available", Toast.LENGTH_LONG);
//else
//mNoteRead.setLanguage(Locale.US);
if(result!=TextToSpeech.LANG_COUNTRY_AVAILABLE
&& result!=TextToSpeech.LANG_AVAILABLE){
}
}
}
}
);
//维护_王京
EditText e = findViewById(R.id.note_edit_view);
//CharSequence tmp;
e.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
tmp = charSequence;
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
//NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view); //获取当前的edit
//Editable edit = noteEditText.getText();//1.获取text
String s = editable.toString(); //2.将note内容转换为字符串
int len = editable.length(); //内容的长度
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
Log.i(TAG, s);
String img_fragment = s.substring(i, j + 1); //img_fragment关于图片路径的片段
if (img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")) {
String b = s.substring(0, i);
String c = s.substring(j + 1, len);
s = b + c;
len = len + i - j - 1;
}
}
/* (int k = 0; k < len; k++) {
for (int j = k; j < len; j++) {
String img_fragment = s.substring(k, j + 1); //img_fragment关于图片路径的片段
if (img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")) {
String b = s.substring(0,k);
String c = s.substring(j+1,len);
s = b + c;
len = len + k - j - 16;
}
}
}*/
}
TextView length = findViewById(R.id.length);
length.setText("字符数:" + operateText(s).length());
}
});
}
@Override
protected void onPause() {
super.onPause();
@ -435,7 +522,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
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);
@ -552,6 +639,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
case R.id.menu_delete_remind:
mWorkingNote.setAlertDate(0, false);
break;
//维护_丁梓坚_朗读
case R.id.menu_read:
noteRead();
break;
//维护_刘彦辰
case R.id.menu_font_select:
showSingleAlertDiglog();
break;
@ -561,6 +653,77 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return true;
}
//维护_刘彦辰
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();
alertDialog2.dismiss();
}
});
alertDialog2 = alertBuilder.create();
alertDialog2.show();
}
//维护_刘彦辰
private AlertDialog alertDialog2;
//维护_丁梓坚_朗读
private void noteRead(){
mNoteRead.speak(mNoteEditor.getText().toString(),TextToSpeech.QUEUE_FLUSH,null);
}
private void setReminder() {
DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis());
d.setOnDateTimeSetListener(new OnDateTimeSetListener() {
@ -879,84 +1042,33 @@ public class NoteEditActivity extends Activity implements OnClickListener,
Toast.makeText(this, resId, duration).show();
}
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;
//维护_王京
public void xianshi() {
NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view); //获取当前的edit
Editable editable = noteEditText.getText();//1.获取text
String s = editable.toString(); //2.将note内容转换为字符串
int len = editable.length(); //内容的长度
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
String img_fragment = s.substring(i, j + 1);
if (img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")) {
String b = s.substring(0, i);
String c = s.substring(j + 1, len);
s = b + c;
//Log.i(TAG, s);
len = len + i - j - 1;
}
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();
}
TextView length = findViewById(R.id.length);
length.setText("字符数:" + s.length());
}
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;
}
}

@ -16,6 +16,9 @@
package net.micode.notes.ui;
import static net.micode.notes.R.*;
import static net.micode.notes.R.drawable.*;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@ -27,11 +30,19 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Typeface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@ -50,16 +61,21 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
//import android.support.v7.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatActivity;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
@ -74,17 +90,20 @@ import net.micode.notes.widget.NoteWidgetProvider_2x;
import net.micode.notes.widget.NoteWidgetProvider_4x;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.HashSet;
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
private int mode = 1;
/*
*/
public class NotesListActivity extends AppCompatActivity implements OnClickListener, OnItemLongClickListener {
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
private static final int FOLDER_LIST_QUERY_TOKEN = 1;
@ -97,6 +116,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction";
private enum ListEditState {
NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER
};
@ -141,11 +161,35 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private final static int REQUEST_CODE_OPEN_NODE = 102;
private final static int REQUEST_CODE_NEW_NODE = 103;
//维护_丁梓坚_个性化背景_刷新界面
@Override
public Window getWindow() {
return super.getWindow();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_list);
getWindow().setBackgroundDrawableResource(R.drawable.grassland);
setContentView(layout.note_list);
//维护_丁梓坚_个性化背景_初始化操作
SharedPreferences sharedPreferences=getSharedPreferences("data1", Context.MODE_WORLD_READABLE);
//需要先创建图片资源文件SampleCropImage.jpeg用于存放个性背景图片
if(!sharedPreferences.contains("DEFAULT"))
{
Drawable drawable= getResources().getDrawable(list_background);
BitmapDrawable bd = (BitmapDrawable) drawable;
Bitmap b = bd.getBitmap();
File path = new File(getCacheDir() + "/SampleCropImage.jpeg");
try {
OutputStream os = new FileOutputStream(path);
b.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();
} catch (Exception ignored) {
}
}
initResources();
/**
@ -154,6 +198,31 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
setAppInfoFromRawRes();
}
//维护_丁梓坚_个性化背景_刷新界面
@Override
protected void onResume() {
super.onResume();
SharedPreferences sharedPreferences=getSharedPreferences("data1", Context.MODE_WORLD_READABLE);
//根据DEFAULT的值来判断是否加载个性背景
if(sharedPreferences.contains("DEFAULT")){
//默认背景
if(sharedPreferences.getInt("DEFAULT",0)==1)
getWindow().setBackgroundDrawableResource(R.drawable.list_background);
//个性背景
else{
Bitmap bitmap = BitmapFactory.decodeFile(getCacheDir() + "/SampleCropImage.jpeg");
Drawable drawable =new BitmapDrawable(bitmap);
getWindow().setBackgroundDrawable(drawable);
//Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
}
}
else
getWindow().setBackgroundDrawableResource(R.drawable.list_background);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK
@ -170,7 +239,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
StringBuilder sb = new StringBuilder();
InputStream in = null;
try {
in = getResources().openRawResource(R.raw.introduction);
in = getResources().openRawResource(raw.introduction);
if (in != null) {
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
@ -220,20 +289,20 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mContentResolver = this.getContentResolver();
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
mCurrentFolderId = Notes.ID_ROOT_FOLDER;
mNotesListView = (ListView) findViewById(R.id.notes_list);
mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null),
mNotesListView = (ListView) findViewById(id.notes_list);
mNotesListView.addFooterView(LayoutInflater.from(this).inflate(layout.note_list_footer, null),
null, false);
mNotesListView.setOnItemClickListener(new OnListItemClickListener());
mNotesListView.setOnItemLongClickListener(this);
mNotesListAdapter = new NotesListAdapter(this);
mNotesListView.setAdapter(mNotesListAdapter);
mAddNewNote = (Button) findViewById(R.id.btn_new_note);
mAddNewNote = (Button) findViewById(id.btn_new_note);
mAddNewNote.setOnClickListener(this);
mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener());
mDispatch = false;
mDispatchY = 0;
mOriginY = 0;
mTitleBar = (TextView) findViewById(R.id.tv_title_bar);
mTitleBar = (TextView) findViewById(id.tv_title_bar);
mState = ListEditState.NOTE_LIST;
mModeCallBack = new ModeCallback();
}
@ -245,8 +314,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
getMenuInflater().inflate(R.menu.note_list_options, menu);
menu.findItem(R.id.delete).setOnMenuItemClickListener(this);
mMoveMenu = menu.findItem(R.id.move);
menu.findItem(id.delete).setOnMenuItemClickListener(this);
mMoveMenu = menu.findItem(id.move);
if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER
|| DataUtils.getUserFolderCount(mContentResolver) == 0) {
mMoveMenu.setVisible(false);
@ -260,10 +329,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mAddNewNote.setVisibility(View.GONE);
View customView = LayoutInflater.from(NotesListActivity.this).inflate(
R.layout.note_list_dropdown_menu, null);
layout.note_list_dropdown_menu, null);
mode.setCustomView(customView);
mDropDownMenu = new DropdownMenu(NotesListActivity.this,
(Button) customView.findViewById(R.id.selection_menu),
(Button) customView.findViewById(id.selection_menu),
R.menu.note_list_dropdown);
mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
public boolean onMenuItemClick(MenuItem item) {
@ -279,16 +348,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void updateMenu() {
int selectedCount = mNotesListAdapter.getSelectedCount();
// Update dropdown menu
String format = getResources().getString(R.string.menu_select_title, selectedCount);
String format = getResources().getString(string.menu_select_title, selectedCount);
mDropDownMenu.setTitle(format);
MenuItem item = mDropDownMenu.findItem(R.id.action_select_all);
MenuItem item = mDropDownMenu.findItem(id.action_select_all);
if (item != null) {
if (mNotesListAdapter.isAllSelected()) {
item.setChecked(true);
item.setTitle(R.string.menu_deselect_all);
item.setTitle(string.menu_deselect_all);
} else {
item.setChecked(false);
item.setTitle(R.string.menu_select_all);
item.setTitle(string.menu_select_all);
}
}
}
@ -321,17 +390,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
public boolean onMenuItemClick(MenuItem item) {
if (mNotesListAdapter.getSelectedCount() == 0) {
Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none),
Toast.makeText(NotesListActivity.this, getString(string.menu_select_none),
Toast.LENGTH_SHORT).show();
return true;
}
switch (item.getItemId()) {
case R.id.delete:
case id.delete:
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(getString(R.string.alert_title_delete));
builder.setTitle(getString(string.alert_title_delete));
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setMessage(getString(R.string.alert_message_delete_notes,
builder.setMessage(getString(string.alert_message_delete_notes,
mNotesListAdapter.getSelectedCount()));
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@ -343,7 +412,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
builder.setNegativeButton(android.R.string.cancel, null);
builder.show();
break;
case R.id.move:
case id.move:
startQueryDestinationFolders();
break;
default:
@ -450,7 +519,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void showFolderListMenu(Cursor cursor) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(R.string.menu_title_select_folder);
builder.setTitle(string.menu_title_select_folder);
final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@ -459,7 +528,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which));
Toast.makeText(
NotesListActivity.this,
getString(R.string.format_move_notes_to_folder,
getString(string.format_move_notes_to_folder,
mNotesListAdapter.getSelectedCount(),
adapter.getFolderName(NotesListActivity.this, which)),
Toast.LENGTH_SHORT).show();
@ -557,7 +626,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mState = ListEditState.SUB_FOLDER;
}
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
mTitleBar.setText(R.string.call_record_folder_name);
mTitleBar.setText(string.call_record_folder_name);
} else {
mTitleBar.setText(data.getSnippet());
}
@ -566,7 +635,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_new_note:
case id.btn_new_note:
createNewNote();
break;
default:
@ -588,20 +657,20 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void showCreateOrModifyFolderDialog(final boolean create) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null);
final EditText etName = (EditText) view.findViewById(R.id.et_foler_name);
View view = LayoutInflater.from(this).inflate(layout.dialog_edit_text, null);
final EditText etName = (EditText) view.findViewById(id.et_foler_name);
showSoftInput();
if (!create) {
if (mFocusNoteDataItem != null) {
etName.setText(mFocusNoteDataItem.getSnippet());
builder.setTitle(getString(R.string.menu_folder_change_name));
builder.setTitle(getString(string.menu_folder_change_name));
} else {
Log.e(TAG, "The long click data item is null");
return;
}
} else {
etName.setText("");
builder.setTitle(this.getString(R.string.menu_create_folder));
builder.setTitle(this.getString(string.menu_create_folder));
}
builder.setPositiveButton(android.R.string.ok, null);
@ -618,7 +687,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
hideSoftInput(etName);
String name = etName.getText().toString();
if (DataUtils.checkVisibleFolderName(mContentResolver, name)) {
Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name),
Toast.makeText(NotesListActivity.this, getString(string.folder_exist, name),
Toast.LENGTH_LONG).show();
etName.setSelection(0, etName.length());
return;
@ -718,9 +787,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if (mFocusNoteDataItem != null) {
menu.setHeaderTitle(mFocusNoteDataItem.getSnippet());
menu.add(0, MENU_FOLDER_VIEW, 0, R.string.menu_folder_view);
menu.add(0, MENU_FOLDER_DELETE, 0, R.string.menu_folder_delete);
menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, R.string.menu_folder_change_name);
menu.add(0, MENU_FOLDER_VIEW, 0, string.menu_folder_view);
menu.add(0, MENU_FOLDER_DELETE, 0, string.menu_folder_delete);
menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, string.menu_folder_change_name);
}
}
};
@ -745,9 +814,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
break;
case MENU_FOLDER_DELETE:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.alert_title_delete));
builder.setTitle(getString(string.alert_title_delete));
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setMessage(getString(R.string.alert_message_delete_folder));
builder.setMessage(getString(string.alert_message_delete_folder));
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
@ -773,8 +842,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
if (mState == ListEditState.NOTE_LIST) {
getMenuInflater().inflate(R.menu.note_list, menu);
// set sync or sync_cancel
menu.findItem(R.id.menu_sync).setTitle(
GTaskSyncService.isSyncing() ? R.string.menu_sync_cancel : R.string.menu_sync);
menu.findItem(id.menu_sync).setTitle(
GTaskSyncService.isSyncing() ? string.menu_sync_cancel : string.menu_sync);
} else if (mState == ListEditState.SUB_FOLDER) {
getMenuInflater().inflate(R.menu.sub_folder, menu);
} else if (mState == ListEditState.CALL_RECORD_FOLDER) {
@ -782,46 +851,23 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
} else {
Log.e(TAG, "Wrong state:" + mState);
}
if(mode == -1){
menu.findItem(R.id.menu_water).setVisible(false);
}else if (mode == 0){
menu.findItem(R.id.menu_sky).setVisible(false);
}else if (mode == 1){
menu.findItem(R.id.menu_grassland).setVisible(false);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_grassland:{
mode = 1;
getWindow().setBackgroundDrawableResource(R.drawable.grassland);
break;
}
case R.id.menu_sky:{
mode = 0;
getWindow().setBackgroundDrawableResource(R.drawable.sky);
break;
}
case R.id.menu_water:{
mode = -1;
getWindow().setBackgroundDrawableResource(R.drawable.water);
break;
}
case R.id.menu_new_folder: {
case id.menu_new_folder: {
showCreateOrModifyFolderDialog(true);
break;
}
case R.id.menu_export_text: {
case id.menu_export_text: {
exportNoteToText();
break;
}
case R.id.menu_sync: {
case id.menu_sync: {
if (isSyncMode()) {
if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) {
if (TextUtils.equals(item.getTitle(), getString(string.menu_sync))) {
GTaskSyncService.startSync(this);
} else {
GTaskSyncService.cancelSync(this);
@ -831,20 +877,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
break;
}
case R.id.menu_setting: {
case id.menu_setting: {
startPreferenceActivity();
break;
}
case R.id.menu_new_note: {
case id.menu_new_note: {
createNewNote();
break;
}
case R.id.menu_search:
case id.menu_search:
onSearchRequested();
break;
default:
break;
}
@ -871,26 +914,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(NotesListActivity.this
.getString(R.string.failed_sdcard_export));
.getString(string.failed_sdcard_export));
builder.setMessage(NotesListActivity.this
.getString(R.string.error_sdcard_unmounted));
.getString(string.error_sdcard_unmounted));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
} else if (result == BackupUtils.STATE_SUCCESS) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(NotesListActivity.this
.getString(R.string.success_sdcard_export));
.getString(string.success_sdcard_export));
builder.setMessage(NotesListActivity.this.getString(
R.string.format_exported_file_location, backup
string.format_exported_file_location, backup
.getExportedTextFileName(), backup.getExportedTextFileDir()));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
} else if (result == BackupUtils.STATE_SYSTEM_ERROR) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(NotesListActivity.this
.getString(R.string.failed_sdcard_export));
.getString(string.failed_sdcard_export));
builder.setMessage(NotesListActivity.this
.getString(R.string.error_sdcard_export));
.getString(string.error_sdcard_export));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
}
@ -985,6 +1028,4 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return false;
}
}

@ -18,7 +18,7 @@ package net.micode.notes.ui;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
@ -27,26 +27,48 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.provider.MediaStore;
//import android.support.v4.app.ActivityCompat;
//import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.yalantis.ucrop.UCropActivity;
//import com.bumptech.glide.Glide;
import androidx.core.app.ActivityCompat;
import com.yalantis.ucrop.UCrop;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.gtask.remote.GTaskSyncService;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class NotesPreferenceActivity extends PreferenceActivity {
public static final String PREFERENCE_NAME = "notes_preferences";
@ -61,6 +83,9 @@ public class NotesPreferenceActivity extends PreferenceActivity {
private static final String AUTHORITIES_FILTER_KEY = "authorities";
//维护_丁梓坚_个性化背景
private static final int CHOOSE_PHOTO = 1;
private PreferenceCategory mAccountCategory;
private GTaskReceiver mReceiver;
@ -69,6 +94,7 @@ public class NotesPreferenceActivity extends PreferenceActivity {
private boolean mHasAddedAccount;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
@ -154,6 +180,143 @@ public class NotesPreferenceActivity extends PreferenceActivity {
mAccountCategory.addPreference(accountPref);
}
//维护_丁梓坚_个性化背景_打开相册
private void openAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO);
}
//维护_丁梓坚_个性化背景_存储Bitmap
private Uri bitmap2uri(Bitmap b) {//c.getCacheDir()
File path = new File(getCacheDir() + "/123.jpeg");
try {
OutputStream os = new FileOutputStream(path);
b.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();
return Uri.fromFile(path);
} catch (Exception ignored) {
}
return null;
}
//维护_丁梓坚_个性化背景_根据相册图片进入裁剪操作
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == Activity.RESULT_OK
&& data != null)
{
Uri selectedImage = data.getData();//返回的是uri
String [] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String path = cursor.getString(columnIndex);
Bitmap bitmap = BitmapFactory.decodeFile(path);
bitmap2uri(bitmap);
Intent intent = new Intent(NotesPreferenceActivity.this, UCropPictureActivity.class);
this.startActivityForResult(intent, 12);
finish();
}
}
//维护_丁梓坚_个性化背景_选择栏
private String[] items2={"本地图片","还原"};
//维护_丁梓坚_个性化背景_选择栏
public void chooseBackground() {
/*
AlertDialog dialog;
dialog = new AlertDialog.Builder(this)
.setTitle("选择你的兴趣") //设置标题
//.setIcon(R.) //设置图标
.setMultiChoiceItems(new String[]{"看电影","打游戏","旅游","吃","喝"},null,null)
.setPositiveButton("确定",null) //添加“确定”按钮
.create(); //创建对话框
dialog.show(); //显示对话框
*/
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("选择方式");
//builder.setIcon(R.drawable.ic_launcher);
builder.setItems(items2, new backgroundListener());//原来要初始化
AlertDialog dialog=builder.create();
dialog.show();
}
//维护_丁梓坚_个性化背景_选择默认背景
private void returnToMenu() {
SharedPreferences sharedPreferences=getSharedPreferences("data1", Context.MODE_WORLD_WRITEABLE);//xml
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putInt("DEFAULT",1);
editor.commit();
finish();
}
//维护_丁梓坚_个性化背景_监听选择
class backgroundListener implements DialogInterface.OnClickListener{
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case 0://本地图片
openAlbum();
break;
case 1://还原
returnToMenu();
break;
default:
throw new IllegalStateException("Unexpected value: " + which);
}
dialog.dismiss();
}
}
//维护_丁梓坚_个性化背景_加载监听选择
private void loadBackgroundPreference() {
Preference background = new Preference(this);
background.setTitle("Set Background");
background.setSummary("Reset menu background you like");
background.setOnPreferenceClickListener(new OnPreferenceClickListener() {
//@Override
public boolean onPreferenceClick(Preference preference) {
chooseBackground();
return true;
}
});
mAccountCategory.addPreference(background);
}
private void loadSyncButton() {
Button syncButton = (Button) findViewById(R.id.preference_sync_button);
TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview);
@ -196,6 +359,8 @@ public class NotesPreferenceActivity extends PreferenceActivity {
private void refreshUI() {
loadAccountPreference();
loadSyncButton();
//维护_丁梓坚_个性化背景
loadBackgroundPreference();
}
private void showSelectAccountAlertDialog() {
@ -385,4 +550,5 @@ public class NotesPreferenceActivity extends PreferenceActivity {
return false;
}
}
}

@ -0,0 +1,272 @@
package net.micode.notes.ui;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.icu.util.Calendar;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.yalantis.ucrop.UCrop;
import net.micode.notes.R;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
//维护_丁梓坚_个性化背景_裁剪图片
public class UCropPictureActivity extends AppCompatActivity {
Button btnTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnTest = (Button) findViewById(R.id.btn_test);
/*
btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
startCrop();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});*/
try {
startCrop();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finish();
}
//维护
public static String FileSaveToInside(Context context, String fileName, Bitmap bitmap) {
FileOutputStream fos = null;
String path = null;
try {
//设置路径 /Android/data/com.panyko.filesave/Pictures/
File folder = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//判断目录是否存在
//目录不存在时自动创建
if (folder.exists() ||folder.mkdir()) {
File file = new File(folder, fileName);
fos = new FileOutputStream(file);
//写入文件
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
path = file.getAbsolutePath();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
//关闭流
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//返回路径
return path;
}
private void startCrop() throws FileNotFoundException {
//Uri sourceUri = Uri.parse("http://star.xiziwang.net/uploads/allimg/140512/19_140512150412_1.jpg");
//裁剪后保存到文件中
Uri sourceUri = Uri.fromFile(new File(getCacheDir(), "123.jpeg"));
Uri destinationUri = Uri.fromFile(new File(getCacheDir(), "SampleCropImage.jpeg"));
UCrop.of(sourceUri, destinationUri).withAspectRatio(9, 16).withMaxResultSize(2000, 2500).start(this);
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(destinationUri));
String save=FileSaveToInside(this,"1234",bitmap);
SharedPreferences sharedPreferences=getSharedPreferences("data1", Context.MODE_WORLD_WRITEABLE);//xml
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putString("PERSONAL_URI",save);
editor.putInt("DEFAULT",0);
editor.commit();
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
//裁切成功
if (requestCode == UCrop.REQUEST_CROP) {
Uri croppedFileUri = UCrop.getOutput(data);
//获取默认的下载目录
String downloadsDirectoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
@SuppressLint({"NewApi", "LocalSuppress"}) String filename = String.format("%d_%s", Calendar.getInstance().getTimeInMillis(), croppedFileUri.getLastPathSegment());
File saveFile = new File(downloadsDirectoryPath, filename);
//保存下载的图片
FileInputStream inStream = null;
FileOutputStream outStream = null;
FileChannel inChannel = null;
FileChannel outChannel = null;
try {
inStream = new FileInputStream(new File(croppedFileUri.getPath()));
outStream = new FileOutputStream(saveFile);
inChannel = inStream.getChannel();
outChannel = outStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
Toast.makeText(this, "裁切后的图片保存在:" + saveFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
outChannel.close();
outStream.close();
inChannel.close();
inStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//裁切失败
if (resultCode == UCrop.RESULT_ERROR) {
Toast.makeText(this, "裁切图片失败", Toast.LENGTH_SHORT).show();
}
}
// 专为Android4.4设计的从Uri获取文件绝对路径以前的方法已不好使
@SuppressLint("NewApi")
public static String getPathByUri4kitkat(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
if (isExternalStorageDocument(uri)) {// ExternalStorageProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {// DownloadsProvider
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
} else if (isMediaDocument(uri)) {// MediaProvider
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;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] { split[1] };
return getDataColumn(context, contentUri, selection, selectionArgs);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore
// (and
// general)
return getDataColumn(context, uri, null, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {// File
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context
* The context.
* @param uri
* The Uri to query.
* @param selection
* (Optional) Filter used in the query.
* @param selectionArgs
* (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static 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;
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
}

@ -0,0 +1,33 @@
package net.micode.notes.ui;
import android.os.Bundle;
import android.os.Handler;
import net.micode.notes.R;
import android.content.Intent;
import android.app.Activity;
/**
* An example full-screen activity that shows and hides the system UI (i.e.
* status bar and navigation/system bar) with user interaction.
*/
//维护_丁梓坚_欢迎界面
public class WelcomeActivity extends Activity {
Handler mHandler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //加载启动界面
setContentView(R.layout.activity_welcome); //加载启动图片
// 当计时结束时跳转至NotesListActivity
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent=new Intent();
intent.setClass(WelcomeActivity.this, NotesListActivity.class);
startActivity(intent);
finish(); //销毁欢迎页面
}
}, 2000); // 2 秒后跳转
}
}

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save