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" />