diff --git a/app/build.gradle b/app/build.gradle index c0c1be2..f402b98 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.uiui.aios" minSdkVersion 24 targetSdkVersion 29 - versionCode 21 - versionName "3.0" + versionCode 22 + versionName "3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 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 88d9729..fac2931 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 @@ -89,7 +89,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { mMainPresenter.setLifecycle(lifecycleSubject); if (BuildConfig.DEBUG) { - SystemClock.setCurrentTimeMillis(1662123600000L);//09-02 +// SystemClock.setCurrentTimeMillis(1662123600000L);//09-02 // SystemClock.setCurrentTimeMillis(1662210000000L);//09-03 } 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 237dc2d..c13e947 100644 --- a/app/src/main/java/com/uiui/aios/adapter/NotificationAdapter.java +++ b/app/src/main/java/com/uiui/aios/adapter/NotificationAdapter.java @@ -1,5 +1,7 @@ package com.uiui.aios.adapter; +import android.content.Context; +import android.content.Intent; import android.media.AudioAttributes; import android.media.MediaPlayer; import android.text.TextUtils; @@ -24,25 +26,44 @@ import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; public class NotificationAdapter extends RecyclerView.Adapter { + private Context mContext; private List dataList; + private OnClickListener mOnClickListener; public void setDataList(List data) { this.dataList = data; notifyDataSetChanged(); } + public void setOnClickListener(OnClickListener listener) { + this.mOnClickListener = listener; + } + + public interface OnClickListener { + void onClick(); + } + @NonNull @Override public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_notification, parent, false)); + mContext = parent.getContext(); + return new Holder(LayoutInflater.from(mContext).inflate(R.layout.item_notification, parent, false)); } @Override public void onBindViewHolder(@NonNull Holder holder, int position) { AlarmClockData alarmClockData = dataList.get(position); holder.tv_title.setText("提醒事件:" + alarmClockData.getTitle()); - holder.tv_time.setText("提醒时间:" + alarmClockData.getTime()); + holder.tv_time.setText(alarmClockData.getTime()); String voice = alarmClockData.getVoice(); + holder.root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mOnClickListener != null) { + mOnClickListener.onClick(); + } + } + }); if (TextUtils.isEmpty(voice)) { holder.cl_voice.setVisibility(View.GONE); } else { @@ -104,9 +125,11 @@ public class NotificationAdapter extends RecyclerView.Adapter 0; } + public void deleteAllAlarmClock() { + HashSet pendingIntents = getOldPendingIntents(); + Iterator pendingIntentIterator = pendingIntents.iterator(); + while (pendingIntentIterator.hasNext()) { + PendingIntent pendingIntent = pendingIntentIterator.next(); + alarmManager.cancel(pendingIntent); + pendingIntentIterator.remove(); + } + List alarmClockData = getAllAlarms(); + for (AlarmClockData data : alarmClockData) { + deleteAlarmClock(data.getId()); + } + } /** * 获取所有Alarm @@ -258,9 +272,15 @@ public class AlarmUtils { if (pendingIntents == null) { pendingIntents = getOldPendingIntents(); } - for (PendingIntent pendingIntent : pendingIntents) { + Iterator pendingIntentIterator = pendingIntents.iterator(); + while (pendingIntentIterator.hasNext()) { + PendingIntent pendingIntent = pendingIntentIterator.next(); alarmManager.cancel(pendingIntent); + pendingIntentIterator.remove(); } +// for (PendingIntent pendingIntent : pendingIntents) { +// +// } List newData = mergeData(data); for (AlarmClockData clockData : newData) { setAlarm(clockData); @@ -276,8 +296,10 @@ public class AlarmUtils { */ private List mergeData(List alarmClockDataList) { HashMap alarmClockDataMap = new HashMap<>(); - for (AlarmClockData alarmClockData : alarmClockDataList) { - alarmClockDataMap.put(alarmClockData.getId(), alarmClockData); + if (alarmClockDataList != null) { + for (AlarmClockData alarmClockData : alarmClockDataList) { + alarmClockDataMap.put(alarmClockData.getId(), alarmClockData); + } } HashMap oldData = getOldData(); List deleteData = new ArrayList<>(); @@ -291,6 +313,9 @@ public class AlarmUtils { } List newData = new ArrayList<>(); + if (alarmClockDataList == null) { + return newData; + } for (AlarmClockData alarm : alarmClockDataList) { AlarmClockData oldAlarm = oldData.get(alarm.getId()); if (oldAlarm == null) { @@ -403,12 +428,14 @@ public class AlarmUtils { 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); + int year = c.get(Calendar.YEAR); + int month = c.get(Calendar.MONTH); + int day = c.get(Calendar.DAY_OF_MONTH); + c.set(year, month, day, hour, minute, 0); long mTimeInfo = c.getTimeInMillis(); Log.e(TAG, "getTimestamp: " + mTimeInfo); - long actualTime = mTimeInfo > System.currentTimeMillis() ? mTimeInfo : mTimeInfo + ONE_DAY_TIME; - return actualTime; +// long actualTime = mTimeInfo > System.currentTimeMillis() ? mTimeInfo : mTimeInfo + ONE_DAY_TIME; + return mTimeInfo; } else { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); try { @@ -434,13 +461,13 @@ public class AlarmUtils { } /*一次性*/ - private static final int ONCE = 1; + public static final int ONCE = 1; /*每天*/ - private static final int LOOP = 2; + public static final int LOOP = 2; /*周一到周五*/ - private static final int WORKING_DAY = 3; + public static final int WORKING_DAY = 3; /*休息日*/ - private static final int OFF_DAY = 4; + public static final int OFF_DAY = 4; /** * 设置闹钟 @@ -475,13 +502,13 @@ public class AlarmUtils { } break; case LOOP: - setDayLoopAlarm(MainService.ALARMWAKEUP, title, id, timeStamp); + setDayLoopAlarm(MainService.ALARMWAKEUP, title, id, timeString); break; case WORKING_DAY: - + setWorkDayAlarm(MainService.ALARMWAKEUP, title, id, timeString); break; case OFF_DAY: - + setOffDayAlarm(MainService.ALARMWAKEUP, title, id, timeString); break; default: } @@ -498,17 +525,28 @@ public class AlarmUtils { 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); + alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent); Log.e(TAG, "setOnceAlarm: " + "id: " + requestCode + " title: " + extra + " timeString: " + timestamp); } /** * @param action * @param requestCode - * @param timestamp 设置循环周期为一天的闹钟 + * @param timeString 设置循环周期为一天的闹钟 */ - public void setDayLoopAlarm(String action, String extra, int requestCode, long timestamp) { - setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_DAY, timestamp); + public void setDayLoopAlarm(String action, String extra, int requestCode, String timeString) { + long timestamp = getTimestamp(timeString); + if (System.currentTimeMillis() > timestamp) { + timestamp += AlarmManager.INTERVAL_DAY; + } + 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.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent); + Log.e(TAG, "setDayLoopAlarm: " + "title: " + extra + " timeString: " + timestamp); +// setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_DAY, timestamp); } /** @@ -536,24 +574,49 @@ public class AlarmUtils { Log.e(TAG, "setLoopAlarm: " + "title: " + extra + " timeString: " + timestamp); } - public void setWorkDayAlarm(String action, String extra, int requestCode, long intervalMillis, long timestamp) { + public void setWorkDayAlarm(String action, String extra, int requestCode, String timeString) { + long timestamp = getTimestamp(timeString); + Calendar calendar = Calendar.getInstance(); + int day_of_week = calendar.get(Calendar.DAY_OF_WEEK) - 1; + switch (day_of_week) { + case 6: + case 7: + timestamp += (8 - day_of_week) * AlarmManager.INTERVAL_DAY; + break; + default: + } 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); + alarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent); + Log.e(TAG, "setWorkDayAlarm: " + "title: " + extra + " timeString: " + timestamp); } - public void setOffDayAlarm(String action, String extra, int requestCode, long intervalMillis, long timestamp) { + public void setOffDayAlarm(String action, String extra, int requestCode, String timeString) { + long timestamp = getTimestamp(timeString); + Calendar calendar = Calendar.getInstance(); + int day_of_week = calendar.get(Calendar.DAY_OF_WEEK) - 1; + switch (day_of_week) { + case 6: + if (System.currentTimeMillis() > timestamp) { + timestamp += AlarmManager.INTERVAL_DAY; + } + break; + case 7: + break; + default: + timestamp += (6 - day_of_week) * AlarmManager.INTERVAL_DAY; + break; + } 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); + alarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent); + Log.e(TAG, "setOffDayAlarm: " + "title: " + extra + " timeString: " + timestamp); } 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 3a2bdaf..c493612 100644 --- a/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java +++ b/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java @@ -311,6 +311,12 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt } }); notificationAdapter = new NotificationAdapter(); + notificationAdapter.setOnClickListener(new NotificationAdapter.OnClickListener() { + @Override + public void onClick() { + getAlarm(); + } + }); rv_noti.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -416,10 +422,21 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt getAlarmClock(); } + @Override + public void onStart() { + super.onStart(); + } + + @Override + public void onPause() { + super.onPause(); + } + @Override public void onResume() { super.onResume(); // setAlarm(); + getAlarmClock(); setSosNumber(); } @@ -506,6 +523,8 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt @Override public void setAlarmClockEmpty() { showNoData("温馨提示", "当前没有数据"); + rv_noti.setVisibility(View.GONE); + iv_note_nodata.setVisibility(View.VISIBLE); } @Override @@ -516,17 +535,33 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt } private void getAlarmClock() { - AlarmClockData alarmClockData = AlarmUtils.getInstance().getRecentAlarmClock(); - List data = new ArrayList<>(); - if (alarmClockData != null) { - data.add(alarmClockData); - notificationAdapter.setDataList(data); - rv_noti.setVisibility(View.VISIBLE); - iv_note_nodata.setVisibility(View.GONE); - } else { - rv_noti.setVisibility(View.GONE); - iv_note_nodata.setVisibility(View.VISIBLE); - } + NetInterfaceManager.getInstance().getAlarmClock(new NetInterfaceManager.AlarmClockCallback() { + @Override + public void setAlarmClock(List alarmClockList) { + AlarmClockData alarmClockData = AlarmUtils.getInstance().getRecentAlarmClock(); + List data = new ArrayList<>(); + if (alarmClockData != null) { + data.add(alarmClockData); + notificationAdapter.setDataList(data); + rv_noti.setVisibility(View.VISIBLE); + iv_note_nodata.setVisibility(View.GONE); + } else { + rv_noti.setVisibility(View.GONE); + iv_note_nodata.setVisibility(View.VISIBLE); + } + } + + @Override + public void setAlarmClockEmpty() { + rv_noti.setVisibility(View.GONE); + iv_note_nodata.setVisibility(View.VISIBLE); + } + + @Override + public void onError() { + + } + }); } private void showNoData(String title, String msg) { diff --git a/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java index 95886b7..f057f51 100644 --- a/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java @@ -646,15 +646,15 @@ public class NetInterfaceManager { } public void getAlarmClock(boolean refresh, BehaviorSubject lifecycle, AlarmClockCallback callback) { - ConnectMode connectMode = ConnectMode.ONE_MINUTE; - if (refresh) { - connectMode = ConnectMode.DEFAULT; - } - if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_ALARM_CLOCK, connectMode)) { - getAlarmClock(lifecycle, callback); - } else { - getAlarmClockCache(lifecycle, callback); - } +// ConnectMode connectMode = ConnectMode.DEFAULT; +// if (refresh) { +// connectMode = ConnectMode.DEFAULT; +// } +// if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_ALARM_CLOCK, connectMode)) { + getAlarmClock(lifecycle, callback); +// } else { +// getAlarmClockCache(lifecycle, callback); +// } } public void getAlarmClockCache(BehaviorSubject lifecycle, AlarmClockCallback callback) { 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 7dff0fa..669267d 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 @@ -57,34 +57,23 @@ public class MainSPresenter implements MainSContact.Presenter { @Override public void getAlarmClock() { - NetInterfaceManager.getInstance().getAlarmClockObservable() - .subscribe(new Observer>>() { - @Override - public void onSubscribe(Disposable d) { - Log.e("getAlarmClock", "onSubscribe: "); - } + NetInterfaceManager.getInstance().getAlarmClock(true, getLifecycle(), new NetInterfaceManager.AlarmClockCallback() { + @Override + public void setAlarmClock(List alarmClockList) { + AlarmUtils.getInstance().setAlarmClockData(alarmClockList); + } - @Override - public void onNext(BaseResponse> listBaseResponse) { - Log.e("getAlarmClock", "onNext: "+listBaseResponse); - if (listBaseResponse.code == 200) { - List data = listBaseResponse.data; - AlarmUtils.getInstance().setAlarmClockData(data); - } else { + @Override + public void setAlarmClockEmpty() { + AlarmUtils.getInstance().deleteAllAlarmClock(); + AlarmUtils.getInstance().setAlarmClockData(null); + } - } - } + @Override + public void onError() { - @Override - public void onError(Throwable e) { - Log.e("getAlarmClock", "onError: " + e.getMessage()); - onComplete(); - } + } + }); - @Override - public void onComplete() { - Log.e("getAlarmClock", "onComplete: "); - } - }); } } 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 57215c4..d00b6ae 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 @@ -17,6 +17,7 @@ import com.arialyy.aria.core.task.DownloadTask; import com.blankj.utilcode.util.NetworkUtils; import com.uiui.aios.BuildConfig; import com.uiui.aios.activity.NoticeActivity; +import com.uiui.aios.alarm.AlarmUtils; import com.uiui.aios.base.BaseService; import com.uiui.aios.bean.AlarmClockData; import com.uiui.aios.bean.BaseResponse; @@ -30,6 +31,8 @@ import com.uiui.aios.utils.Utils; import java.io.File; import java.io.FileNotFoundException; +import java.util.Calendar; +import java.util.HashMap; import java.util.List; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -131,12 +134,14 @@ public class MainService extends BaseService implements MainSContact.MainSView, private class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + Log.e(TAG, "onReceive: " + System.currentTimeMillis()); String action = intent.getAction(); if (TextUtils.isEmpty(action)) return; Log.e(TAG, "onReceive: " + action); String title = intent.getStringExtra("title"); int code = intent.getIntExtra("id", -1); Log.e(TAG, "onReceive: title = " + title); + setNextAlarm(code); if (ALARMWAKEUP.equals(action)) { Intent noticeIntent = new Intent(); noticeIntent.putExtra("id", code); @@ -147,6 +152,32 @@ public class MainService extends BaseService implements MainSContact.MainSView, } } + public void setNextAlarm(int code) { + HashMap clockDataHashMap = AlarmUtils.getInstance().getOldData(); + AlarmClockData alarmClockData = clockDataHashMap.get(code); + Log.e(TAG, "setNextAlarm: " + alarmClockData); + if (alarmClockData != null) { + Calendar calendar = Calendar.getInstance(); + int day_of_week = calendar.get(Calendar.DAY_OF_WEEK) - 1; + Log.e(TAG, "setNextAlarm: " + day_of_week); + switch (alarmClockData.getType()) { + case AlarmUtils.ONCE: + break; + case AlarmUtils.LOOP: + AlarmUtils.getInstance().setDayLoopAlarm(MainService.ALARMWAKEUP, alarmClockData.getTitle(), alarmClockData.getId(), alarmClockData.getTime()); + break; + case AlarmUtils.WORKING_DAY: + if (day_of_week < 5 || day_of_week == 7) { + AlarmUtils.getInstance().setDayLoopAlarm(MainService.ALARMWAKEUP, alarmClockData.getTitle(), alarmClockData.getId(), alarmClockData.getTime()); + } + break; + case AlarmUtils.OFF_DAY: + AlarmUtils.getInstance().setOffDayAlarm(MainService.ALARMWAKEUP, alarmClockData.getTitle(), alarmClockData.getId(), alarmClockData.getTime()); + default: + } + } + } + //监听时间和日期变化 public void registerTimeReceiver() { mTimeChangedReceiver = new TimeChangedReceiver(); @@ -173,7 +204,7 @@ public class MainService extends BaseService implements MainSContact.MainSView, Log.e(TAG, "TimeChangedReceiver:" + "timezone changed"); } else if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) { Log.e(TAG, "TimeChangedReceiver:" + "time tick"); - isScreenshot(); +// isScreenshot(); } } } @@ -189,7 +220,7 @@ public class MainService extends BaseService implements MainSContact.MainSView, String topPackageName = ForegroundAppUtil.getForegroundPackageName(MainService.this); Log.e(TAG, "isScreenshot: " + topPackageName); String pkg = AppUsedTimeUtils.getInstance().getAppPackageName(); - if (TextUtils.isEmpty(pkg)|| BuildConfig.APPLICATION_ID.equals(pkg)) { + if (TextUtils.isEmpty(pkg) || BuildConfig.APPLICATION_ID.equals(pkg)) { return; } diff --git a/app/src/main/res/drawable-hdpi/home_clinical_detection.png b/app/src/main/res/drawable-hdpi/home_clinical_detection.png index bffb8ee..3e60ede 100644 Binary files a/app/src/main/res/drawable-hdpi/home_clinical_detection.png and b/app/src/main/res/drawable-hdpi/home_clinical_detection.png differ diff --git a/app/src/main/res/layout-land/fragment_custom.xml b/app/src/main/res/layout-land/fragment_custom.xml index 8fe7acf..48a5a07 100644 --- a/app/src/main/res/layout-land/fragment_custom.xml +++ b/app/src/main/res/layout-land/fragment_custom.xml @@ -79,7 +79,7 @@ + android:background="@drawable/custom_background" + tools:ignore="NestedWeights"> - --> - + android:background="@drawable/custom_background"> + + @@ -48,8 +48,9 @@ android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dp_2" android:textColor="@color/white" - android:textSize="@dimen/sp_15" + android:textSize="@dimen/sp_12" app:layout_constraintEnd_toEndOf="@+id/iv" app:layout_constraintStart_toStartOf="@+id/iv" app:layout_constraintTop_toBottomOf="@+id/iv" /> diff --git a/app/src/main/res/layout/item_notification.xml b/app/src/main/res/layout/item_notification.xml index c30236e..d262ad6 100644 --- a/app/src/main/res/layout/item_notification.xml +++ b/app/src/main/res/layout/item_notification.xml @@ -6,10 +6,10 @@ android:layout_height="wrap_content"> @@ -29,11 +30,17 @@ android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dp" + android:background="@drawable/tv_background" + android:maxLines="1" + android:singleLine="true" android:text="提醒时间" - android:textColor="@color/black" - app:layout_constraintStart_toStartOf="@+id/tv_title" - app:layout_constraintTop_toBottomOf="@+id/tv_title" /> + android:layout_margin="@dimen/dp_4" + android:textColor="@color/white" + android:textSize="@dimen/sp_14" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" />