diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0d0150b..2710256 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -117,7 +117,7 @@ android:exported="true" /> oldData = AlarmUtils.getInstance().getOldData(); - List data = new ArrayList<>(); - for (AlarmClockData alarm : oldData.values()) { - if (alarm.getId() == code) { - alarm.setFinished(true); - } - data.add(alarm); + AlarmClockData alarm = oldData.get(code); + if (alarm != null) { + alarm.setFinished(true); + AlarmUtils.getInstance().updateAlarmFinished(alarm); } - AlarmUtils.getInstance().setAlarmString(data); NetInterfaceManager.getInstance() .getUpdateAlarmObservable(alarmClockData.getId()) .subscribe(new Observer() { diff --git a/app/src/main/java/com/uiui/aios/activity/alarm/AlarmClockActivity.java b/app/src/main/java/com/uiui/aios/activity/alarm/AlarmClockActivity.java index f2b2c10..9eedb22 100644 --- a/app/src/main/java/com/uiui/aios/activity/alarm/AlarmClockActivity.java +++ b/app/src/main/java/com/uiui/aios/activity/alarm/AlarmClockActivity.java @@ -11,12 +11,13 @@ import com.uiui.aios.base.BaseActivity; import com.uiui.aios.bean.AlarmClockData; import com.uiui.aios.bean.BaseResponse; import com.uiui.aios.network.NetInterfaceManager; -import com.uiui.aios.utils.AlarmUtils; +import com.uiui.aios.alarm.AlarmUtils; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; +import cn.jzvd.Jzvd; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; @@ -74,4 +75,10 @@ public class AlarmClockActivity extends BaseActivity { } }); } + + @Override + protected void onDestroy() { + super.onDestroy(); + Jzvd.releaseAllVideos(); + } } diff --git a/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java b/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java index 22dfd72..b4db5fb 100644 --- a/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java +++ b/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java @@ -12,6 +12,7 @@ import android.content.res.Configuration; import android.graphics.Color; import android.os.IBinder; import android.os.RemoteException; +import android.os.SystemClock; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; @@ -87,6 +88,11 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { mMainPresenter.attachView(this); mMainPresenter.setLifecycle(lifecycleSubject); + if (BuildConfig.DEBUG) { + SystemClock.setCurrentTimeMillis(1662123600000L);//09-02 +// SystemClock.setCurrentTimeMillis(1662210000000L);//09-03 + } + mFragmentManager = getSupportFragmentManager(); mFragmentTransaction = mFragmentManager.beginTransaction(); mFragments = new ArrayList<>(); diff --git a/app/src/main/java/com/uiui/aios/adapter/NotificationAdapter.java b/app/src/main/java/com/uiui/aios/adapter/NotificationAdapter.java index ca3a96f..237dc2d 100644 --- a/app/src/main/java/com/uiui/aios/adapter/NotificationAdapter.java +++ b/app/src/main/java/com/uiui/aios/adapter/NotificationAdapter.java @@ -26,6 +26,11 @@ import io.reactivex.rxjava3.disposables.Disposable; public class NotificationAdapter extends RecyclerView.Adapter { private List dataList; + public void setDataList(List data) { + this.dataList = data; + notifyDataSetChanged(); + } + @NonNull @Override public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -87,7 +92,6 @@ public class NotificationAdapter extends RecyclerView.Adapter data) { - this.dataList = data; - notifyDataSetChanged(); - } - class Holder extends RecyclerView.ViewHolder { TextView tv_title; TextView tv_time; diff --git a/app/src/main/java/com/uiui/aios/alarm/AlarmOpenHelper.java b/app/src/main/java/com/uiui/aios/alarm/AlarmOpenHelper.java new file mode 100644 index 0000000..0ac96eb --- /dev/null +++ b/app/src/main/java/com/uiui/aios/alarm/AlarmOpenHelper.java @@ -0,0 +1,60 @@ +package com.uiui.aios.alarm; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.os.Environment; + +import java.io.File; + +public class AlarmOpenHelper extends SQLiteOpenHelper { + + public static final int DATABASE_VERSION = 1; + public static final String DATABASE_NAME = "AlarmDatabase.db"; + public static final String DATABASE_FILE_NAME = Environment.getExternalStorageDirectory().getPath() + File.separator + DATABASE_NAME; + + public static final String TABLE_ALARM = " AlarmTable"; + + public static final String KEY_ID = "id"; + public static final String KEY_TYPE = "type"; + public static final String KEY_TIME = "time"; + public static final String KEY_TITLE = "title"; + public static final String KEY_VOICE = "voice"; + public static final String KEY_VOICE_MD5 = "voice_md5"; + public static final String KEY_FILE = "file"; + public static final String KEY_REMIND_TYPE = "remind_type"; + public static final String KEY_IS_ONOFF = "is_onoff"; + public static final String KEY_FINISHED = "finished"; + + String CREATE_ALARM_TABLE = "CREATE TABLE IF NOT EXISTS" + TABLE_ALARM + + "(" + + KEY_ID + " INTEGER PRIMARY KEY," + + KEY_TYPE + " INTEGER," + + KEY_TIME + " TEXT," + + KEY_TITLE + " TEXT," + + KEY_VOICE + " TEXT," + + KEY_VOICE_MD5 + " TEXT," + + KEY_FILE + " TEXT," + + KEY_REMIND_TYPE + " INTEGER," + + KEY_IS_ONOFF + " INTEGER," + + KEY_FINISHED + " BOOLEAN DEFAULT 0" + + ")"; + + public AlarmOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { + super(context, name, factory, version); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(CREATE_ALARM_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (oldVersion >= newVersion) { + return; + } + db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARM); + onCreate(db); + } +} diff --git a/app/src/main/java/com/uiui/aios/service/AlarmService.java b/app/src/main/java/com/uiui/aios/alarm/AlarmService.java similarity index 88% rename from app/src/main/java/com/uiui/aios/service/AlarmService.java rename to app/src/main/java/com/uiui/aios/alarm/AlarmService.java index 9b4a0e1..bde59c6 100644 --- a/app/src/main/java/com/uiui/aios/service/AlarmService.java +++ b/app/src/main/java/com/uiui/aios/alarm/AlarmService.java @@ -1,4 +1,4 @@ -package com.uiui.aios.service; +package com.uiui.aios.alarm; import android.app.Service; import android.content.Intent; @@ -13,5 +13,4 @@ public class AlarmService extends Service { return null; } - } diff --git a/app/src/main/java/com/uiui/aios/alarm/AlarmUtils.java b/app/src/main/java/com/uiui/aios/alarm/AlarmUtils.java new file mode 100644 index 0000000..58b18de --- /dev/null +++ b/app/src/main/java/com/uiui/aios/alarm/AlarmUtils.java @@ -0,0 +1,588 @@ +package com.uiui.aios.alarm; + +import android.annotation.SuppressLint; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.text.TextUtils; +import android.util.Log; + +import com.arialyy.aria.core.Aria; +import com.blankj.utilcode.util.FileUtils; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; +import com.uiui.aios.bean.AlarmClockData; +import com.uiui.aios.service.main.MainService; +import com.uiui.aios.utils.Utils; + +import java.io.File; +import java.lang.reflect.Type; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; +import java.util.function.Function; + +public class AlarmUtils { + @SuppressLint("StaticFieldLeak") + private static AlarmUtils sInstance; + private static String TAG = AlarmUtils.class.getSimpleName(); + private Context mContext; + private AlarmManager alarmManager; + private SQLiteDatabase db; + private AlarmOpenHelper mAlarmOpenHelper; + + public static final int ONE_DAY_TIME = 1000 * 60 * 60 * 24; + + + private AlarmUtils(Context context) { + this.mContext = context; +// this.mAlarmOpenHelper = new AlarmOpenHelper(context, AlarmOpenHelper.DATABASE_NAME, null, AlarmOpenHelper.DATABASE_VERSION); + this.mAlarmOpenHelper = new AlarmOpenHelper(context, AlarmOpenHelper.DATABASE_FILE_NAME, null, AlarmOpenHelper.DATABASE_VERSION); + this.db = mAlarmOpenHelper.getWritableDatabase(); + alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + } + + public static void init(Context context) { + if (context == null) { + throw new RuntimeException("context is NULL"); + } + if (sInstance == null) { + sInstance = new AlarmUtils(context); + } + } + + public static AlarmUtils getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init AmapManager first"); + } + return sInstance; + } + + private void open() { + if (db == null || !db.isOpen()) { + db = mAlarmOpenHelper.getWritableDatabase(); + } + } + + /** + * 增加数据 + * + * @param alarmClockData + * @return + */ + public boolean addAlarmClock(AlarmClockData alarmClockData) { + open(); + ContentValues values = new ContentValues(); + values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId()); + values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType()); + values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime()); + values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle()); + values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice()); + values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5()); + values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile()); + values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type()); + values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff()); + long id = 0; + db.beginTransaction(); + try { + id = db.insert(AlarmOpenHelper.TABLE_ALARM, null, values); + } catch (Exception e) { + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + db.close(); + return id > 0; + } + + + /** + * 更新数据 + * + * @param alarmClockData + * @return + */ + public boolean updateAlarmClock(AlarmClockData alarmClockData) { + open(); + ContentValues values = new ContentValues(); + values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId()); + values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType()); + values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime()); + values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle()); + values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice()); + values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5()); + values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile()); + values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type()); + values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff()); + long id = 0; + db.beginTransaction(); + try { + id = db.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, values, SQLiteDatabase.CONFLICT_REPLACE); + db.setTransactionSuccessful(); + } catch (Exception e) { + Log.e(TAG, "updateAlarmClock: " + e.getMessage()); + } finally { + db.endTransaction(); + } + db.close(); + return id > 0; + } + + /** + * 批量插入数据 + * + * @param list + */ + public void insertListValues(List list) { + open(); + List contentValuesList = new ArrayList<>(); + for (AlarmClockData alarmClockData : list) { + ContentValues values = new ContentValues(); + values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId()); + values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType()); + values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime()); + values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle()); + values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice()); + values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5()); + values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile()); + values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type()); + values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff()); + values.put(AlarmOpenHelper.KEY_FINISHED, alarmClockData.isFinished()); + contentValuesList.add(values); + } + db.beginTransaction(); + try { + for (ContentValues v : contentValuesList) { + db.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, v, SQLiteDatabase.CONFLICT_REPLACE); + } + db.setTransactionSuccessful(); + } catch (Exception e) { + Log.e(TAG, "insertListValues: " + e.getMessage()); + } finally { + db.endTransaction(); + } + db.close(); + } + + /** + * 删除数据 + * + * @param alarmClockData + * @return + */ + public boolean deleteAlarmClock(AlarmClockData alarmClockData) { + if (alarmClockData == null) { + return false; + } + return deleteAlarmClock(alarmClockData.getId()); + } + + public boolean deleteAlarmClock(int RowID) { + open(); + long id = 0; + db.beginTransaction(); + try { + id = db.delete(AlarmOpenHelper.TABLE_ALARM, "id =" + RowID, null); + db.setTransactionSuccessful(); + } catch (Exception e) { + Log.e(TAG, "deleteAlarmClock: " + e.getMessage()); + } finally { + db.endTransaction(); + } + db.close(); + return id > 0; + } + + + /** + * 获取所有Alarm + * + * @return + */ + public List getAllAlarms() { + open(); + List list = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + AlarmOpenHelper.TABLE_ALARM; + open(); + Cursor cursor = db.rawQuery(selectQuery, null); + if (cursor.moveToFirst()) { + do { + AlarmClockData alarmClockData = new AlarmClockData(); + alarmClockData.setId(Integer.parseInt(cursor.getString(0))); + alarmClockData.setType(cursor.getInt(1)); + alarmClockData.setTime(cursor.getString(2)); + alarmClockData.setTitle(cursor.getString(3)); + alarmClockData.setVoice(cursor.getString(4)); + alarmClockData.setVoice_md5(cursor.getString(5)); + alarmClockData.setFile(cursor.getString(6)); + alarmClockData.setRemind_type(cursor.getInt(7)); + alarmClockData.setIs_onoff(cursor.getInt(8)); + if (cursor.getInt(9) == 1) { + alarmClockData.setFinished(true); + } else { + alarmClockData.setFinished(false); + } + list.add(alarmClockData); + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + return list; + } + + + private HashSet pendingIntents; + + /** + * 设置闹钟列表 + * + * @param data + */ + public void setAlarmClockData(List data) { + if (pendingIntents == null) { + pendingIntents = getOldPendingIntents(); + } + for (PendingIntent pendingIntent : pendingIntents) { + alarmManager.cancel(pendingIntent); + } + List newData = mergeData(data); + for (AlarmClockData clockData : newData) { + setAlarm(clockData); + } + insertListValues(newData); + } + + /** + * 合并闹钟列表,删除不存在闹钟 + * + * @param alarmClockDataList + * @return + */ + private List mergeData(List alarmClockDataList) { + HashMap alarmClockDataMap = new HashMap<>(); + for (AlarmClockData alarmClockData : alarmClockDataList) { + alarmClockDataMap.put(alarmClockData.getId(), alarmClockData); + } + HashMap oldData = getOldData(); + List deleteData = new ArrayList<>(); + for (Map.Entry entry : oldData.entrySet()) { + if (alarmClockDataMap.get(entry.getKey()) == null) { + deleteData.add(entry.getValue()); + } + } + for (AlarmClockData alarmClockData : deleteData) { + deleteAlarmClock(alarmClockData); + } + + List newData = new ArrayList<>(); + for (AlarmClockData alarm : alarmClockDataList) { + AlarmClockData oldAlarm = oldData.get(alarm.getId()); + if (oldAlarm == null) { + newData.add(alarm); + } else { + if (oldAlarm.equals(alarm)) { + newData.add(oldAlarm); + } else { + newData.add(alarm); + } + } + } + return newData; + } + + /** + * 更新完成状态 + * + * @param alarmClockData + * @return + */ + public boolean updateAlarmFinished(AlarmClockData alarmClockData) { + open(); + ContentValues values = new ContentValues(); + values.put(AlarmOpenHelper.KEY_ID, alarmClockData.getId()); + values.put(AlarmOpenHelper.KEY_TYPE, alarmClockData.getType()); + values.put(AlarmOpenHelper.KEY_TIME, alarmClockData.getTime()); + values.put(AlarmOpenHelper.KEY_TITLE, alarmClockData.getTitle()); + values.put(AlarmOpenHelper.KEY_VOICE, alarmClockData.getVoice()); + values.put(AlarmOpenHelper.KEY_VOICE_MD5, alarmClockData.getVoice_md5()); + values.put(AlarmOpenHelper.KEY_FILE, alarmClockData.getFile()); + values.put(AlarmOpenHelper.KEY_REMIND_TYPE, alarmClockData.getRemind_type()); + values.put(AlarmOpenHelper.KEY_IS_ONOFF, alarmClockData.getIs_onoff()); + values.put(AlarmOpenHelper.KEY_FINISHED, alarmClockData.isFinished()); + long id = 0; + db.beginTransaction(); + try { + id = db.update(AlarmOpenHelper.TABLE_ALARM, values, AlarmOpenHelper.KEY_ID + "=?", new String[]{String.valueOf(alarmClockData.getId())}); + db.setTransactionSuccessful(); + } catch (Exception e) { + Log.e(TAG, "updateAlarmFinished: " + e.getMessage()); + } finally { + db.endTransaction(); + } + db.close(); + return id > 0; + } + + public HashMap getOldData() { + List alarmClockData = getAllAlarms(); + if (alarmClockData == null || alarmClockData.size() == 0) { + return new HashMap<>(); + } else { + HashMap hashMap = new HashMap<>(); + for (AlarmClockData clockData : alarmClockData) { + hashMap.put(clockData.getId(), clockData); + } + return hashMap; + } + } + + + /** + * 获取最近一次的闹钟 + * + * @return + */ + public AlarmClockData getRecentAlarmClock() { + List alarmClockData = getAllAlarms(); + if (alarmClockData == null || alarmClockData.size() == 0) { + return null; + } else { + Collections.sort(alarmClockData, new Comparator() { + @Override + public int compare(AlarmClockData o1, AlarmClockData o2) { + if ((o1.getTimeStamp()) <= (o2.getTimeStamp())) { + return 0; + } else { + return -1; + } + } + }); + return alarmClockData.get(0); + } + } + + private HashSet getOldPendingIntents() { + HashSet pendingIntents = new HashSet<>(); + HashMap data = getOldData(); + for (AlarmClockData alarmClockData : data.values()) { + pendingIntents.add(getPendingIntent(alarmClockData)); + } + return pendingIntents; + } + + private PendingIntent getPendingIntent(AlarmClockData alarmClock) { + Intent intent = new Intent(MainService.ALARMWAKEUP); + intent.putExtra("title", alarmClock.getTitle()); + intent.putExtra("id", alarmClock.getId()); + PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, alarmClock.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT); + return startPendingIntent; + } + + private long getTimestamp(String timeString) { + if (TextUtils.isEmpty(timeString)) { + return 0; + } + if (timeString.length() == 5) { + String[] timeSplit = timeString.split(":"); + int hour = Integer.parseInt(timeSplit[0]); + int minute = Integer.parseInt(timeSplit[1]); + Calendar c = Calendar.getInstance(); + c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), + c.get(Calendar.DAY_OF_MONTH), hour, minute, 0); + long mTimeInfo = c.getTimeInMillis(); + Log.e(TAG, "getTimestamp: " + mTimeInfo); + long actualTime = mTimeInfo > System.currentTimeMillis() ? mTimeInfo : mTimeInfo + ONE_DAY_TIME; + return actualTime; + } else { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + try { + Date date = simpleDateFormat.parse(timeString); + long timestamp = date.getTime(); + Log.e(TAG, "getTimestamp2: " + timestamp); + return timestamp; + } catch (ParseException e) { + return System.currentTimeMillis(); + } + } + } + + private long getZeroTiemstamp() { + //设置时区 + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + long zeroTime = calendar.getTimeInMillis(); + Log.e(TAG, "getZeroTiemstamp: " + zeroTime); + return zeroTime; + } + + /*一次性*/ + private static final int ONCE = 1; + /*每天*/ + private static final int LOOP = 2; + /*周一到周五*/ + private static final int WORKING_DAY = 3; + /*休息日*/ + private static final int OFF_DAY = 4; + + /** + * 设置闹钟 + * + * @param alarm + */ + public void setAlarm(AlarmClockData alarm) { + int id = alarm.getId(); + int type = alarm.getType(); + String timeString = alarm.getTime(); + String title = alarm.getTitle(); + Log.e(TAG, "setAlarm: " + title); + long timeStamp = getTimestamp(timeString); + Log.e(TAG, "setAlarm: " + timeStamp); + boolean finished = alarm.isFinished(); + String url = alarm.getVoice(); + String md5 = alarm.getVoice_md5(); + if (!TextUtils.isEmpty(url)) { + ariaDownload(url, md5); + } + switch (type) { + case ONCE: + if (!finished) { + if (timeStamp < System.currentTimeMillis()) { + Intent intent = new Intent(MainService.ALARMWAKEUP); + intent.putExtra("title", title); + intent.putExtra("id", id); + mContext.sendBroadcast(intent); + } else { + setOnceAlarm(MainService.ALARMWAKEUP, title, id, timeStamp); + } + } + break; + case LOOP: + setDayLoopAlarm(MainService.ALARMWAKEUP, title, id, timeStamp); + break; + case WORKING_DAY: + + break; + case OFF_DAY: + + break; + default: + } + } + + /** + * @param action + * @param requestCode + * @param timestamp 设置一次性闹钟 + */ + public void setOnceAlarm(String action, String extra, int requestCode, long timestamp) { + Intent intent = new Intent(action); + intent.putExtra("title", extra); + intent.putExtra("id", requestCode); + PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT); + pendingIntents.add(startPendingIntent); + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent); + Log.e(TAG, "setOnceAlarm: " + "id: " + requestCode + " title: " + extra + " timeString: " + timestamp); + } + + /** + * @param action + * @param requestCode + * @param timestamp 设置循环周期为一天的闹钟 + */ + public void setDayLoopAlarm(String action, String extra, int requestCode, long timestamp) { + setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_DAY, timestamp); + } + + /** + * @param action + * @param requestCode + * @param timestamp 设置循环周期为一小时的闹钟 + */ + public void setHourLoopAlarm(String action, String extra, int requestCode, long timestamp) { + setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_HOUR, timestamp); + } + + /** + * @param action + * @param requestCode + * @param intervalMillis + * @param timestamp 循环闹钟 + */ + public void setLoopAlarm(String action, String extra, int requestCode, long intervalMillis, long timestamp) { + Intent intent = new Intent(action); + intent.putExtra("title", extra); + intent.putExtra("id", requestCode); + PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT); + pendingIntents.add(startPendingIntent); + alarmManager.setWindow(AlarmManager.RTC_WAKEUP, timestamp, intervalMillis, startPendingIntent); + Log.e(TAG, "setLoopAlarm: " + "title: " + extra + " timeString: " + timestamp); + } + + public void setWorkDayAlarm(String action, String extra, int requestCode, long intervalMillis, long timestamp) { + Intent intent = new Intent(action); + intent.putExtra("title", extra); + intent.putExtra("id", requestCode); + PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT); + pendingIntents.add(startPendingIntent); + alarmManager.setWindow(AlarmManager.RTC_WAKEUP, timestamp, intervalMillis, startPendingIntent); + Log.e(TAG, "setLoopAlarm: " + "title: " + extra + " timeString: " + timestamp); + } + + public void setOffDayAlarm(String action, String extra, int requestCode, long intervalMillis, long timestamp) { + Intent intent = new Intent(action); + intent.putExtra("title", extra); + intent.putExtra("id", requestCode); + PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT); + pendingIntents.add(startPendingIntent); + alarmManager.setWindow(AlarmManager.RTC_WAKEUP, timestamp, intervalMillis, startPendingIntent); + Log.e(TAG, "setLoopAlarm: " + "title: " + extra + " timeString: " + timestamp); + } + + + public void ariaDownload(String url, String md5) { + String fileName = Utils.getFileNamefromURL(url); + File file = new File(Utils.getDownLoadPath(mContext) + fileName); + if (file.exists() && !file.isDirectory()) { + String fileMD5 = FileUtils.getFileMD5ToString(file); + Log.e("ariaDownload", "fileOnlineMD5=" + md5); + Log.e("ariaDownload", "fileMD5=" + fileMD5); + if (!md5.equals(fileMD5)) { + Aria.download(this) + .load(url) //读取下载地址 + .setFilePath(Utils.getDownLoadPath(mContext) + fileName) +// .ignoreFilePathOccupy() + .setExtendField(md5) + .create(); //启动下载} + } else { + Log.e("ariaDownload", "fileName = " + fileName + " exists"); + } + } else { + Aria.download(this) + .load(url) //读取下载地址 + .setFilePath(Utils.getDownLoadPath(mContext) + fileName) +// .ignoreFilePathOccupy() + .setExtendField(md5) + .create(); //启动下载} + } + } + + +} diff --git a/app/src/main/java/com/uiui/aios/base/BaseApplication.java b/app/src/main/java/com/uiui/aios/base/BaseApplication.java index 112c207..447c493 100644 --- a/app/src/main/java/com/uiui/aios/base/BaseApplication.java +++ b/app/src/main/java/com/uiui/aios/base/BaseApplication.java @@ -17,7 +17,7 @@ import com.tencent.mmkv.MMKV; import com.uiui.aios.BuildConfig; import com.uiui.aios.network.NetInterfaceManager; import com.uiui.aios.service.main.MainService; -import com.uiui.aios.utils.AlarmUtils; +import com.uiui.aios.alarm.AlarmUtils; import com.uiui.aios.manager.AmapManager; import com.uiui.aios.utils.AppUsedTimeUtils; import com.uiui.aios.utils.Utils; diff --git a/app/src/main/java/com/uiui/aios/bean/AlarmClockData.java b/app/src/main/java/com/uiui/aios/bean/AlarmClockData.java index 4b88b3c..dfe6d77 100644 --- a/app/src/main/java/com/uiui/aios/bean/AlarmClockData.java +++ b/app/src/main/java/com/uiui/aios/bean/AlarmClockData.java @@ -1,12 +1,20 @@ package com.uiui.aios.bean; +import android.text.TextUtils; +import android.util.Log; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.gson.Gson; import com.google.gson.JsonParser; +import com.uiui.aios.alarm.AlarmUtils; import java.io.Serializable; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; public class AlarmClockData implements Serializable { private static final long serialVersionUID = -5856502480745183157L; @@ -103,6 +111,34 @@ public class AlarmClockData implements Serializable { this.is_onoff = is_onoff; } + public long getTimeStamp() { + if (TextUtils.isEmpty(time)) { + return 0L; + } + if (time.length() == 5) { + String[] timeSplit = time.split(":"); + int hour = Integer.parseInt(timeSplit[0]); + int minute = Integer.parseInt(timeSplit[1]); + Calendar c = Calendar.getInstance(); + c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), + c.get(Calendar.DAY_OF_MONTH), hour, minute, 0); + long mTimeInfo = c.getTimeInMillis(); + Log.e("AlarmClockData", "getTimeStamp: " + mTimeInfo); + long actualTime = mTimeInfo > System.currentTimeMillis() ? mTimeInfo : mTimeInfo + AlarmUtils.ONE_DAY_TIME; + return actualTime; + } else { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date = simpleDateFormat.parse(time); + long timestamp = date.getTime(); + return timestamp; + } catch (ParseException e) { + return System.currentTimeMillis(); + } + } + } + + @NonNull @Override public String toString() { diff --git a/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java b/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java index 8952de9..1154565 100644 --- a/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java +++ b/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java @@ -49,7 +49,7 @@ import com.uiui.aios.adapter.SOSNnmberAdapter; import com.uiui.aios.bean.AlarmClockData; import com.uiui.aios.bean.AlarmItem; import com.uiui.aios.manager.AmapManager; -import com.uiui.aios.utils.AlarmUtils; +import com.uiui.aios.alarm.AlarmUtils; import com.uiui.aios.utils.ApkUtils; import com.uiui.aios.utils.AppUtil; import com.uiui.aios.utils.SchemeUtils; @@ -442,7 +442,10 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt String jsonString = mmkv.decodeString("AlarmClock", ""); if (!TextUtils.isEmpty(jsonString)) { List data = new ArrayList<>(); - data.add(AlarmUtils.getInstance().getRecentAlarmClock()); + AlarmClockData alarmClockData = AlarmUtils.getInstance().getRecentAlarmClock(); + if (alarmClockData!=null){ + data.add(alarmClockData); + } notificationAdapter.setDataList(data); rv_noti.setVisibility(View.VISIBLE); iv_note_nodata.setVisibility(View.GONE); diff --git a/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java b/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java index 8902ce0..3a15ed3 100644 --- a/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java +++ b/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java @@ -8,7 +8,7 @@ import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiui.aios.bean.AlarmClockData; import com.uiui.aios.bean.BaseResponse; import com.uiui.aios.network.NetInterfaceManager; -import com.uiui.aios.utils.AlarmUtils; +import com.uiui.aios.alarm.AlarmUtils; import java.util.List; diff --git a/app/src/main/java/com/uiui/aios/service/main/MainService.java b/app/src/main/java/com/uiui/aios/service/main/MainService.java index f40f5d0..57215c4 100644 --- a/app/src/main/java/com/uiui/aios/service/main/MainService.java +++ b/app/src/main/java/com/uiui/aios/service/main/MainService.java @@ -45,7 +45,6 @@ import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; - public class MainService extends BaseService implements MainSContact.MainSView, NetworkUtils.OnNetworkStatusChangedListener { private static final String TAG = MainService.class.getSimpleName(); @SuppressLint("StaticFieldLeak") diff --git a/app/src/main/java/com/uiui/aios/utils/AlarmUtils.java b/app/src/main/java/com/uiui/aios/utils/AlarmUtils.java deleted file mode 100644 index c656772..0000000 --- a/app/src/main/java/com/uiui/aios/utils/AlarmUtils.java +++ /dev/null @@ -1,315 +0,0 @@ -package com.uiui.aios.utils; - -import android.annotation.SuppressLint; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.text.TextUtils; -import android.util.Log; - -import com.arialyy.aria.core.Aria; -import com.blankj.utilcode.util.FileUtils; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.tencent.mmkv.MMKV; -import com.uiui.aios.bean.AlarmClockData; -import com.uiui.aios.service.main.MainService; - -import java.io.File; -import java.lang.reflect.Type; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; - -public class AlarmUtils { - @SuppressLint("StaticFieldLeak") - private static AlarmUtils sInstance; - private static String TAG = AlarmUtils.class.getSimpleName(); - private Context mContext; - private AlarmManager alarmManager; - private MMKV mmkv = MMKV.defaultMMKV(); - - - private AlarmUtils(Context context) { - this.mContext = context; - alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - } - - public static void init(Context context) { - if (sInstance == null) { - sInstance = new AlarmUtils(context); - } - } - - public static AlarmUtils getInstance() { - if (sInstance == null) { - throw new IllegalStateException("You must be init AmapManager first"); - } - return sInstance; - } - - private List alarmClockDataList; - private HashSet pendingIntents; - - public void setAlarmClockData(List data) { - this.alarmClockDataList = data; - if (pendingIntents == null) { - pendingIntents = getOldPendingIntents(); - } - for (PendingIntent pendingIntent : pendingIntents) { - alarmManager.cancel(pendingIntent); - } - List newData = mergeData(data); - for (AlarmClockData clockData : newData) { - setAlarm(clockData); - } - String jsonString = new Gson().toJson(newData); - Log.e(TAG, "setAlarmClockData: " + jsonString); - mmkv.encode("AlarmClock", jsonString); - } - - private List mergeData(List data) { - HashMap oldData = getOldData(); - List tempData = new ArrayList<>(); - for (AlarmClockData alarm : data) { - AlarmClockData oldAlarm = oldData.get(alarm.getId()); - if (oldAlarm == null) { - tempData.add(alarm); - } else { - if (oldAlarm.equals(alarm)) { - tempData.add(oldAlarm); - } else { - tempData.add(alarm); - } - } - } - return tempData; - } - - public void setAlarmString(List alarmClockData) { - String jsonString = new Gson().toJson(alarmClockData); - Log.e(TAG, "setAlarmString: " + jsonString); - mmkv.encode("AlarmClock", jsonString); - } - - public HashMap getOldData() { - String jsonString = mmkv.decodeString("AlarmClock", ""); - Log.e(TAG, "getOldPendingIntents: " + jsonString); - if (TextUtils.isEmpty(jsonString)) { - return new HashMap<>(); - } else { - Type type = new TypeToken>() { - }.getType(); - Gson gson = new Gson(); - List data = gson.fromJson(jsonString, type); - HashMap hashMap = new HashMap<>(); - for (AlarmClockData clockData : data) { - hashMap.put(clockData.getId(), clockData); - } - return hashMap; - } - } - - public List getOldDataList() { - String jsonString = mmkv.decodeString("AlarmClock", ""); - Log.e(TAG, "getOldPendingIntents: " + jsonString); - if (TextUtils.isEmpty(jsonString)) { - return new ArrayList<>(); - } else { - Type type = new TypeToken>() { - }.getType(); - Gson gson = new Gson(); - List data = gson.fromJson(jsonString, type); - return data; - } - } - - public AlarmClockData getRecentAlarmClock() { - List alarmClockData = getOldDataList(); - if (alarmClockData == null || alarmClockData.size() == 0) { - return null; - } else { - Collections.sort(alarmClockData, new Comparator() { - DateFormat df = new SimpleDateFormat("HH:mm"); - - @Override - public int compare(AlarmClockData o1, AlarmClockData o2) { - try { - return df.parse(o1.getTime()).compareTo(df.parse(o2.getTime())); - } catch (ParseException e) { - throw new IllegalArgumentException(e); - } - } - }); - return alarmClockData.get(0); - } - } - - private HashSet getOldPendingIntents() { - HashSet pendingIntents = new HashSet<>(); - HashMap data = getOldData(); - for (AlarmClockData alarmClockData : data.values()) { - pendingIntents.add(getPendingIntent(alarmClockData)); - } - return pendingIntents; - } - - private PendingIntent getPendingIntent(AlarmClockData alarmClock) { - Intent intent = new Intent(MainService.ALARMWAKEUP); - intent.putExtra("title", alarmClock.getTitle()); - intent.putExtra("id", alarmClock.getId()); - PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, alarmClock.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT); - return startPendingIntent; - } - - private long getTimestamp(String timeString) { - if (TextUtils.isEmpty(timeString)) { - return 0; - } - if (timeString.length() == 8) { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); - try { - Date date = simpleDateFormat.parse(timeString); - long timestamp = date.getTime() + getZeroTiemstamp(); - return timestamp; - } catch (ParseException e) { - return 0; - } - } else { - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - try { - Date date = simpleDateFormat.parse(timeString); - long timestamp = date.getTime(); - return timestamp; - } catch (ParseException e) { - return 0; - } - } - } - - private long getZeroTiemstamp() { - long nowTime = System.currentTimeMillis(); - long dayMillisecond = 60 * 60 * 24 * 1000; - long zeroTime = ((nowTime) / dayMillisecond) * dayMillisecond; - Log.e(TAG, "getZeroTiemstamp: " + zeroTime); - return zeroTime; - } - - private static final int ONCE = 1; - private static final int LOOP = 2; - - public void setAlarm(AlarmClockData alarm) { - int id = alarm.getId(); - int type = alarm.getType(); - String timeString = alarm.getTime(); - long timestamp = getTimestamp(timeString); - String title = alarm.getTitle(); - boolean finished = alarm.isFinished(); - String url = alarm.getVoice(); - String md5 = alarm.getVoice_md5(); - if (!TextUtils.isEmpty(url)) { - ariaDownload(url, md5); - } - if (type == ONCE) { - if (!finished) { - if (timestamp < System.currentTimeMillis()) { - Intent intent = new Intent(MainService.ALARMWAKEUP); - intent.putExtra("title", title); - intent.putExtra("id", id); - mContext.sendBroadcast(intent); - } else { - setOnceAlarm(MainService.ALARMWAKEUP, title, id, timestamp); - } - } - } else if (type == LOOP) { - setDayLoopAlarm(MainService.ALARMWAKEUP, title, id, timestamp); - } - } - - /** - * @param action - * @param requestCode - * @param timestamp 设置一次性闹钟 - */ - public void setOnceAlarm(String action, String extra, int requestCode, long timestamp) { - Intent intent = new Intent(action); - intent.putExtra("title", extra); - intent.putExtra("id", requestCode); - PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT); - pendingIntents.add(startPendingIntent); - alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent); - Log.e(TAG, "setOnceAlarm: " + "id: " + requestCode + " title: " + extra + " timeString: " + timestamp); - } - - /** - * @param action - * @param requestCode - * @param timestamp 设置循环周期为一天的闹钟 - */ - public void setDayLoopAlarm(String action, String extra, int requestCode, long timestamp) { - setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_DAY, timestamp); - } - - /** - * @param action - * @param requestCode - * @param timestamp 设置循环周期为一小时的闹钟 - */ - public void setHourLoopAlarm(String action, String extra, int requestCode, long timestamp) { - setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_HOUR, timestamp); - } - - /** - * @param action - * @param requestCode - * @param intervalMillis - * @param timestamp 循环闹钟 - */ - public void setLoopAlarm(String action, String extra, int requestCode, long intervalMillis, long timestamp) { - Intent intent = new Intent(action); - intent.putExtra("title", extra); - intent.putExtra("id", requestCode); - PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT); - pendingIntents.add(startPendingIntent); - alarmManager.setWindow(AlarmManager.RTC_WAKEUP, timestamp, intervalMillis, startPendingIntent); - Log.e(TAG, "setLoopAlarm: " + "title: " + extra + " timeString: " + timestamp); - } - - - public void ariaDownload(String url, String md5) { - String fileName = Utils.getFileNamefromURL(url); - File file = new File(Utils.getDownLoadPath(mContext) + fileName); - if (file.exists() && !file.isDirectory()) { - String fileMD5 = FileUtils.getFileMD5ToString(file); - Log.e("ariaDownload", "fileOnlineMD5=" + md5); - Log.e("ariaDownload", "fileMD5=" + fileMD5); - if (!md5.equals(fileMD5)) { - Aria.download(this) - .load(url) //读取下载地址 - .setFilePath(Utils.getDownLoadPath(mContext) + fileName) -// .ignoreFilePathOccupy() - .setExtendField(md5) - .create(); //启动下载} - } else { - Log.e("ariaDownload", "fileName = " + fileName + " exists"); - } - } else { - Aria.download(this) - .load(url) //读取下载地址 - .setFilePath(Utils.getDownLoadPath(mContext) + fileName) -// .ignoreFilePathOccupy() - .setExtendField(md5) - .create(); //启动下载} - } - } - - -} diff --git a/app/src/main/res/layout-land/fragment_custom.xml b/app/src/main/res/layout-land/fragment_custom.xml index 3d988dd..8fe7acf 100644 --- a/app/src/main/res/layout-land/fragment_custom.xml +++ b/app/src/main/res/layout-land/fragment_custom.xml @@ -102,15 +102,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - - @@ -122,9 +123,9 @@ + android:layout_height="match_parent" + app:radius="16dp" />