Event/main/java/com/hty/event/MainActivity.java

615 lines
32 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.hty.event;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.SearchManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class MainActivity extends Activity {
static File dir;
EditText editText_search;
ImageButton imageButton_clear;
ListView listView;
SimpleCursorAdapter adapter;
InputMethodManager IMM;
SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
SimpleDateFormat SDF_date = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
int position1 = 0;
String[] from = { "_id", "time", "location", "event" };
int[] to = { R.id.textView_id, R.id.textView_time, R.id.textView_location, R.id.textView_event };
SimpleCursorAdapter.ViewBinder viewBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "HTY" + File.separator + "Event";
dir = new File(path);
if (!dir.exists()) {
boolean b = dir.mkdirs();
if (!b)
Toast.makeText(MainActivity.this, "创建文件夹 " + path + " 失败!", Toast.LENGTH_SHORT).show();
}
setContentView(R.layout.activity_main);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
IMM = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
editText_search = (EditText) findViewById(R.id.editText_search);
editText_search.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 (s.toString().equals("")) {
imageButton_clear.setVisibility(View.GONE);
} else {
imageButton_clear.setVisibility(View.VISIBLE);
}
search(s.toString());
}
});
imageButton_clear = (ImageButton) findViewById(R.id.imageButton_clear);
imageButton_clear.setVisibility(View.GONE);
imageButton_clear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText_search.setText("");
}
});
listView = (ListView) findViewById(R.id.listView);
viewBinder = new SimpleCursorAdapter.ViewBinder() {
public boolean setViewValue(View view, Cursor cursor, int columnIndex){
//Log.e(Thread.currentThread().getStackTrace()[2] + "", view.toString() + columnIndex);
if (view.getId() == R.id.textView_time) {
Date date = new Date(cursor.getLong(columnIndex));
((TextView) view).setText(SDF.format(date));
return true;
}
return false;
}
};
search("");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
String[] sm = { "添加", "日期范围搜索", "分享数据库", "导出HTML", "导出CSV", "更新日志", "关于", "退出" };
for (int i=0; i<sm.length; i++) {
menu.add(0, i, i, sm[i]);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int item_id = item.getItemId();
switch (item_id) {
case 0:
LayoutInflater layoutInflater = LayoutInflater.from(this);
View view = layoutInflater.inflate(R.layout.event_edit, null);
final EditText editText_location = (EditText) view.findViewById(R.id.editText_location);
final EditText editText_event = (EditText) view.findViewById(R.id.editText_event);
final DatePicker datePicker = (DatePicker) view.findViewById(R.id.datePicker);
final TimePicker timePicker = (TimePicker) view.findViewById(R.id.timePicker);
timePicker.setIs24HourView(true);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(android.R.drawable.ic_menu_add);
builder.setTitle("添加事件");
builder.setView(view);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int year = datePicker.getYear();
int month = datePicker.getMonth();
int day = datePicker.getDayOfMonth();
int hour = timePicker.getCurrentHour();
int minute = timePicker.getCurrentMinute();
Date date = new Date(year - 1900, month, day, hour, minute);
String stime = SDF.format(date);
Log.e(Thread.currentThread().getStackTrace()[2] + "", stime);
String slocation = editText_location.getText().toString();
String sevent = editText_event.getText().toString();
Field field = null;
try {
//通过反射获取dialog中的私有属性mShowing
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);//设置该属性可以访问
} catch (Exception ex) {
}
if (!slocation.equals("") && (!sevent.equals(""))) {
DBHelper dbHelper = new DBHelper(getApplicationContext());
ContentValues values = new ContentValues();
//values.put("time", calendar.getTime().getTime());
values.put("time", date.getTime());
values.put("location", slocation);
values.put("event", sevent);
dbHelper.insert(values);
IMM.hideSoftInputFromWindow(editText_location.getWindowToken(), 0);
search(editText_search.getText().toString());
try {
//关闭
field.set(dialog, true);
dialog.dismiss();
} catch (Exception ex) {
}
} else {
if (slocation.equals("")){
editText_location.setError("地点不能为空!");
}
if (sevent.equals("")){
editText_event.setError("事件不能为空!");
}
try {
//设置dialog不可关闭
field.set(dialog, false);
dialog.dismiss();
} catch (Exception ex) {
}
}
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
IMM.hideSoftInputFromWindow(editText_event.getWindowToken(), 0);
Field field = null;
try {
//通过反射获取dialog中的私有属性mShowing
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);//设置该属性可以访问
} catch (Exception ex) {
}
try {
field.set(dialog, true);
dialog.dismiss();
} catch (Exception ex) {
}
}
});
builder.create().show();
break;
case 1:
LayoutInflater layoutInflater1 = LayoutInflater.from(this);
View view1 = layoutInflater1.inflate(R.layout.date_range, null);
final DatePicker datePicker_start = (DatePicker) view1.findViewById(R.id.datePicker_start);
final DatePicker datePicker_end = (DatePicker) view1.findViewById(R.id.datePicker_end);
AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
builder1.setIcon(android.R.drawable.ic_menu_search);
builder1.setTitle("日期范围搜索");
builder1.setView(view1);
builder1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Date date_start = new Date(datePicker_start.getYear() - 1900, datePicker_start.getMonth(), datePicker_start.getDayOfMonth());
Date date_end = new Date(datePicker_end.getYear() - 1900, datePicker_end.getMonth(), datePicker_end.getDayOfMonth());
Field field = null;
try { //通过反射获取dialog中的私有属性mShowing
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true); //设置该属性可以访问
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
if (date_end.getTime() >= date_start.getTime()) {
DBHelper helper = new DBHelper(MainActivity.this);
Cursor cursor = helper.query(date_start.getTime(), date_end.getTime());
int count = cursor.getCount();
if (date_end.getTime() > date_start.getTime())
setTitle(SDF_date.format(date_start) + "" + SDF_date.format(date_end) + "的事件" + count);
else
setTitle(SDF_date.format(date_start) + "的事件" + count);
adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item_event, cursor, from, to, 0);
adapter.setViewBinder(viewBinder);
listView.setAdapter(adapter);
try { //关闭
field.set(dialog, true);
dialog.dismiss();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getApplicationContext(), "结束日期比开始日期早!", Toast.LENGTH_SHORT).show();
try { //设置dialog不可关闭
field.set(dialog, false);
dialog.dismiss();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
}
});
builder1.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Field field = null;
try {
//通过反射获取dialog中的私有属性mShowing
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);//设置该属性可以访问
} catch (Exception ex) {
}
try {
field.set(dialog, true);
dialog.dismiss();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
});
builder1.create().show();
break;
case 2:
File file = new File(DBHelper.DATABASE_NAME);
if (file.exists()) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
intent.setType("*/*");
startActivity(Intent.createChooser(intent, "分享 " + DBHelper.filename));
} else {
Toast.makeText(getApplicationContext(), "数据库文件不存在", Toast.LENGTH_SHORT).show();
}
break;
case 3:
String s = "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"/>\n<title>事件</title>\n<style>a { text-decoration:none; }\ntable { table-layout:fixed; width:100%; border-collapse:collapse; }\nth, td { border:1px solid black; padding:5px; overflow:hidden; text-overflow: ellipsis; }\n</style>\n</head>\n<body>\n<h2 align=center>事件" + adapter.getCount() + "</h2>\n<table>\n<tr><th>时间</th><th>地点</th><th>事件</th></tr>\n";
for (int i=0; i<adapter.getCount(); i++){
LinearLayout layout = (LinearLayout) listView.getAdapter().getView(i, null, null);
TextView textView_time = (TextView) layout.findViewById(R.id.textView_time);
TextView textView_location = (TextView) layout.findViewById(R.id.textView_location);
TextView textView_event = (TextView) layout.findViewById(R.id.textView_event);
s = s + "<tr><td>" + textView_time.getText().toString() + "</td><td>" + textView_location.getText().toString() + "</td><td>" + textView_event.getText().toString() + "</td></tr>\n";
}
s += "</table>\n</body>\n</html>";
String filename = "event.htm";
if (!editText_search.getText().toString().equals(""))
filename = editText_search.getText().toString() + ".htm";
writeFile(filename, s);
break;
case 4:
s = "";
for (int i=0; i<adapter.getCount(); i++){
LinearLayout layout = (LinearLayout) listView.getAdapter().getView(i, null, null);
TextView textView_time = (TextView) layout.findViewById(R.id.textView_time);
TextView textView_location = (TextView) layout.findViewById(R.id.textView_location);
TextView textView_event = (TextView) layout.findViewById(R.id.textView_event);
s = s + textView_time.getText().toString() + "," + textView_location.getText().toString().replace("\n", " ").replace(",","") + "," + textView_event.getText().toString().replace("\n", " ").replace(",","") + "\r\n";
}
filename = "event.csv";
if (!editText_search.getText().toString().equals(""))
filename = editText_search.getText().toString() + ".csv";
writeFile(filename, s);
break;
case 5:
new AlertDialog.Builder(this)
.setIcon(R.mipmap.ic_launcher)
.setTitle("更新日志")
.setMessage("V1.6 (2023-10)\n增加日期范围搜索。\n\nV1.5 (2023-02)\n移除DatePicker控件的startYear、endYear属性去除日期限制。\n\nV1.4 (2022-11)\n修复修改和删除后没按搜索词查询。\n\nV1.3 (2022-10)\n增加数据库文件分享。\n优化距今天数计算。\n\nV1.2 (2020-11)\n修复修改后没有按搜索词过滤。\n\nV1.1 (2020-08)\n增加跳转浏览器搜索。\n修改、删除记住位置。\n时间设置为24小时。\n\nV1.0 (2020-03)\n显示、添加、搜索日志导出HTML、CSV。")
.setPositiveButton("确定", null).show();
break;
case 6:
new AlertDialog.Builder(this).setIcon(R.mipmap.ic_launcher).setTitle("事件日志 V1.6")
.setMessage("显示、添加、搜索日志导出HTML、CSV。\n作者海天鹰\nQQ84429027")
.setPositiveButton("确定", null).show();
break;
case 7:
finish();
break;
}
return true;
}
void search(String s) {
DBHelper helper = new DBHelper(this);
Cursor cursor1 = helper.query(s);
int count = cursor1.getCount();
setTitle("事件" + count);
adapter = new SimpleCursorAdapter(this, R.layout.item_event, cursor1, from, to, 0);
adapter.setViewBinder(viewBinder);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
IMM.hideSoftInputFromWindow(editText_search.getWindowToken(), 0);
final String stime = ((TextView) view.findViewById(R.id.textView_time)).getText().toString();
final String location = ((TextView) view.findViewById(R.id.textView_location)).getText().toString();
final String event = ((TextView) view.findViewById(R.id.textView_event)).getText().toString();
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(android.R.drawable.ic_menu_info_details);
String title = "";
Date date;
try {
date = SDF.parse(stime);
title = DayDiff(date);
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
builder.setTitle(title);
builder.setMessage(stime + "\n" + location + "\n" + event);
builder.setPositiveButton("复制", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ClipboardManager CM = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("text", stime + "\n" + location + "\n" + event);
CM.setPrimaryClip(clipData);
Toast.makeText(getApplicationContext(), "内容已复制", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
builder.setNegativeButton("搜索", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
builder1.setIcon(android.R.drawable.ic_menu_search);
builder1.setTitle("搜索");
final EditText editText = new EditText(MainActivity.this);
editText.setText(event);
builder1.setView(editText);
builder1.setPositiveButton("搜索", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
IMM.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, editText.getText().toString());
startActivity(intent);
}
});
builder1.create().show();
}
});
builder.setNeutralButton("分享", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, stime + "\n" + location + "\n" + event);
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, "分享到"));
dialog.dismiss();
}
});
builder.create().show();
}
});
listView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
//AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
//String title = ((TextView) info.targetView.findViewById(R.id.title)).getText().toString();
//menu.setHeaderTitle(title);
menu.add(0, 0, 0, "复制");
menu.add(0, 1, 1, "分享");
menu.add(0, 2, 2, "修改");
menu.add(0, 3, 3, "删除");
}
});
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
final String sid = ((TextView) menuInfo.targetView.findViewById(R.id.textView_id)).getText().toString();
String stime = ((TextView) menuInfo.targetView.findViewById(R.id.textView_time)).getText().toString();
String location = ((TextView) menuInfo.targetView.findViewById(R.id.textView_location)).getText().toString();
String event = ((TextView) menuInfo.targetView.findViewById(R.id.textView_event)).getText().toString();
position1 = menuInfo.position;
switch (item.getItemId()) {
case 0:
ClipboardManager CM = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
CM.setPrimaryClip(ClipData.newPlainText("text", stime + "\n" + location + "\n" + event));
Toast.makeText(getApplicationContext(), "内容已复制", Toast.LENGTH_SHORT).show();
break;
case 1:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, stime + "\n" + location + "\n" + event);
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, "分享到"));
break;
case 2:
LayoutInflater layoutInflater = LayoutInflater.from(this);
View view = layoutInflater.inflate(R.layout.event_edit, null);
final EditText editText_location = (EditText) view.findViewById(R.id.editText_location);
final EditText editText_event = (EditText) view.findViewById(R.id.editText_event);
final DatePicker datePicker = (DatePicker) view.findViewById(R.id.datePicker);
final TimePicker timePicker = (TimePicker) view.findViewById(R.id.timePicker);
timePicker.setIs24HourView(true);
Date date;
try {
date = SDF.parse(stime);
datePicker.init(date.getYear() + 1900, date.getMonth(), date.getDate(), null);
timePicker.setCurrentHour(date.getHours());
timePicker.setCurrentMinute(date.getMinutes());
} catch (Exception e){
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT);
}
editText_location.setText(location);
editText_event.setText(event);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(android.R.drawable.ic_menu_edit);
builder.setTitle("修改事件");
builder.setView(view);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String location = editText_location.getText().toString();
String event = editText_event.getText().toString();
Field field = null;
try {
//通过反射获取dialog中的私有属性mShowing
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);//设置该属性可以访问
} catch (Exception ex) {
}
if (!location.equals("") && !event.equals("")) {
int year = datePicker.getYear();
int month = datePicker.getMonth();
int day = datePicker.getDayOfMonth();
int hour = timePicker.getCurrentHour();
int minute = timePicker.getCurrentMinute();
Date date = new Date(year - 1900, month, day, hour, minute);
DBHelper dbHelper = new DBHelper(getApplicationContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("time", date.getTime());
values.put("location", location);
values.put("event", event);
db.update(DBHelper.TableName, values, "_id = " + sid, null);
search(editText_search.getText().toString());
listView.setSelection(position1);
IMM.hideSoftInputFromWindow(editText_location.getWindowToken(), 0);
try {
//关闭
field.set(dialog, true);
dialog.dismiss();
} catch (Exception ex) {
}
} else {
if (location.equals("")){
editText_location.setError("地点不能为空!");
}
if (event.equals("")){
editText_event.setError("事件不能为空!");
}
try {
//设置dialog不可关闭
field.set(dialog, false);
dialog.dismiss();
} catch (Exception ex) {
}
}
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Field field = null;
try {
//通过反射获取dialog中的私有属性mShowing
field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);//设置该属性可以访问
} catch (Exception ex) {
}
try {
field.set(dialog, true);
dialog.dismiss();
} catch (Exception ex) {
}
}
});
builder.create().show();
break;
case 3:
new AlertDialog.Builder(MainActivity.this)
.setIcon(android.R.drawable.stat_sys_warning)
.setTitle("删除操作")
.setMessage("此步骤不可还原,确定删除" + sid + "\n" + stime + "\n" + location + "\n" + event)
.setPositiveButton("", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DBHelper dbHelper = new DBHelper(getApplicationContext());
dbHelper.del(sid);
search(editText_search.getText().toString());
listView.setSelection(position1);
}
})
.setNegativeButton("", null)
.show();
break;
}
return true;
}
void writeFile(String filename, String s) {
File file = new File(MainActivity.dir, filename);
try {
BufferedWriter BW = new BufferedWriter(new FileWriter(file, false)); //false覆盖
if(filename.endsWith(".csv")){
BW.write('\ufeff'); // Excel通过文件的BOM头来判断文件编码
BW.flush();
}
BW.write(s);
BW.flush();
Toast.makeText(getApplicationContext(), "写文件 " + MainActivity.dir + File.separator + filename + " 成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Log.e(Thread.currentThread().getStackTrace()[2] + "", e.toString());
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
String DayDiff(Date date) {
String s = "";
Date date1 = new Date();
long ms = Math.abs(date1.getTime() - date.getTime());
long d = ms / 1000 / 60 / 60 / 24;
long y = d / 365;
if (y > 0) {
s += y + "";
d = d - y * 365;
}
long m = d / 30;
if (m > 0) {
s += m + "";
d = d - m * 30;
}
if (d > 0) {
s += d + "";
}
if (date.before(date1))
s += "";
else
s += "";
if (m==0 && y==0 && d == 0) {
s = "一天内";
}
return s;
}
}