diff --git a/app/build.gradle b/app/build.gradle
index 770f2ff..61a7eea 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,8 +16,8 @@ android {
applicationId "com.uiuios.aios"
minSdkVersion 24
targetSdkVersion 29
- versionCode 23
- versionName "3.2"
+ versionCode 26
+ versionName "3.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -83,6 +83,15 @@ android {
v1SigningEnabled true
v2SigningEnabled true
}
+
+ G10P{
+ storeFile file("keystore/G10PMTK11.jks")
+ storePassword "123456"
+ keyAlias "G10PMTK11"
+ keyPassword "123456"
+ v1SigningEnabled true
+ v2SigningEnabled true
+ }
}
buildTypes {
@@ -98,6 +107,18 @@ android {
signingConfig signingConfigs.MTK8183
}
+ G10PDebug.initWith(debug)
+ G10PDebug {
+ versionNameSuffix "-debug"
+ debuggable true
+ signingConfig signingConfigs.G10P
+ }
+
+ G10PRelease.initWith(release)
+ G10PRelease {
+ signingConfig signingConfigs.G10P
+ }
+
zhanRuiRelease.initWith(release)
zhanRuiRelease {
signingConfig signingConfigs.zhanRui
@@ -228,7 +249,12 @@ dependencies {
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-core:1.0.16'
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-native:1.0.16'
//图片选择
- implementation 'io.github.lucksiege:pictureselector:v3.10.8'
+ implementation 'io.github.lucksiege:pictureselector:v3.11.1'
+// implementation 'io.github.lucksiege:pictureselector:v2.5.8'
+ //验证码输入
+// implementation 'com.jacktuotuo.customview:verificationcodeview:1.0.5'
+ implementation 'com.contrarywind:Android-PickerView:4.1.9'
+ implementation 'com.github.ForgetAll:LoadingDialog:v1.1.2'
}
preBuild {
diff --git a/app/keystore/G10PMTK11.jks b/app/keystore/G10PMTK11.jks
new file mode 100644
index 0000000..324fa31
Binary files /dev/null and b/app/keystore/G10PMTK11.jks differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b47a74a..6e049ad 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -109,7 +109,11 @@
android:name=".activity.contact.AddContactActivity"
android:launchMode="singleTask"
android:screenOrientation="userPortrait" />
-
+
+
+
-
+
+
oldData = AlarmUtils.getInstance().getOldData();
- alarmClockData = oldData.get(code);
- if (alarmClockData == null) {
+ mId = intent.getIntExtra("id", -1);
+
+ mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ mWakeLock = mPowerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "WakeAndLock");
+ mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+ mWakeLock.acquire(60 * 1000L);
+ long[] pattern = {1000, 5000, 1000, 5000};
+ mVibrator.vibrate(pattern, 0);
+ WakeUpUtils.wakeUpAndUnlockScreen(this);
+
+ mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_PLAY_SOUND);
+
+ mMediaPlayer = MediaPlayer.create(this, R.raw.ni);
+ // 开始播放
+ mMediaPlayer.start();
+
+ positive.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent noticeIntent = new Intent(NoticeActivity.this, NoticeInfoActivity.class);
+ noticeIntent.putExtra("id", mId);
+ startActivity(noticeIntent);
+
finish();
}
- Log.e(TAG, "onCreate: " + alarmClockData);
- jz_video.postDelayed(new Runnable() {
- @Override
- public void run() {
- showData(alarmClockData);
- }
- },1234);
- }
-
- }
-
- private void showData(AlarmClockData alarmClockData) {
- Log.e(TAG, "showData: " );
- audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_PLAY_SOUND);
- tv_title.setText(alarmClockData.getTitle());
- bt_ok.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- HashMap oldData = AlarmUtils.getInstance().getOldData();
- AlarmClockData alarm = oldData.get(code);
- if (alarm != null) {
- alarm.setFinished(true);
- AlarmUtils.getInstance().updateAlarmFinished(alarm);
- }
- NetInterfaceManager.getInstance()
- .getUpdateAlarmObservable(alarmClockData.getId())
- .subscribe(new Observer() {
- @Override
- public void onSubscribe(@NonNull Disposable d) {
- Log.e("showData", "onSubscribe: ");
- }
-
- @Override
- public void onNext(@NonNull BaseResponse baseResponse) {
- Log.e("showData", "onNext: " + baseResponse);
- }
-
- @Override
- public void onError(@NonNull Throwable e) {
- Log.e("showData", "onError: " + e.getMessage());
- onComplete();
- }
-
- @Override
- public void onComplete() {
- Log.e("showData", "onComplete: ");
- finish();
- }
- });
-
- }
});
- String voiceUrl = alarmClockData.getVoice();
- String voicemd5 = alarmClockData.getVoice_md5();
- String filePath = alarmClockData.getFile();
-
- if (!TextUtils.isEmpty(voiceUrl)) {
- cl_voice.setVisibility(View.VISIBLE);
- String fileName = Utils.getFileNamefromURL(voiceUrl);
- File file = new File(Utils.getDownLoadPath(NoticeActivity.this) + fileName);
- String fileMD5 = FileUtils.getFileMD5ToString(file);
-// if (!md5.equals(fileMD5)) {
-// // TODO: 2021/12/16
-// } else {
- mediaPlayer = new MediaPlayer();
- try {
- // 切歌之前先重置,释放掉之前的资源
- mediaPlayer.reset();
- FileInputStream fis = new FileInputStream(file);
- mediaPlayer.setDataSource(fis.getFD());
- // 设置播放源
-// mediaPlayer.setDataSource(file.getAbsolutePath());
- // 开始播放前的准备工作,加载多媒体资源,获取相关信息
- mediaPlayer.prepare();
- // 开始播放
- mediaPlayer.start();
- } catch (IOException e) {
- e.printStackTrace();
- Log.e(TAG, "showData: " + e.getMessage());
- }
-// }
- } else {
- cl_voice.setVisibility(View.GONE);
- }
- if (!TextUtils.isEmpty(filePath)) {
- cl_vp.setVisibility(View.VISIBLE);
- String fileType = FileUtil.getFileType(filePath);
- Log.e(TAG, "showData: " + fileType);
- if (FileUtil.isPictureFile(fileType)) {
- jz_video.setVisibility(View.GONE);
- imageView.setVisibility(View.VISIBLE);
- RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(this, 16F)));
- Glide.with(NoticeActivity.this).load(filePath).apply(options).into(imageView);
- } else if (FileUtil.isVideoFile(fileType)) {
- jz_video.setVisibility(View.VISIBLE);
- imageView.setVisibility(View.GONE);
- String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
- String realPath = Utils.getDownLoadPath(NoticeActivity.this) + fileName;
- File file = new File(realPath);
- JZDataSource jzDataSource;
- if (!file.exists()) {
- jzDataSource = new JZDataSource(filePath, "");
- Log.e(TAG, "showData: not exists");
- } else {
- Log.e(TAG, "showData: exists " + file);
- URI uri = file.toURI();
- jzDataSource = new JZDataSource(uri.toString(), "");
- }
- jzDataSource.looping = true;
- jz_video.setUp(jzDataSource, Jzvd.SCREEN_NORMAL);
- jz_video.startPreloading();
- jz_video.startVideoAfterPreloading();
- jz_video.startVideo();
-
- }
- } else {
- cl_vp.setVisibility(View.GONE);
- }
-
}
+
@Override
protected void onDestroy() {
- Log.e(TAG, "onDestroy: " );
super.onDestroy();
- if (mediaPlayer != null) {
- if (mediaPlayer.isPlaying()) {
- mediaPlayer.stop();
+ if (mMediaPlayer != null) {
+ if (mMediaPlayer.isPlaying()) {
+ mMediaPlayer.stop();
}
- mediaPlayer.release();
- mediaPlayer = null;
+ mMediaPlayer.release();
+ mMediaPlayer = null;
}
}
@Override
public void onBackPressed() {
- Log.e(TAG, "onDestroy: " );
if (Jzvd.backPress()) {
return;
}
@@ -240,9 +92,7 @@ public class NoticeActivity extends AppCompatActivity {
}
@Override
- protected void onStop() {
- Log.e(TAG, "onDestroy: " );
- super.onStop();
- Jzvd.releaseAllVideos();
+ protected void onPause() {
+ super.onPause();
}
}
diff --git a/app/src/main/java/com/uiuios/aios/activity/NoticeInfoActivity.java b/app/src/main/java/com/uiuios/aios/activity/NoticeInfoActivity.java
new file mode 100644
index 0000000..0b0ffb3
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/NoticeInfoActivity.java
@@ -0,0 +1,267 @@
+package com.uiuios.aios.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.os.PowerManager;
+import android.os.Vibrator;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.blankj.utilcode.util.FileUtils;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.bumptech.glide.request.RequestOptions;
+import com.uiuios.aios.R;
+import com.uiuios.aios.alarm.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmUtils;
+import com.uiuios.aios.bean.BaseResponse;
+import com.uiuios.aios.network.NetInterfaceManager;
+import com.uiuios.aios.utils.FileUtil;
+import com.uiuios.aios.utils.ScreenUtils;
+import com.uiuios.aios.utils.Utils;
+import com.uiuios.aios.utils.WakeUpUtils;
+import com.uiuios.aios.view.JzvdStdAssert;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashMap;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import cn.jzvd.JZDataSource;
+import cn.jzvd.Jzvd;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+
+public class NoticeInfoActivity extends AppCompatActivity {
+ private String TAG = NoticeInfoActivity.class.getSimpleName();
+
+ @BindView(R.id.tv_title)
+ TextView tv_title;
+ @BindView(R.id.bt_ok)
+ Button bt_ok;
+ @BindView(R.id.cl_voice)
+ ConstraintLayout cl_voice;
+ @BindView(R.id.cl_vp)
+ ConstraintLayout cl_vp;
+ @BindView(R.id.jz_video)
+ JzvdStdAssert jz_video;
+ @BindView(R.id.imageView)
+ ImageView imageView;
+
+ private AlarmClockData mAlarmClockData;
+ private int mId;
+ private MediaPlayer mMediaPlayer;
+ private PowerManager mPowerManager;
+ private PowerManager.WakeLock mWakeLock;
+ private AudioManager mAudioManager;
+
+ private Vibrator mVibrator;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_notice_info);
+ ButterKnife.bind(this);
+ Intent intent = getIntent();
+ mId = intent.getIntExtra("id", -1);
+
+ mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ mWakeLock = mPowerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "WakeAndLock");
+ mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+
+ mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_PLAY_SOUND);
+
+ mMediaPlayer = new MediaPlayer();
+
+ if (mId == -1) {
+ finish();
+ } else {
+ mWakeLock.acquire(60 * 1000L);
+ long[] pattern = {1000, 5000, 1000, 5000};
+ mVibrator.vibrate(pattern, 0);
+ WakeUpUtils.wakeUpAndUnlockScreen(this);
+
+ HashMap oldData = AlarmUtils.getInstance().getOldDataMap();
+ mAlarmClockData = oldData.get(mId);
+ if (mAlarmClockData == null) {
+ finish();
+ }
+ Log.e(TAG, "onCreate: " + mAlarmClockData);
+ showPic(mAlarmClockData);
+ jz_video.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ showData(mAlarmClockData);
+ }
+ }, 123);
+ }
+ }
+
+ private void showPic(AlarmClockData alarmClockData) {
+ tv_title.setText(alarmClockData.getTitle());
+ bt_ok.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ HashMap oldData = AlarmUtils.getInstance().getOldDataMap();
+ AlarmClockData alarm = oldData.get(mId);
+ if (alarm != null) {
+ alarm.setFinished(true);
+ AlarmUtils.getInstance().updateAlarmFinished(alarm);
+ }
+ NetInterfaceManager.getInstance()
+ .getUpdateAlarmObservable(alarmClockData.getId())
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("showData", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse baseResponse) {
+ Log.e("showData", "onNext: " + baseResponse);
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("showData", "onError: " + e.getMessage());
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("showData", "onComplete: ");
+ finish();
+ }
+ });
+
+ }
+ });
+ String voiceUrl = alarmClockData.getVoice();
+ String voicemd5 = alarmClockData.getVoice_md5();
+ if (!TextUtils.isEmpty(voiceUrl)) {
+ cl_voice.setVisibility(View.VISIBLE);
+ String fileName = Utils.getFileNamefromURL(voiceUrl);
+ File file = new File(Utils.getDownLoadPath(NoticeInfoActivity.this) + fileName);
+ String fileMD5 = FileUtils.getFileMD5ToString(file);
+// if (!md5.equals(fileMD5)) {
+// // TODO: 2021/12/16
+// } else {
+ try {
+ // 切歌之前先重置,释放掉之前的资源
+ mMediaPlayer.reset();
+ FileInputStream fis = new FileInputStream(file);
+ mMediaPlayer.setDataSource(fis.getFD());
+ // 设置播放源
+// mediaPlayer.setDataSource(file.getAbsolutePath());
+ // 开始播放前的准备工作,加载多媒体资源,获取相关信息
+ mMediaPlayer.prepare();
+ // 开始播放
+ mMediaPlayer.start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ Log.e(TAG, "showData: " + e.getMessage());
+ }
+// }
+ } else {
+ cl_voice.setVisibility(View.GONE);
+ }
+ String filePath = alarmClockData.getFile();
+ RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(this, 16F)));
+ String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
+ String realPath = Utils.getDownLoadPath(NoticeInfoActivity.this) + fileName;
+ File file = new File(realPath);
+ if (file.exists()){
+ Glide.with(NoticeInfoActivity.this).load(file).apply(options).error(R.drawable.icon_nodata).into(imageView);
+ }else {
+ Glide.with(NoticeInfoActivity.this).load(filePath).apply(options).error(R.drawable.icon_nodata).into(imageView);
+ }
+ }
+
+
+ private void showData(AlarmClockData alarmClockData) {
+ String filePath = alarmClockData.getFile();
+ if (!TextUtils.isEmpty(filePath)) {
+ cl_vp.setVisibility(View.VISIBLE);
+ String fileType = FileUtil.getFileType(filePath);
+ Log.e(TAG, "showData: " + fileType);
+ if (FileUtil.isPictureFile(fileType)) {
+ jz_video.setVisibility(View.GONE);
+ imageView.setVisibility(View.VISIBLE);
+ RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(this, 16F)));
+ String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
+ String realPath = Utils.getDownLoadPath(NoticeInfoActivity.this) + fileName;
+ File file = new File(realPath);
+ if (file.exists()){
+ Glide.with(NoticeInfoActivity.this).load(file).apply(options).error(R.drawable.icon_nodata).into(imageView);
+ }else {
+ Glide.with(NoticeInfoActivity.this).load(filePath).apply(options).error(R.drawable.icon_nodata).into(imageView);
+ }
+ } else if (FileUtil.isVideoFile(fileType)) {
+ jz_video.setVisibility(View.VISIBLE);
+ imageView.setVisibility(View.GONE);
+ String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
+ String realPath = Utils.getDownLoadPath(NoticeInfoActivity.this) + fileName;
+ File file = new File(realPath);
+ JZDataSource jzDataSource;
+ if (!file.exists()) {
+ jzDataSource = new JZDataSource(filePath, "");
+ Log.e(TAG, "showData: not exists");
+ } else {
+ Log.e(TAG, "showData: exists " + file);
+ URI uri = file.toURI();
+ jzDataSource = new JZDataSource(uri.toString(), "");
+ }
+ jzDataSource.looping = true;
+ jz_video.setUp(jzDataSource, Jzvd.SCREEN_NORMAL);
+ jz_video.startPreloading();
+ jz_video.startVideoAfterPreloading();
+ jz_video.startVideo();
+ }
+ } else {
+ cl_vp.setVisibility(View.GONE);
+ }
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mMediaPlayer != null) {
+ if (mMediaPlayer.isPlaying()) {
+ mMediaPlayer.stop();
+ }
+ mMediaPlayer.release();
+ mMediaPlayer = null;
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (Jzvd.backPress()) {
+ return;
+ }
+ super.onBackPressed();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ Jzvd.releaseAllVideos();
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockActivity.java
index a94005d..813fe6d 100644
--- a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockActivity.java
+++ b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockActivity.java
@@ -8,31 +8,48 @@ import android.util.Log;
import android.view.View;
import android.widget.ImageView;
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import com.trello.rxlifecycle4.RxLifecycle;
+import com.trello.rxlifecycle4.android.ActivityEvent;
import com.uiuios.aios.R;
-import com.uiuios.aios.adapter.AlarmAdapter;
-import com.uiuios.aios.base.BaseActivity;
-import com.uiuios.aios.bean.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmAdapter;
+import com.uiuios.aios.alarm.AlarmUtils;
+import com.uiuios.aios.base.BaseLightLifecycleActivity;
+import com.uiuios.aios.alarm.AlarmClockData;
+import com.uiuios.aios.bean.BaseResponse;
+import com.uiuios.aios.dialog.DeleteDialog;
+import com.uiuios.aios.network.NetInterfaceManager;
import com.uiuios.aios.push.PushManager;
-import com.uiuios.aios.push.tpush.MessageReceiver;
import com.uiuios.aios.utils.ToastUtil;
+import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
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;
-public class AlarmClockActivity extends BaseActivity implements AlarmClockContact.ClockView {
+public class AlarmClockActivity extends BaseLightLifecycleActivity implements AlarmClockContact.ClockView {
private static final String TAG = AlarmClockActivity.class.getSimpleName();
- @BindView(R.id.rv_goods)
+ @BindView(R.id.recyclerView)
RecyclerView recyclerView;
@BindView(R.id.iv_back)
ImageView iv_back;
-
+ @BindView(R.id.swipeRefreshLayout)
+ SwipeRefreshLayout swipeRefreshLayout;
+ @BindView(R.id.fab)
+ FloatingActionButton fab;
+ @BindView(R.id.cl_nodata)
+ ConstraintLayout cl_nodata;
private AlarmClockPresenter mPresenter;
private AlarmAdapter mAlarmAdapter;
@@ -44,12 +61,22 @@ public class AlarmClockActivity extends BaseActivity implements AlarmClockContac
@Override
public void initView() {
+ UltimateBarX.statusBarOnly(this)
+ .colorRes(R.color.default_blue)
+ .fitWindow(true)
+ .apply();
ButterKnife.bind(this);
mPresenter = new AlarmClockPresenter(this);
mPresenter.attachView(this);
mPresenter.setLifecycle(lifecycleSubject);
mAlarmAdapter = new AlarmAdapter();
+ mAlarmAdapter.setOnLongClickListener(new AlarmAdapter.OnLongClickListener() {
+ @Override
+ public void onLongClick(AlarmClockData alarmClockData) {
+ showDialog(alarmClockData);
+ }
+ });
recyclerView.setLayoutManager(new LinearLayoutManager(AlarmClockActivity.this));
recyclerView.setAdapter(mAlarmAdapter);
iv_back.setOnClickListener(new View.OnClickListener() {
@@ -58,27 +85,106 @@ public class AlarmClockActivity extends BaseActivity implements AlarmClockContac
finish();
}
});
+ swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ mPresenter.getAlarmClock();
+ }
+ });
+ fab.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ startActivity(new Intent(AlarmClockActivity.this, AlarmClockAddActivity.class));
+ }
+ });
+ }
+
+ private void showDialog(AlarmClockData alarmClockData) {
+ DeleteDialog dialog = new DeleteDialog(this);
+ dialog.setTitle("提醒")
+ .setMessage("是否要删除本次闹钟")
+ .setPositive("确定")
+ .setNegtive("取消")
+ .setOnClickBottomListener(new DeleteDialog.OnClickBottomListener() {
+ @Override
+ public void onPositiveClick() {
+ deleteAlarm(alarmClockData);
+ dialog.dismiss();
+ }
+
+ @Override
+ public void onNegtiveClick() {
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ }
+
+ private void deleteAlarm(AlarmClockData alarmClockData) {
+ if (alarmClockData.isIs_local()) {
+ alarmClockData.setDeleted(true);
+ AlarmUtils.getInstance().deleteAlarmClock(alarmClockData);
+ } else {
+ NetInterfaceManager.getInstance().deleteAlarmClockObservable(alarmClockData.getId())
+ .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY))
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("deleteAlarm", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse baseResponse) {
+ Log.e("deleteAlarm", "onNext: " + baseResponse);
+ if (baseResponse.code == 200) {
+ AlarmUtils.getInstance().deleteAlarmClock(alarmClockData);
+ ToastUtil.show("删除成功");
+ } else {
+ ToastUtil.show("删除失败:" + baseResponse.msg);
+ }
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("deleteAlarm", "onError: " + e.getMessage());
+ alarmClockData.setDeleted(true);
+ AlarmUtils.getInstance().updateAlarmClock(alarmClockData);
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("deleteAlarm", "onComplete: ");
+ mPresenter.getAlarmClock();
+ }
+ });
+ }
}
@Override
public void initData() {
registerAlarmClockReceiver();
- mPresenter.getAlarmClock();
}
@Override
public void showAlarmClock(List alarmClockData) {
mAlarmAdapter.setAlarmClockData(alarmClockData);
+ swipeRefreshLayout.setRefreshing(false);
+ cl_nodata.setVisibility(View.GONE);
+ recyclerView.setVisibility(View.VISIBLE);
}
@Override
public void setAlarmClockEmpty() {
mAlarmAdapter.setAlarmClockData(null);
+ swipeRefreshLayout.setRefreshing(false);
+ cl_nodata.setVisibility(View.VISIBLE);
+ recyclerView.setVisibility(View.GONE);
}
@Override
public void onError() {
- ToastUtil.show("服务器连接失败,检查网络连接");
+ swipeRefreshLayout.setRefreshing(false);
}
@Override
@@ -90,6 +196,12 @@ public class AlarmClockActivity extends BaseActivity implements AlarmClockContac
}
}
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mPresenter.getAlarmClock();
+ }
+
private void registerAlarmClockReceiver() {
if (null == mAlarmClockReceiver) {
mAlarmClockReceiver = new AlarmClockReceiver();
diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockAddActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockAddActivity.java
new file mode 100644
index 0000000..3d36d25
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockAddActivity.java
@@ -0,0 +1,495 @@
+package com.uiuios.aios.activity.alarm;
+
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.bumptech.glide.request.RequestOptions;
+import com.luck.picture.lib.basic.PictureSelector;
+import com.luck.picture.lib.config.SelectMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.interfaces.OnResultCallbackListener;
+import com.shehuan.niv.NiceImageView;
+import com.trello.rxlifecycle4.RxLifecycle;
+import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.uiuios.aios.alarm.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmUtils;
+import com.uiuios.aios.base.GlideEngine;
+import com.uiuios.aios.bean.AlarmClockId;
+import com.uiuios.aios.bean.BaseResponse;
+import com.uiuios.aios.network.NetInterfaceManager;
+import com.uiuios.aios.utils.FFmpegUtils;
+import com.uiuios.aios.utils.FileUtil;
+import com.uiuios.aios.utils.ScreenUtil;
+import com.uiuios.aios.utils.TimeUtils;
+import com.uiuios.aios.utils.ToastUtil;
+import com.uiuios.aios.utils.Utils;
+import com.uiuios.aios.R;
+import com.uiuios.aios.alarm.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmUtils;
+import com.uiuios.aios.base.BaseLifecycleActivity;
+import com.uiuios.aios.base.GlideEngine;
+import com.uiuios.aios.bean.AlarmClockId;
+import com.uiuios.aios.bean.BaseResponse;
+import com.uiuios.aios.network.NetInterfaceManager;
+import com.uiuios.aios.utils.FileUtil;
+import com.uiuios.aios.utils.ToastUtil;
+import com.uiuios.aios.utils.Utils;
+import com.xiasuhuei321.loadingdialog.view.LoadingDialog;
+import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.RequestBody;
+
+public class AlarmClockAddActivity extends BaseLifecycleActivity {
+ private static final String TAG = AlarmClockAddActivity.class.getSimpleName();
+
+ @BindView(R.id.cl_content)
+ ConstraintLayout cl_content;
+ @BindView(R.id.ll_type)
+ LinearLayout ll_type;
+ @BindView(R.id.cl_type)
+ ConstraintLayout cl_type;
+ @BindView(R.id.tv_type)
+ TextView tv_type;
+ @BindView(R.id.cl_pic)
+ ConstraintLayout cl_pic;
+ @BindView(R.id.et_activation)
+ EditText et_activation;
+ @BindView(R.id.nv_pic)
+ NiceImageView nv_pic;
+ @BindView(R.id.iv_back)
+ ImageView iv_back;
+ @BindView(R.id.bt_confirm)
+ Button bt_confirm;
+ @BindView(R.id.bt_cancel)
+ Button bt_cancel;
+ @BindView(R.id.tv_duration)
+ TextView tv_duration;
+
+ @BindView(R.id.rb1)
+ RadioButton rb1;
+ @BindView(R.id.rb2)
+ RadioButton rb2;
+ @BindView(R.id.rb3)
+ RadioButton rb3;
+ @BindView(R.id.rb4)
+ RadioButton rb4;
+
+ private PopupWindow mPopupWindow;
+
+ private TimePickerView pvTime;
+ private String mPictrueFilePath;
+ private Date mDate;
+ /*类型 1一次性 2每天 3周一到周五 4周六周日*/
+ private int mType = 1;
+
+ @Override
+ public int getLayoutId() {
+ return R.layout.activity_add_alarm_clock;
+ }
+
+ @Override
+ public void initView() {
+ lifecycleSubject.onNext(ActivityEvent.CREATE);
+ UltimateBarX.statusBarOnly(this)
+ .colorRes(R.color.default_blue)
+ .fitWindow(true)
+ .apply();
+
+ ButterKnife.bind(this);
+ initTimePicker();
+
+
+ rb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb1.setTextColor(colorStateList);
+ mType = 1;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb1.setTextColor(colorStateList);
+ }
+ }
+ });
+ rb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb2.setTextColor(colorStateList);
+ mType = 2;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb2.setTextColor(colorStateList);
+ }
+ }
+ });
+ rb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb3.setTextColor(colorStateList);
+ mType = 3;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb3.setTextColor(colorStateList);
+ }
+ }
+ });
+ rb4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb4.setTextColor(colorStateList);
+ mType = 4;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb4.setTextColor(colorStateList);
+ }
+ }
+ });
+
+ rb1.setChecked(true);
+
+ cl_pic.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ openSelector();
+ }
+ });
+ cl_type.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+// showTimeFilterWindow();
+ }
+ });
+ nv_pic.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ openSelector();
+ }
+ });
+ bt_confirm.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ checkContent();
+ }
+ });
+ bt_cancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ finish();
+ }
+ });
+ iv_back.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ finish();
+ }
+ });
+ }
+
+ @Override
+ public void initData() {
+
+ }
+
+ private void showTimeFilterWindow() {
+ if (mPopupWindow == null) {
+ View view = getLayoutInflater().inflate(R.layout.window_menu, null);
+ TextView tvMenuOne = view.findViewById(R.id.tv_menuOne);
+ TextView tvMenuTwo = view.findViewById(R.id.tv_menuTwo);
+ TextView tvMenuThree = view.findViewById(R.id.tv_menuThree);
+ TextView tvMenuFour = view.findViewById(R.id.tv_menuFour);
+ mPopupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
+ mPopupWindow.setOutsideTouchable(true);
+ tvMenuOne.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 1;
+ tv_type.setText("只响一次");
+ mPopupWindow.dismiss();
+ }
+ });
+ tvMenuTwo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 2;
+ tv_type.setText("每天");
+ mPopupWindow.dismiss();
+ }
+ });
+ tvMenuThree.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 3;
+ tv_type.setText("周一至周五");
+ mPopupWindow.dismiss();
+ }
+ });
+ tvMenuFour.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 4;
+ tv_type.setText("周六至周日");
+ mPopupWindow.dismiss();
+ }
+ });
+ }
+ if (mPopupWindow.isShowing()) {
+ mPopupWindow.dismiss();
+ } else {
+ Log.e(TAG, "showTimeFilterWindow: right " + tv_type.getRight());
+ Log.e(TAG, "showTimeFilterWindow: top " + tv_type.getTop());
+ Log.e(TAG, "showTimeFilterWindow: right " + cl_type.getRight());
+ Log.e(TAG, "showTimeFilterWindow: top " + cl_type.getTop());
+ mPopupWindow.showAtLocation(cl_type, Gravity.END, 20, 0);
+ }
+ }
+
+ LoadingDialog mLoadingDialog;
+
+ private void checkContent() {
+
+ pvTime.returnData();
+ if (TextUtils.isEmpty(et_activation.getText())) {
+ ToastUtil.show("请输入标题");
+ return;
+ }
+ if (TextUtils.isEmpty(mPictrueFilePath)) {
+ ToastUtil.show("请选择图片");
+ return;
+ }
+ String timeStamp = getTime(mDate);
+ Log.e(TAG, "checkContent: " + timeStamp);
+ Log.e(TAG, "checkContent: " + mPictrueFilePath);
+// Uri uri = Uri.parse(pictrueFilePath);
+// File picFile = FileUtil.uriToFile(uri, AlarmClockAddActivity.this);
+ File picFile = new File(mPictrueFilePath);
+ MediaType mediaType = MediaType.Companion.parse("image/png");
+ RequestBody requestBody = RequestBody.Companion.create(picFile, mediaType);
+ MultipartBody.Part body = MultipartBody.Part.createFormData("file", picFile.getName(), requestBody);
+ AlarmClockData alarmClockData = new AlarmClockData();
+ alarmClockData.setFile(mPictrueFilePath);
+ alarmClockData.setType(mType);
+ alarmClockData.setTime(timeStamp);
+ alarmClockData.setTitle(et_activation.getText().toString());
+ alarmClockData.setRemind_type(0);
+ alarmClockData.setIs_onoff(1);
+
+ Map params = new HashMap<>();
+ params.put("sn", Utils.getSerial());
+ params.put("time", timeStamp);
+ params.put("type", String.valueOf(mType));
+ params.put("title", et_activation.getText().toString());
+ params.put("remind_type", "0");
+ params.put("is_onoff", "1");
+
+ mLoadingDialog = new LoadingDialog(this);
+ mLoadingDialog.setLoadingText("正在上传")
+ .setSuccessText("添加成功")
+ .setFailedText("添加失败")
+ .setInterceptBack(true)
+ .setLoadSpeed(LoadingDialog.Speed.SPEED_ONE)
+ .closeSuccessAnim()
+ .show();
+
+ NetInterfaceManager.getInstance().getAlarmClockAddObservable(params, body)
+ .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("checkContent", "onSubscribe: ");
+ bt_confirm.setEnabled(false);
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse baseResponse) {
+ Log.e("checkContent", "onNext: " + baseResponse);
+ if (baseResponse.code == 200) {
+ ToastUtil.show("添加成功");
+// int id = baseResponse.data.getId();
+// alarmClockData.setId(id);
+// AlarmUtils.getInstance().addAlarmClock(alarmClockData);
+ mLoadingDialog.loadSuccess();
+ mLoadingDialog.close();
+ finish();
+ } else {
+ ToastUtil.show("添加失败:" + baseResponse.msg);
+ bt_confirm.setEnabled(true);
+ mLoadingDialog.loadFailed();
+ }
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("checkContent", "onError: " + e.getMessage());
+ ToastUtil.show("已保存到本地");
+ ToastUtil.show("添加成功");
+ ThreadLocalRandom random = ThreadLocalRandom.current();
+ int fakeId = random.nextInt(Integer.MAX_VALUE);
+ Log.e(TAG, "onError: fakeId = " + fakeId);
+ alarmClockData.setId(fakeId);
+ alarmClockData.setIs_local(true);
+ Log.e(TAG, "onError: addAlarmClock = " + AlarmUtils.getInstance().addAlarmClock(alarmClockData));
+
+ onComplete();
+ finish();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("checkContent", "onComplete: ");
+ mLoadingDialog.close();
+ bt_confirm.setEnabled(true);
+ }
+ });
+ }
+
+ private void openSelector() {
+ PictureSelector.create(AlarmClockAddActivity.this)
+ .openGallery(SelectMimeType.ofAll())
+ .setSelectionMode(1)
+ .setImageEngine(GlideEngine.createGlideEngine())
+ .forResult(new OnResultCallbackListener() {
+ @Override
+ public void onResult(ArrayList result) {
+ mPictrueFilePath = result.get(0).getRealPath();
+ File file = new File(mPictrueFilePath);
+ if (file.exists()) {
+ RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtil.dip2px(AlarmClockAddActivity.this, 8F)));
+ Glide.with(nv_pic).load(file).apply(options).into(nv_pic);
+ nv_pic.setVisibility(View.VISIBLE);
+ cl_pic.setVisibility(View.GONE);
+ if (FileUtil.isVideoFile(mPictrueFilePath)) {
+ FFmpegUtils.getDurationInMilliseconds(mPictrueFilePath, new Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("openSelector", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull Integer integer) {
+ Log.e("openSelector", "onNext: " + integer);
+ tv_duration.setText(TimeUtils.secToTime(integer));
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("openSelector", "onError: " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("openSelector", "onComplete: ");
+ }
+ });
+ } else {
+ tv_duration.setText("");
+ }
+ } else {
+ mPictrueFilePath = "";
+ nv_pic.setVisibility(View.GONE);
+ cl_pic.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onCancel() {
+ Log.e(TAG, "onCancel: ");
+ }
+ });
+ }
+
+ private void initTimePicker() {
+ //控制时间范围(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释)
+ //因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
+ Calendar selectedDate = Calendar.getInstance();
+
+ Calendar startDate = Calendar.getInstance();
+ startDate.set(2013, 0, 23);
+
+ Calendar endDate = Calendar.getInstance();
+ endDate.set(2019, 11, 28);
+
+ //时间选择器
+ pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
+ @Override
+ public void onTimeSelect(Date date, View v) {//选中事件回调
+ // 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null
+ /*btn_Time.setText(getTime(date));*/
+ mDate = date;
+ Log.e(TAG, "onTimeSelect: " + getTime(date));
+ }
+ })
+ .setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() {
+ @Override
+ public void customLayout(View v) {
+
+ }
+ })
+ .setType(new boolean[]{false, false, false, true, true, false})
+ .setLabel("", "", "", "时", "分", "") //设置空字符串以隐藏单位提示 hide label
+ .setDividerColor(Color.GRAY)
+ .setContentTextSize(30)
+ .setDate(selectedDate)
+ .setRangDate(startDate, selectedDate)
+ .setDecorView(cl_content)//非dialog模式下,设置ViewGroup, pickerView将会添加到这个ViewGroup中
+ .setOutSideColor(0x00000000)
+ .setOutSideCancelable(false)
+ .build();
+ pvTime.setKeyBackCancelable(false);//系统返回键监听屏蔽掉
+ pvTime.show(cl_content, false);//弹出时间选择器,传递参数过去,回调的时候则可以绑定此view
+
+ }
+
+ private String getTime(Date date) {
+ SimpleDateFormat format;
+ if (mType == 1) {
+ format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ } else {
+ format = new SimpleDateFormat("HH:mm");
+ }
+ return format.format(date);
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockContact.java b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockContact.java
index 08998f7..d4c911d 100644
--- a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockContact.java
+++ b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockContact.java
@@ -2,7 +2,7 @@ package com.uiuios.aios.activity.alarm;
import com.uiuios.aios.base.BasePresenter;
import com.uiuios.aios.base.BaseView;
-import com.uiuios.aios.bean.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmClockData;
import java.util.List;
diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockEditActivity.java b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockEditActivity.java
new file mode 100644
index 0000000..ce35f5d
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockEditActivity.java
@@ -0,0 +1,675 @@
+package com.uiuios.aios.activity.alarm;
+
+import android.content.Intent;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.CheckResult;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.bumptech.glide.request.RequestOptions;
+import com.luck.picture.lib.basic.PictureSelector;
+import com.luck.picture.lib.config.SelectMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.interfaces.OnResultCallbackListener;
+import com.shehuan.niv.NiceImageView;
+import com.trello.rxlifecycle4.LifecycleProvider;
+import com.trello.rxlifecycle4.LifecycleTransformer;
+import com.trello.rxlifecycle4.RxLifecycle;
+import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
+import com.uiuios.aios.R;
+import com.uiuios.aios.alarm.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmUtils;
+import com.uiuios.aios.base.GlideEngine;
+import com.uiuios.aios.bean.BaseResponse;
+import com.uiuios.aios.network.NetInterfaceManager;
+import com.uiuios.aios.utils.FFmpegUtils;
+import com.uiuios.aios.utils.FileUtil;
+import com.uiuios.aios.utils.GlideLoadUtils;
+import com.uiuios.aios.utils.ScreenUtil;
+import com.uiuios.aios.utils.TimeUtils;
+import com.uiuios.aios.utils.ToastUtil;
+import com.uiuios.aios.utils.Utils;
+import com.xiasuhuei321.loadingdialog.view.LoadingDialog;
+import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.RequestBody;
+
+public class AlarmClockEditActivity extends AppCompatActivity implements LifecycleProvider {
+
+ private static final String TAG = AlarmClockEditActivity.class.getSimpleName();
+ private final BehaviorSubject lifecycleSubject = BehaviorSubject.create();
+
+
+ @BindView(R.id.cl_content)
+ ConstraintLayout cl_content;
+ @BindView(R.id.ll_type)
+ LinearLayout ll_type;
+ @BindView(R.id.cl_type)
+ ConstraintLayout cl_type;
+ @BindView(R.id.tv_type)
+ TextView tv_type;
+ @BindView(R.id.cl_pic)
+ ConstraintLayout cl_pic;
+ @BindView(R.id.et_activation)
+ EditText et_activation;
+ @BindView(R.id.nv_pic)
+ NiceImageView nv_pic;
+ @BindView(R.id.iv_back)
+ ImageView iv_back;
+ @BindView(R.id.bt_confirm)
+ Button bt_confirm;
+ @BindView(R.id.bt_cancel)
+ Button bt_cancel;
+ @BindView(R.id.tv_title)
+ TextView tv_title;
+ @BindView(R.id.tv_duration)
+ TextView tv_duration;
+
+ @BindView(R.id.rb1)
+ RadioButton rb1;
+ @BindView(R.id.rb2)
+ RadioButton rb2;
+ @BindView(R.id.rb3)
+ RadioButton rb3;
+ @BindView(R.id.rb4)
+ RadioButton rb4;
+
+ private PopupWindow mMenuPopupWindow;
+
+ private TimePickerView pvTime;
+ private String mPictrueFilePath;
+
+ private Date mDate;
+ /*类型 1一次性 2每天 3周一到周五 4周六周日*/
+ private int mType = 1;
+ private int mId;
+ private AlarmClockData mAlarmClockData;
+
+ @Override
+ @androidx.annotation.NonNull
+ @CheckResult
+ public final Observable lifecycle() {
+ return lifecycleSubject.hide();
+ }
+
+ @Override
+ @androidx.annotation.NonNull
+ @CheckResult
+ public final LifecycleTransformer bindUntilEvent(@androidx.annotation.NonNull ActivityEvent event) {
+ return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
+ }
+
+ @Override
+ @androidx.annotation.NonNull
+ @CheckResult
+ public final LifecycleTransformer bindToLifecycle() {
+ return RxLifecycleAndroid.bindActivity(lifecycleSubject);
+ }
+
+ @Override
+ @CallSuper
+ protected void onStart() {
+ super.onStart();
+ lifecycleSubject.onNext(ActivityEvent.START);
+ }
+
+ @Override
+ @CallSuper
+ protected void onResume() {
+ super.onResume();
+ lifecycleSubject.onNext(ActivityEvent.RESUME);
+ }
+
+ @Override
+ @CallSuper
+ protected void onPause() {
+ lifecycleSubject.onNext(ActivityEvent.PAUSE);
+ super.onPause();
+ }
+
+ @Override
+ @CallSuper
+ protected void onStop() {
+ lifecycleSubject.onNext(ActivityEvent.STOP);
+ super.onStop();
+ }
+
+ @Override
+ @CallSuper
+ protected void onDestroy() {
+ lifecycleSubject.onNext(ActivityEvent.DESTROY);
+ super.onDestroy();
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_add_alarm_clock);
+ lifecycleSubject.onNext(ActivityEvent.CREATE);
+ UltimateBarX.statusBarOnly(this)
+ .colorRes(R.color.default_blue)
+ .fitWindow(true)
+ .apply();
+ initView();
+ initData();
+ }
+
+ private void initView() {
+ ButterKnife.bind(this);
+ tv_title.setText("编辑闹钟");
+ initTimePicker();
+
+ cl_pic.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ openSelector();
+ }
+ });
+ cl_type.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+// showTimeFilterWindow();
+ }
+ });
+ nv_pic.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ openSelector();
+ }
+ });
+ bt_confirm.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ checkContent();
+ }
+ });
+ bt_cancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ finish();
+ }
+ });
+ iv_back.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ finish();
+ }
+ });
+ rb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb1.setTextColor(colorStateList);
+ mType = 1;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb1.setTextColor(colorStateList);
+ }
+ }
+ });
+ rb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb2.setTextColor(colorStateList);
+ mType = 2;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb2.setTextColor(colorStateList);
+ }
+ }
+ });
+ rb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb3.setTextColor(colorStateList);
+ mType = 3;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb3.setTextColor(colorStateList);
+ }
+ }
+ });
+ rb4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
+ if (b) {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.white);
+ rb4.setTextColor(colorStateList);
+ mType = 4;
+ } else {
+ ColorStateList colorStateList = getResources().getColorStateList(R.color.radio_botton_gray);
+ rb4.setTextColor(colorStateList);
+ }
+ }
+ });
+ }
+
+ private void initData() {
+ Intent intent = getIntent();
+ if (intent == null) {
+ ToastUtil.show("获取闹钟信息失败");
+ finish();
+ return;
+ }
+ mId = intent.getIntExtra("id", -1);
+ if (mId == -1) {
+ ToastUtil.show("获取闹钟信息失败");
+ finish();
+ return;
+ }
+ NetInterfaceManager.getInstance().getAlarmClockByIdObservable(mId)
+ .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getAlarmClockById", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse alarmClockDatabaseResponse) {
+ Log.e("getAlarmClockById", "onNext: " + alarmClockDatabaseResponse);
+ if (alarmClockDatabaseResponse.code == 200) {
+ AlarmClockData alarmClockData = alarmClockDatabaseResponse.data;
+ mAlarmClockData = alarmClockData;
+ setAlarmClockInfo(alarmClockData);
+ }
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("getAlarmClockById", "onError: " + e.getMessage());
+ HashMap oldData = AlarmUtils.getInstance().getOldDataMap();
+ mAlarmClockData = oldData.get(mId);
+ setAlarmClockInfo(mAlarmClockData);
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("getAlarmClockById", "onComplete: ");
+ }
+ });
+ }
+
+ private void setAlarmClockInfo(AlarmClockData alarmClockData) {
+ if (alarmClockData == null) {
+ ToastUtil.show("闹钟信息为空");
+ return;
+ }
+ Log.e(TAG, "setAlarmClockInfo: " + alarmClockData);
+ mType = alarmClockData.getType();
+ switch (mType) {
+ default:
+ case AlarmUtils.ONCE:
+ rb1.setChecked(true);
+ tv_type.setText("只响一次");
+ break;
+ case AlarmUtils.LOOP:
+ rb2.setChecked(true);
+ tv_type.setText("每天");
+ break;
+ case AlarmUtils.WORKING_DAY:
+ rb3.setChecked(true);
+ tv_type.setText("周一至周五");
+ break;
+ case AlarmUtils.OFF_DAY:
+ rb4.setChecked(true);
+ tv_type.setText("周六至周日");
+ break;
+ }
+ String time = alarmClockData.getTime();
+ Calendar date = getTime(time);
+ Calendar now = Calendar.getInstance();
+ date.set(now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, now.get(Calendar.DAY_OF_MONTH));
+ Log.e(TAG, "setAlarmClockInfo: " + date.getTimeInMillis());
+ pvTime.setDate(date);
+ String title = alarmClockData.getTitle();
+ et_activation.setText(title);
+ String fileUrl = alarmClockData.getFile();
+ mPictrueFilePath = fileUrl;
+ String fileName = Utils.getFileNamefromURL(fileUrl);
+ File file = new File(Utils.getDownLoadPath(AlarmClockEditActivity.this) + fileName);
+ if (TextUtils.isEmpty(fileUrl)) {
+ cl_pic.setVisibility(View.VISIBLE);
+ nv_pic.setVisibility(View.GONE);
+ } else {
+ if (file.exists() && !file.isDirectory()) {
+ GlideLoadUtils.getInstance().glideLoad(this, file, nv_pic);
+ } else {
+ GlideLoadUtils.getInstance().glideLoad(this, fileUrl, nv_pic);
+ }
+ cl_pic.setVisibility(View.GONE);
+ nv_pic.setVisibility(View.VISIBLE);
+ }
+ }
+
+ LoadingDialog mLoadingDialog;
+
+ private void checkContent() {
+ pvTime.returnData();
+ if (TextUtils.isEmpty(et_activation.getText())) {
+ ToastUtil.show("请输入标题");
+ return;
+ }
+ if (TextUtils.isEmpty(mPictrueFilePath)) {
+ ToastUtil.show("请重新选择图片");
+ return;
+ }
+ String timeStamp = getTime(mDate);
+ Log.e(TAG, "checkContent: " + timeStamp);
+ Log.e(TAG, "checkContent: " + mPictrueFilePath);
+// Uri uri = Uri.parse(pictrueFilePath);
+// File picFile = FileUtil.uriToFile(uri, AlarmClockAddActivity.this);
+ MultipartBody.Part body;
+ if (FileUtil.isLocalPath(mPictrueFilePath)) {
+ File picFile = new File(mPictrueFilePath);
+ MediaType mediaType = MediaType.Companion.parse("image/png");
+ RequestBody requestBody = RequestBody.Companion.create(picFile, mediaType);
+ body = MultipartBody.Part.createFormData("file", picFile.getName(), requestBody);
+ } else {
+ String fileName = Utils.getFileNamefromURL(mPictrueFilePath);
+ File picFile = new File(Utils.getDownLoadPath(this) + fileName);
+ MediaType mediaType = MediaType.Companion.parse("image/png");
+ RequestBody requestBody = RequestBody.Companion.create(picFile, mediaType);
+ body = MultipartBody.Part.createFormData("file", picFile.getName(), requestBody);
+ }
+
+ mAlarmClockData.setId(mId);
+ mAlarmClockData.setType(mType);
+ mAlarmClockData.setTime(timeStamp);
+ mAlarmClockData.setTitle(et_activation.getText().toString());
+ mAlarmClockData.setFile(mPictrueFilePath);
+ mAlarmClockData.setRemind_type(0);
+ mAlarmClockData.setIs_onoff(1);
+ mAlarmClockData.setFinished(false);
+
+
+ Map params = new HashMap<>();
+ params.put("sn", Utils.getSerial());
+ params.put("id", String.valueOf(mId));
+ params.put("type", String.valueOf(mType));
+ params.put("time", timeStamp);
+ params.put("title", et_activation.getText().toString());
+ params.put("remind_type", "0");
+ params.put("is_onoff", "1");
+
+ mLoadingDialog = new LoadingDialog(this);
+ mLoadingDialog.setLoadingText("正在上传")
+ .setSuccessText("编辑成功")
+ .setFailedText("编辑失败")
+ .setInterceptBack(true)
+ .setLoadSpeed(LoadingDialog.Speed.SPEED_ONE)
+ .closeSuccessAnim()
+ .show();
+
+ NetInterfaceManager.getInstance().getAlarmClockEditObservable(params, body)
+ .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY))
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("checkContent", "onSubscribe: ");
+ ToastUtil.show("正在上传");
+ bt_confirm.setEnabled(false);
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse baseResponse) {
+ Log.e("checkContent", "onNext: " + baseResponse);
+ if (baseResponse.code == 200) {
+ ToastUtil.show("编辑成功");
+ mLoadingDialog.loadSuccess();
+ mLoadingDialog.close();
+ mAlarmClockData.setEdited(false);
+ AlarmUtils.getInstance().updateAlarmClock(mAlarmClockData);
+ finish();
+ } else {
+ ToastUtil.show("编辑失败:" + baseResponse.msg);
+ mLoadingDialog.loadFailed();
+ }
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("checkContent", "onError: " + e.getMessage());
+ mAlarmClockData.setEdited(true);
+ AlarmUtils.getInstance().updateAlarmClock(mAlarmClockData);
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("checkContent", "onComplete: ");
+ bt_confirm.setEnabled(true);
+ finish();
+ mLoadingDialog.close();
+ }
+ });
+ }
+
+
+ private void showTimeFilterWindow() {
+ if (mMenuPopupWindow == null) {
+ View view = getLayoutInflater().inflate(R.layout.window_menu, null);
+ TextView tvMenuOne = view.findViewById(R.id.tv_menuOne);
+ TextView tvMenuTwo = view.findViewById(R.id.tv_menuTwo);
+ TextView tvMenuThree = view.findViewById(R.id.tv_menuThree);
+ TextView tvMenuFour = view.findViewById(R.id.tv_menuFour);
+ mMenuPopupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
+ mMenuPopupWindow.setOutsideTouchable(true);
+ tvMenuOne.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 1;
+ tv_type.setText("只响一次");
+ mMenuPopupWindow.dismiss();
+ }
+ });
+ tvMenuTwo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 2;
+ tv_type.setText("每天");
+ mMenuPopupWindow.dismiss();
+ }
+ });
+ tvMenuThree.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 3;
+ tv_type.setText("周一至周五");
+ mMenuPopupWindow.dismiss();
+ }
+ });
+ tvMenuFour.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mType = 4;
+ tv_type.setText("周六至周日");
+ mMenuPopupWindow.dismiss();
+ }
+ });
+ }
+ if (mMenuPopupWindow.isShowing()) {
+ mMenuPopupWindow.dismiss();
+ } else {
+ Log.e(TAG, "showTimeFilterWindow: right " + tv_type.getRight());
+ Log.e(TAG, "showTimeFilterWindow: top " + tv_type.getTop());
+ Log.e(TAG, "showTimeFilterWindow: right " + cl_type.getRight());
+ Log.e(TAG, "showTimeFilterWindow: top " + cl_type.getTop());
+ mMenuPopupWindow.showAtLocation(cl_type, Gravity.END, 20, 0);
+ }
+ }
+
+ private void openSelector() {
+ PictureSelector.create(AlarmClockEditActivity.this)
+ .openGallery(SelectMimeType.ofAll())
+ .setSelectionMode(1)
+ .setImageEngine(GlideEngine.createGlideEngine())
+ .forResult(new OnResultCallbackListener() {
+ @Override
+ public void onResult(ArrayList result) {
+ mPictrueFilePath = result.get(0).getRealPath();
+ File file = new File(mPictrueFilePath);
+ if (file.exists()) {
+ RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtil.dip2px(AlarmClockEditActivity.this, 8F)));
+ Glide.with(nv_pic).load(file).apply(options).into(nv_pic);
+ nv_pic.setVisibility(View.VISIBLE);
+ cl_pic.setVisibility(View.GONE);
+ if (FileUtil.isVideoFile(mPictrueFilePath)) {
+ FFmpegUtils.getDurationInMilliseconds(mPictrueFilePath, new Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("openSelector", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull Integer integer) {
+ Log.e("openSelector", "onNext: " + integer);
+ tv_duration.setText(TimeUtils.secToTime(integer));
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("openSelector", "onError: " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("openSelector", "onComplete: ");
+ }
+ });
+ } else {
+ tv_duration.setText("");
+ }
+ } else {
+ mPictrueFilePath = "";
+ nv_pic.setVisibility(View.GONE);
+ cl_pic.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onCancel() {
+ Log.e(TAG, "onCancel: ");
+ }
+ });
+ }
+
+ private void initTimePicker() {
+ //控制时间范围(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释)
+ //因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
+ Calendar selectedDate = Calendar.getInstance();
+
+ Calendar startDate = Calendar.getInstance();
+ startDate.set(2013, 0, 23);
+
+ Calendar endDate = Calendar.getInstance();
+ endDate.set(2019, 11, 28);
+
+ //时间选择器
+ pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
+ @Override
+ public void onTimeSelect(Date date, View v) {//选中事件回调
+ // 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null
+ /*btn_Time.setText(getTime(date));*/
+ mDate = date;
+ Log.e(TAG, "onTimeSelect: " + getTime(date));
+ }
+ })
+ .setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() {
+ @Override
+ public void customLayout(View v) {
+
+ }
+ })
+ .setType(new boolean[]{false, false, false, true, true, false})
+ .setLabel("", "", "", "时", "分", "") //设置空字符串以隐藏单位提示 hide label
+ .setDividerColor(Color.GRAY)
+ .setContentTextSize(30)
+ .setDate(selectedDate)
+ .setRangDate(startDate, selectedDate)
+ .setDecorView(cl_content)//非dialog模式下,设置ViewGroup, pickerView将会添加到这个ViewGroup中
+ .setOutSideColor(0x00000000)
+ .setOutSideCancelable(false)
+ .build();
+ pvTime.setKeyBackCancelable(false);//系统返回键监听屏蔽掉
+ pvTime.show(cl_content, false);//弹出时间选择器,传递参数过去,回调的时候则可以绑定此view
+
+ }
+
+ private String getTime(Date date) {
+ SimpleDateFormat format;
+ if (mType == 1) {
+ format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ } else {
+ format = new SimpleDateFormat("HH:mm");
+ }
+ return format.format(date);
+ }
+
+ private Calendar getTime(String timeString) {
+ SimpleDateFormat sdf;
+ Calendar calendar = Calendar.getInstance();
+ if (mType == 1) {
+ sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ } else {
+ sdf = new SimpleDateFormat("HH:mm");
+ }
+ try {
+ Date date = sdf.parse(timeString);
+ calendar.setTime(date);
+ return calendar;
+ } catch (Exception e) {
+ Log.e(TAG, "getTime: " + e.getMessage());
+ calendar.setTime(new Date());
+ return calendar;
+ }
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockPresenter.java b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockPresenter.java
index 5c5f00d..453d9fd 100644
--- a/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockPresenter.java
+++ b/app/src/main/java/com/uiuios/aios/activity/alarm/AlarmClockPresenter.java
@@ -5,7 +5,7 @@ import android.content.Context;
import androidx.annotation.NonNull;
import com.trello.rxlifecycle4.android.ActivityEvent;
-import com.uiuios.aios.bean.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmClockData;
import com.uiuios.aios.network.NetInterfaceManager;
import java.util.List;
diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java b/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java
index f6b948b..614aba3 100644
--- a/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java
+++ b/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java
@@ -11,9 +11,9 @@ import com.trello.rxlifecycle4.android.ActivityEvent;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.Contact;
import com.uiuios.aios.config.CommonConfig;
+import com.uiuios.aios.gson.GsonUtils;
import com.uiuios.aios.network.NetInterfaceManager;
import com.uiuios.aios.network.UrlAddress;
-import com.uiuios.aios.utils.GsonUtils;
import java.lang.reflect.Type;
import java.util.ArrayList;
@@ -68,7 +68,7 @@ public class ContactPresenter implements ContactContact.Presenter {
public void onNext(@NonNull BaseResponse> listBaseResponse) {
Log.e("getContactList", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) {
- mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJsonString(listBaseResponse.data));
+ mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(listBaseResponse.data));
mView.setContact(listBaseResponse.data);
} else {
mMMKV.putString(UrlAddress.GET_MAIL_LIST, "");
diff --git a/app/src/main/java/com/uiuios/aios/activity/records/RecordsActivity.java b/app/src/main/java/com/uiuios/aios/activity/records/RecordsActivity.java
index 6a8b888..e05c233 100644
--- a/app/src/main/java/com/uiuios/aios/activity/records/RecordsActivity.java
+++ b/app/src/main/java/com/uiuios/aios/activity/records/RecordsActivity.java
@@ -20,6 +20,7 @@ import com.uiuios.aios.R;
import com.uiuios.aios.activity.dialer.DialerActivity;
import com.uiuios.aios.adapter.CallRecordAdapter;
import com.uiuios.aios.bean.RecordsInfo;
+import com.uiuios.aios.dialog.DeleteDialog;
import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
import java.util.ArrayList;
@@ -75,15 +76,37 @@ public class RecordsActivity extends AppCompatActivity {
iv_clear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- for (RecordsInfo recordsInfo : dataList) {
- String queryString = "NUMBER=" + recordsInfo.getNumber();
- getContentResolver().delete(CallLog.Calls.CONTENT_URI, queryString, null);
- }
- getData();
+ showDialog();
}
});
}
+ private void showDialog() {
+ DeleteDialog dialog = new DeleteDialog(this);
+ dialog.setTitle("提醒")
+ .setMessage("清空全部通话记录")
+ .setPositive("确定")
+ .setNegtive("取消")
+// .setSingle(true)
+ .setOnClickBottomListener(new DeleteDialog.OnClickBottomListener() {
+ @Override
+ public void onPositiveClick() {
+ for (RecordsInfo recordsInfo : dataList) {
+ String queryString = "NUMBER=" + recordsInfo.getNumber();
+ getContentResolver().delete(CallLog.Calls.CONTENT_URI, queryString, null);
+ }
+ getData();
+ dialog.dismiss();
+ }
+
+ @Override
+ public void onNegtiveClick() {
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ }
+
@Override
protected void onResume() {
super.onResume();
diff --git a/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiContact.java b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiContact.java
new file mode 100644
index 0000000..80235df
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiContact.java
@@ -0,0 +1,18 @@
+package com.uiuios.aios.activity.wifi;
+
+import com.uiuios.aios.base.BasePresenter;
+import com.uiuios.aios.base.BaseView;
+import com.uiuios.aios.bean.WiFiInfo;
+
+import java.util.List;
+
+public class WiFiContact {
+ public interface Presenter extends BasePresenter {
+ void getWiFiList();
+ }
+
+ public interface WiFiView extends BaseView {
+ void setSavedWiFiList(List wiFiList);
+ void setAvailableWiFiList(List wiFiList);
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiManagerActivity.java b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiManagerActivity.java
new file mode 100644
index 0000000..355d0ed
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiManagerActivity.java
@@ -0,0 +1,147 @@
+package com.uiuios.aios.activity.wifi;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.uiuios.aios.R;
+import com.uiuios.aios.adapter.AvailableWiFiAdapter;
+import com.uiuios.aios.adapter.SavedWiFiAdapter;
+import com.uiuios.aios.base.BaseLightActivity;
+import com.uiuios.aios.bean.WiFiInfo;
+import com.uiuios.aios.utils.ToastUtil;
+import com.uiuios.aios.view.HorizontalItemDecoration;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class WiFiManagerActivity extends BaseLightActivity implements WiFiContact.WiFiView {
+
+
+ @BindView(R.id.iv_close)
+ ImageView iv_close;
+ @BindView(R.id.rv_saved)
+ RecyclerView rv_saved;
+ @BindView(R.id.rv_available)
+ RecyclerView rv_available;
+ @BindView(R.id.tv_refresh)
+ TextView tv_refresh;
+ @BindView(R.id.tv_refresh2)
+ TextView tv_refresh2;
+
+ private WiFiPresenter mPresenter;
+ private SavedWiFiAdapter mSavedWiFiAdapter;
+ private AvailableWiFiAdapter mAvailableWiFiAdapter;
+
+ @Override
+ public int getLayoutId() {
+ return R.layout.activity_wifi_manager;
+ }
+
+ @Override
+ public void initView() {
+ ButterKnife.bind(this);
+ mPresenter = new WiFiPresenter(this);
+ mPresenter.attachView(this);
+ mPresenter.setLifecycle(lifecycleSubject);
+
+ iv_close.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ finish();
+ }
+ });
+ tv_refresh.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mPresenter.getWiFiList();
+ }
+ });
+ tv_refresh2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mPresenter.getWiFiList();
+ }
+ });
+
+ mSavedWiFiAdapter = new SavedWiFiAdapter();
+ mAvailableWiFiAdapter = new AvailableWiFiAdapter();
+
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
+ rv_saved.setLayoutManager(linearLayoutManager);
+ rv_saved.addItemDecoration(new HorizontalItemDecoration(30, this));
+ rv_saved.setAdapter(mSavedWiFiAdapter);
+
+ LinearLayoutManager linearLayoutManager2 = new LinearLayoutManager(this);
+ linearLayoutManager2.setOrientation(LinearLayoutManager.VERTICAL);
+ rv_available.setLayoutManager(linearLayoutManager2);
+ rv_available.setAdapter(mAvailableWiFiAdapter);
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+ filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
+ filter.addAction("android.net.wifi.CONFIGURED_NETWORKS_CHANGE");
+ filter.addAction("android.net.wifi.LINK_CONFIGURATION_CHANGED");
+ filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
+ registerReceiver(broadcastReceiver, filter);
+
+
+ mPresenter.getWiFiList();
+ }
+
+ @Override
+ public void initData() {
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(broadcastReceiver);
+ }
+
+ private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action != null) {
+ switch (action) {
+ case ConnectivityManager.CONNECTIVITY_ACTION:
+ case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION:
+ case "android.net.wifi.CONFIGURED_NETWORKS_CHANGE":
+ case "android.net.wifi.LINK_CONFIGURATION_CHANGED":
+ case WifiManager.NETWORK_STATE_CHANGED_ACTION:
+ case WifiManager.SUPPLICANT_STATE_CHANGED_ACTION:
+ default:
+ mPresenter.getWiFiList();
+ break;
+ }
+ }
+ }
+ };
+
+
+ @Override
+ public void setSavedWiFiList(List wiFiList) {
+ ToastUtil.show("刷新成功");
+ mSavedWiFiAdapter.setResultList(wiFiList);
+ }
+
+ @Override
+ public void setAvailableWiFiList(List wiFiList) {
+ mAvailableWiFiAdapter.setResultList(wiFiList);
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiPresenter.java b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiPresenter.java
new file mode 100644
index 0000000..200da9b
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/activity/wifi/WiFiPresenter.java
@@ -0,0 +1,127 @@
+package com.uiuios.aios.activity.wifi;
+
+import android.content.Context;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+
+import androidx.annotation.NonNull;
+
+import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.uiuios.aios.bean.WiFiInfo;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+
+import static android.text.TextUtils.isEmpty;
+
+public class WiFiPresenter implements WiFiContact.Presenter {
+
+ private WiFiContact.WiFiView mView;
+ private Context mContext;
+
+ private BehaviorSubject lifecycle;
+
+ public void setLifecycle(BehaviorSubject lifecycle) {
+ this.lifecycle = lifecycle;
+ }
+
+ public BehaviorSubject getLifecycle() {
+ return lifecycle;
+ }
+
+ WiFiPresenter(Context context) {
+ this.mContext = context;
+ }
+
+ @Override
+ public void attachView(@NonNull WiFiContact.WiFiView view) {
+ this.mView = view;
+ }
+
+ @Override
+ public void detachView() {
+ this.mView = null;
+ }
+
+ @Override
+ public void getWiFiList() {
+ WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+ List wifiConfigurations = wifiManager.getConfiguredNetworks();
+ Map savedWifiConfiguration = new HashMap<>();
+ for (WifiConfiguration wifiConfiguration : wifiConfigurations) {
+ savedWifiConfiguration.put(wifiConfiguration.SSID.replaceAll("\"", ""), wifiConfiguration);
+ }
+ List scanResults = wifiManager.getScanResults();
+ List filterList = scanResults.stream().filter(scanResult -> !isEmpty(scanResult.SSID)).collect(Collectors.toList());
+ Map scanResultMap = new HashMap<>();
+ List savedList = new ArrayList<>();
+ List availableList = new ArrayList<>();
+
+ for (ScanResult scanResult : filterList) {
+ WiFiInfo wiFiInfo = new WiFiInfo();
+ wiFiInfo.setSSID(scanResult.SSID);
+ wiFiInfo.setBSSID(scanResult.BSSID);
+ wiFiInfo.setLevel(scanResult.level);
+// if (savedWifiConfiguration.get(scanResult.SSID) != null) {
+// //跳过已保存的
+// continue;
+// }
+ wiFiInfo.setAvailable(true);
+ wiFiInfo.setSaved(false);
+ scanResultMap.put(scanResult.SSID, wiFiInfo);
+ availableList.add(wiFiInfo);
+ }
+ WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+ for (Map.Entry wifiConfiguration : savedWifiConfiguration.entrySet()) {
+ WiFiInfo wiFiInfo = new WiFiInfo();
+ if (wifiInfo != null) {
+ if (wifiConfiguration.getValue().SSID.equals(wifiInfo.getSSID())) {
+ wiFiInfo.setConnected(true);
+ }
+ }
+ String ssid = wifiConfiguration.getValue().SSID.replaceAll("\"", "");
+ WiFiInfo wiFiInfo1 = scanResultMap.get(ssid);
+ if (wiFiInfo1 != null) {
+
+ wiFiInfo.setSSID(wiFiInfo1.getSSID());
+ wiFiInfo.setBSSID(wiFiInfo1.getBSSID());
+ wiFiInfo.setLevel(wiFiInfo1.getLevel());
+ wiFiInfo.setAvailable(true);
+ } else {
+ wiFiInfo.setSSID(wifiConfiguration.getValue().SSID.replaceAll("\"", ""));
+ wiFiInfo.setBSSID(wifiConfiguration.getValue().BSSID);
+ wiFiInfo.setAvailable(false);
+ }
+ wiFiInfo.setSaved(true);
+ savedList.add(wiFiInfo);
+ availableList.removeIf(new Predicate() {
+ @Override
+ public boolean test(WiFiInfo wiFiInfo) {
+ return wiFiInfo.getSSID().equals(ssid);
+ }
+ });
+ }
+ mView.setSavedWiFiList(savedList.stream().sorted(new Comparator() {
+ @Override
+ public int compare(WiFiInfo o1, WiFiInfo o2) {
+ if (o1.isAvailable()) {
+ return -1;
+ } else if (o2.isAvailable()) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ }).collect(Collectors.toList()));
+ mView.setAvailableWiFiList(availableList);
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/adapter/AvailableWiFiAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/AvailableWiFiAdapter.java
new file mode 100644
index 0000000..8cd0b3b
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/adapter/AvailableWiFiAdapter.java
@@ -0,0 +1,99 @@
+package com.uiuios.aios.adapter;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.uiuios.aios.R;
+import com.uiuios.aios.bean.WiFiInfo;
+import com.uiuios.aios.dialog.WifiDialog;
+import com.uiuios.aios.utils.WiFiUtils;
+
+import java.util.List;
+
+public class AvailableWiFiAdapter extends RecyclerView.Adapter {
+
+ private Context mContext;
+ private List mResultList;
+
+ public void setResultList(List list) {
+ this.mResultList = list;
+ notifyDataSetChanged();
+ }
+
+ @NonNull
+ @Override
+ public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ mContext = parent.getContext();
+ return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wifi_available, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull Holder holder, int position) {
+ WiFiInfo wiFiInfo = mResultList.get(position);
+ holder.tv_name.setText(wiFiInfo.getSSID());
+ if (wiFiInfo.isSaved()) {
+ if (wiFiInfo.isAvailable()) {
+ holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_saved));
+ } else {
+ holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_unavailable));
+ }
+ } else {
+ holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_available));
+ }
+ holder.root.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+// if (wiFiInfo.isSaved()) {
+//
+// } else {
+ showPassword(wiFiInfo.getSSID());
+// }
+ }
+ });
+ }
+
+ private void showPassword(String ssid) {
+ WifiDialog passwordDialog = new WifiDialog(mContext);
+ passwordDialog.setTitle(String.format(mContext.getString(R.string.connect_wifi_ssid), ssid));
+ passwordDialog.setOnClickBottomListener(new WifiDialog.OnClickBottomListener() {
+ @Override
+ public void onPositiveClick() {
+ WiFiUtils.addWiFiNetwork(ssid, passwordDialog.getPassword());
+ passwordDialog.dismiss();
+ }
+ });
+ passwordDialog.show();
+ passwordDialog.getWindow().setGravity(Gravity.CENTER);
+ passwordDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ passwordDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return mResultList == null ? 0 : mResultList.size();
+ }
+
+ class Holder extends RecyclerView.ViewHolder {
+ ImageView iv_icon;
+ TextView tv_name;
+ ConstraintLayout root;
+
+ public Holder(@NonNull View itemView) {
+ super(itemView);
+ iv_icon = itemView.findViewById(R.id.iv_icon);
+ tv_name = itemView.findViewById(R.id.tv_name);
+ root = itemView.findViewById(R.id.root);
+ }
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java
index 2618e0f..e4064b4 100644
--- a/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java
+++ b/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java
@@ -3,6 +3,7 @@ package com.uiuios.aios.adapter;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.provider.CallLog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -24,7 +25,7 @@ public class CallRecordAdapter extends RecyclerView.Adapter mRecordsInfoList;
- private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("HH:mm");
+ private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("HH:mm:ss");
public void setRecordsInfoList(List recordsInfoList) {
this.mRecordsInfoList = recordsInfoList;
@@ -43,6 +44,18 @@ public class CallRecordAdapter extends RecyclerView.Adapter() {
@Override
- public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
+ public void onSubscribe(@NonNull Disposable d) {
}
@Override
- public void onNext(@io.reactivex.rxjava3.annotations.NonNull Bitmap bitmap) {
+ public void onNext(@NonNull Bitmap bitmap) {
Glide.with(holder.iv_cover).load(bitmap).into(holder.iv_cover);
}
@Override
- public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
+ public void onError(@NonNull Throwable e) {
}
@@ -132,17 +131,17 @@ public class NotificationAdapter extends RecyclerView.Adapter() {
@Override
- public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
+ public void onSubscribe(@NonNull Disposable d) {
}
@Override
- public void onNext(@io.reactivex.rxjava3.annotations.NonNull Integer integer) {
+ public void onNext(@NonNull Integer integer) {
holder.tv_voice.setText(integer + "秒");
}
@Override
- public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
+ public void onError(@NonNull Throwable e) {
}
diff --git a/app/src/main/java/com/uiuios/aios/adapter/SavedWiFiAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/SavedWiFiAdapter.java
new file mode 100644
index 0000000..11cbea8
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/adapter/SavedWiFiAdapter.java
@@ -0,0 +1,155 @@
+package com.uiuios.aios.adapter;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.uiuios.aios.R;
+import com.uiuios.aios.bean.WiFiInfo;
+import com.uiuios.aios.dialog.DeleWifiDialog;
+import com.uiuios.aios.dialog.WifiDialog;
+import com.uiuios.aios.utils.WiFiUtils;
+
+import java.util.List;
+
+public class SavedWiFiAdapter extends RecyclerView.Adapter {
+
+ private Context mContext;
+ private List mResultList;
+
+ public void setResultList(List list) {
+ this.mResultList = list;
+ notifyDataSetChanged();
+ }
+
+ @NonNull
+ @Override
+ public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ mContext = parent.getContext();
+ return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_wifi_info, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull Holder holder, int position) {
+ WiFiInfo wiFiInfo = mResultList.get(position);
+ holder.tv_name.setText(wiFiInfo.getSSID());
+ if (wiFiInfo.isConnected()) {
+ holder.tv_connected.setVisibility(View.VISIBLE);
+ } else {
+ holder.tv_connected.setVisibility(View.GONE);
+ }
+ if (wiFiInfo.isSaved()) {
+ if (wiFiInfo.isAvailable()) {
+ holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_saved));
+ holder.tv_level.setText("信号:" + getWifiLevelText(wiFiInfo.getLevel()) + "(" + wiFiInfo.getLevel() + "dBm)");
+ holder.tv_level.setVisibility(View.VISIBLE);
+ } else {
+ holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_unavailable));
+ holder.tv_level.setVisibility(View.GONE);
+ }
+ } else {
+ holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_wifi_available));
+ holder.tv_level.setText("信号:" + getWifiLevelText(wiFiInfo.getLevel()) + "(" + wiFiInfo.getLevel() + "dBm)");
+ holder.tv_level.setVisibility(View.VISIBLE);
+ }
+ holder.root.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+// if (wiFiInfo.isSaved()) {
+//
+// } else {
+ showPassword(wiFiInfo.getSSID());
+// }
+ }
+ });
+ holder.root.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ showRemoveDialog(wiFiInfo.getSSID(), position);
+ return false;
+ }
+ });
+ }
+
+ private void showRemoveDialog(String ssid, int position) {
+ DeleWifiDialog deleWifiDialog = new DeleWifiDialog(mContext);
+ deleWifiDialog.setTitle("提醒");
+ deleWifiDialog.setMessage(ssid);
+ deleWifiDialog.setOnClickBottomListener(new DeleWifiDialog.OnClickBottomListener() {
+ @Override
+ public void onPositiveClick() {
+ WiFiUtils.removeWiFiNetwork(ssid);
+ deleWifiDialog.dismiss();
+ mResultList.remove(position);
+ notifyDataSetChanged();
+ }
+ });
+ deleWifiDialog.show();
+ deleWifiDialog.getWindow().setGravity(Gravity.CENTER);
+ deleWifiDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ deleWifiDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ }
+
+ private static final int MIN_RSSI = -100;
+
+ private static final int MAX_RSSI = -55;
+
+ private String getWifiLevelText(int db) {
+ if (db < MIN_RSSI) {
+ return "微弱";
+ } else if (db < -88) {
+ return "一般";
+ } else if (db < -77) {
+ return "良好";
+ } else if (db < MAX_RSSI) {
+ return "极佳";
+ }
+ return "一般";
+ }
+
+ private void showPassword(String ssid) {
+ WifiDialog passwordDialog = new WifiDialog(mContext);
+ passwordDialog.setTitle(String.format(mContext.getString(R.string.connect_wifi_ssid), ssid));
+ passwordDialog.setOnClickBottomListener(new WifiDialog.OnClickBottomListener() {
+ @Override
+ public void onPositiveClick() {
+ WiFiUtils.addWiFiNetwork(ssid, passwordDialog.getPassword());
+ passwordDialog.dismiss();
+ }
+ });
+ passwordDialog.show();
+ passwordDialog.getWindow().setGravity(Gravity.CENTER);
+ passwordDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ passwordDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return mResultList == null ? 0 : mResultList.size();
+ }
+
+ class Holder extends RecyclerView.ViewHolder {
+ ImageView iv_icon;
+ TextView tv_name, tv_level, tv_connected;
+ ConstraintLayout root;
+
+ public Holder(@NonNull View itemView) {
+ super(itemView);
+ iv_icon = itemView.findViewById(R.id.iv_icon);
+ tv_name = itemView.findViewById(R.id.tv_name);
+ tv_level = itemView.findViewById(R.id.tv_level);
+ tv_connected = itemView.findViewById(R.id.tv_connected);
+ root = itemView.findViewById(R.id.root);
+ }
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/adapter/AlarmAdapter.java b/app/src/main/java/com/uiuios/aios/alarm/AlarmAdapter.java
similarity index 69%
rename from app/src/main/java/com/uiuios/aios/adapter/AlarmAdapter.java
rename to app/src/main/java/com/uiuios/aios/alarm/AlarmAdapter.java
index b510fa7..a7bbc89 100644
--- a/app/src/main/java/com/uiuios/aios/adapter/AlarmAdapter.java
+++ b/app/src/main/java/com/uiuios/aios/alarm/AlarmAdapter.java
@@ -1,5 +1,6 @@
-package com.uiuios.aios.adapter;
+package com.uiuios.aios.alarm;
+import android.content.Intent;
import android.graphics.Bitmap;
import android.media.AudioAttributes;
import android.media.MediaPlayer;
@@ -9,7 +10,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
-import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -21,7 +21,7 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.uiuios.aios.R;
-import com.uiuios.aios.bean.AlarmClockData;
+import com.uiuios.aios.activity.alarm.AlarmClockEditActivity;
import com.uiuios.aios.utils.FFmpegUtils;
import com.uiuios.aios.utils.ScreenUtils;
import com.uiuios.aios.utils.Utils;
@@ -42,12 +42,21 @@ public class AlarmAdapter extends RecyclerView.Adapter {
private FragmentActivity mContext;
private List mAlarmClockData;
+ private OnLongClickListener mOnLongClickListener;
public void setAlarmClockData(List alarmClockData) {
this.mAlarmClockData = alarmClockData;
notifyDataSetChanged();
}
+ public void setOnLongClickListener(OnLongClickListener onLongClickListener) {
+ this.mOnLongClickListener = onLongClickListener;
+ }
+
+ public interface OnLongClickListener {
+ void onLongClick(AlarmClockData alarmClockData);
+ }
+
@NonNull
@Override
public holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -59,7 +68,7 @@ public class AlarmAdapter extends RecyclerView.Adapter {
public void onBindViewHolder(@NonNull holder holder, int position) {
AlarmClockData alarmClockData = mAlarmClockData.get(position);
switch (alarmClockData.getType()) {
- case 1:
+ case AlarmUtils.ONCE:
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = sdf.parse(alarmClockData.getTime());
@@ -69,19 +78,23 @@ public class AlarmAdapter extends RecyclerView.Adapter {
} catch (ParseException e) {
e.printStackTrace();
}
- holder.tv_remind_type.setText("单次");
+ holder.tv_remind_type.setText("一次");
+ holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_once);
break;
- case 2:
+ case AlarmUtils.LOOP:
holder.tv_time.setText(alarmClockData.getTime());
- holder.tv_remind_type.setText("循环");
+ holder.tv_remind_type.setText("每天");
+ holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_loop);
break;
- case 3:
+ case AlarmUtils.WORKING_DAY:
holder.tv_time.setText(alarmClockData.getTime());
holder.tv_remind_type.setText("周一至周五");
+ holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_work);
break;
- case 4:
+ case AlarmUtils.OFF_DAY:
holder.tv_time.setText(alarmClockData.getTime());
holder.tv_remind_type.setText("周六至周日");
+ holder.tv_remind_type.setBackgroundResource(R.drawable.tv_times_bg_offday);
break;
default:
}
@@ -115,17 +128,17 @@ public class AlarmAdapter extends RecyclerView.Adapter {
mMediaPlayer.prepareAsync();
FFmpegUtils.getDurationInMilliseconds(voice, new Observer() {
@Override
- public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
+ public void onSubscribe(@NonNull Disposable d) {
}
@Override
- public void onNext(@io.reactivex.rxjava3.annotations.NonNull Integer integer) {
+ public void onNext(@NonNull Integer integer) {
holder.tv_voice.setText(integer + "秒");
}
@Override
- public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
+ public void onError(@NonNull Throwable e) {
}
@@ -141,48 +154,49 @@ public class AlarmAdapter extends RecyclerView.Adapter {
}
});
}
- String url = alarmClockData.getFile();
- String fileName = url.substring(url.lastIndexOf("/") + 1, url.length());
- String realPath = Utils.getDownLoadPath(mContext) + fileName;
- File file = new File(realPath);
- if (file.exists()) {
- holder.iv_finish.setVisibility(View.VISIBLE);
- }else {
- holder.iv_finish.setVisibility(View.GONE);
- }
- if (TextUtils.isEmpty(url)) {
+ String fileUrl = alarmClockData.getFile();
+ if (TextUtils.isEmpty(fileUrl)) {
holder.cl_vp.setVisibility(View.GONE);
} else {
holder.cl_vp.setVisibility(View.VISIBLE);
- if (isImgUrl(url)) {
- holder.iv_cover.setVisibility(View.VISIBLE);
+ if (isImgUrl(fileUrl)) {
+ holder.imageView.setVisibility(View.VISIBLE);
holder.jz_video.setVisibility(View.GONE);
if (!mContext.isDestroyed()) {
RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(mContext, 16F)));
- Glide.with(mContext).load(url).apply(options).into(holder.iv_cover);
+ Glide.with(mContext).load(fileUrl).apply(options).into(holder.imageView);
}
} else {
- holder.iv_cover.setVisibility(View.GONE);
+ holder.imageView.setVisibility(View.GONE);
holder.jz_video.setVisibility(View.VISIBLE);
- holder.jz_video.setUp(url, "");
+ String fileName = Utils.getFileNamefromURL(fileUrl);
+ File file = new File(Utils.getDownLoadPath(mContext) + fileName);
+ String path;
+ if (file.exists() && !file.isDirectory()) {
+ path = file.getAbsolutePath();
+ } else {
+ path = fileUrl;
+ }
+ holder.jz_video.setUp(path, "");
holder.jz_video.startButton.setImageDrawable(mContext.getDrawable(R.drawable.play));
- FFmpegUtils.loadVideoScreenshot(url, new Observer() {
+ FFmpegUtils.loadVideoScreenshot(path, new Observer() {
@Override
- public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
+ public void onSubscribe(@NonNull Disposable d) {
}
@Override
- public void onNext(@io.reactivex.rxjava3.annotations.NonNull Bitmap bitmap) {
+ public void onNext(@NonNull Bitmap bitmap) {
if (!mContext.isDestroyed()) {
RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(mContext, 16F)));
Glide.with(mContext).load(bitmap).apply(options).into(holder.jz_video.posterImageView);
+// Glide.with(mContext).load(bitmap).into(holder.imageView);
}
holder.jz_video.startButton.setImageDrawable(mContext.getDrawable(R.drawable.play));
}
@Override
- public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
+ public void onError(@NonNull Throwable e) {
}
@@ -194,7 +208,21 @@ public class AlarmAdapter extends RecyclerView.Adapter {
}
}
-
+ holder.root.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ mOnLongClickListener.onLongClick(alarmClockData);
+ return false;
+ }
+ });
+ holder.root.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(mContext, AlarmClockEditActivity.class);
+ intent.putExtra("id", alarmClockData.getId());
+ mContext.startActivity(intent);
+ }
+ });
}
@@ -214,10 +242,9 @@ public class AlarmAdapter extends RecyclerView.Adapter {
class holder extends RecyclerView.ViewHolder {
TextView tv_time, tv_remind_type, tv_title, tv_voice;
- ConstraintLayout cl_voice, cl_vp;
+ ConstraintLayout cl_voice, cl_vp, root;
JzvdStdRound jz_video;
- ImageView iv_cover, iv_finish;
- Switch switch1;
+ ImageView imageView;
public holder(@NonNull View itemView) {
super(itemView);
@@ -226,11 +253,11 @@ public class AlarmAdapter extends RecyclerView.Adapter {
tv_title = itemView.findViewById(R.id.tv_title);
tv_voice = itemView.findViewById(R.id.tv_voice);
cl_voice = itemView.findViewById(R.id.cl_voice);
- switch1 = itemView.findViewById(R.id.switch1);
cl_vp = itemView.findViewById(R.id.cl_vp);
+ root = itemView.findViewById(R.id.root);
jz_video = itemView.findViewById(R.id.jz_video);
- iv_cover = itemView.findViewById(R.id.iv_cover);
- iv_finish = itemView.findViewById(R.id.iv_finish);
+ imageView = itemView.findViewById(R.id.imageView);
}
}
}
+
diff --git a/app/src/main/java/com/uiuios/aios/bean/AlarmClockData.java b/app/src/main/java/com/uiuios/aios/alarm/AlarmClockData.java
similarity index 76%
rename from app/src/main/java/com/uiuios/aios/bean/AlarmClockData.java
rename to app/src/main/java/com/uiuios/aios/alarm/AlarmClockData.java
index cb503af..de26715 100644
--- a/app/src/main/java/com/uiuios/aios/bean/AlarmClockData.java
+++ b/app/src/main/java/com/uiuios/aios/alarm/AlarmClockData.java
@@ -1,4 +1,4 @@
-package com.uiuios.aios.bean;
+package com.uiuios.aios.alarm;
import android.text.TextUtils;
import android.util.Log;
@@ -8,13 +8,13 @@ import androidx.annotation.Nullable;
import com.google.gson.Gson;
import com.google.gson.JsonParser;
-import com.uiuios.aios.alarm.AlarmUtils;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
+import java.util.Objects;
public class AlarmClockData implements Serializable {
private static final long serialVersionUID = -5856502480745183157L;
@@ -26,10 +26,14 @@ public class AlarmClockData implements Serializable {
String voice;//语音文件地址
String voice_md5;
String file;//图片或视频文件地址
+ String file_md5;
int remind_type;
int is_onoff;//0关闭 1开启
boolean finished = false;
+ boolean is_local = false;
+ boolean edited = false;
+ boolean deleted = false;
public int getId() {
return id;
@@ -87,6 +91,14 @@ public class AlarmClockData implements Serializable {
this.file = file;
}
+ public String getFile_md5() {
+ return file_md5;
+ }
+
+ public void setFile_md5(String file_md5) {
+ this.file_md5 = file_md5;
+ }
+
public boolean isFinished() {
return finished;
}
@@ -111,6 +123,30 @@ public class AlarmClockData implements Serializable {
this.is_onoff = is_onoff;
}
+ public boolean isIs_local() {
+ return is_local;
+ }
+
+ public void setIs_local(boolean is_local) {
+ this.is_local = is_local;
+ }
+
+ public boolean isEdited() {
+ return edited;
+ }
+
+ public void setEdited(boolean edited) {
+ this.edited = edited;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
public long getTimeStamp() {
if (TextUtils.isEmpty(time)) {
return 0L;
@@ -151,11 +187,12 @@ public class AlarmClockData implements Serializable {
if (!(obj instanceof AlarmClockData)) return false;
if (id != ((AlarmClockData) obj).id) return false;
if (type != ((AlarmClockData) obj).type) return false;
- if (!time.equals(((AlarmClockData) obj).time)) return false;
- if (!title.equals(((AlarmClockData) obj).title)) return false;
- if (!voice.equals(((AlarmClockData) obj).voice)) return false;
- if (!voice_md5.equals(((AlarmClockData) obj).voice_md5)) return false;
- if (!file.equals(((AlarmClockData) obj).file)) return false;
+ if (!Objects.equals(time, ((AlarmClockData) obj).time)) return false;
+ if (!Objects.equals(title, ((AlarmClockData) obj).title)) return false;
+ if (!Objects.equals(voice, ((AlarmClockData) obj).voice)) return false;
+ if (!Objects.equals(voice_md5, ((AlarmClockData) obj).voice_md5)) return false;
+ if (!Objects.equals(file, ((AlarmClockData) obj).file)) return false;
+ if (!Objects.equals(file_md5, ((AlarmClockData) obj).file_md5)) return false;
if (remind_type != ((AlarmClockData) obj).remind_type) return false;
if (is_onoff != ((AlarmClockData) obj).is_onoff) return false;
diff --git a/app/src/main/java/com/uiuios/aios/alarm/AlarmOpenHelper.java b/app/src/main/java/com/uiuios/aios/alarm/AlarmOpenHelper.java
index ce0dd8f..7a26a6f 100644
--- a/app/src/main/java/com/uiuios/aios/alarm/AlarmOpenHelper.java
+++ b/app/src/main/java/com/uiuios/aios/alarm/AlarmOpenHelper.java
@@ -3,15 +3,15 @@ package com.uiuios.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 int DATABASE_VERSION = 2;
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 DATABASE_FILE_NAME = Environment.getExternalStorageDirectory().getPath() + File.separator + DATABASE_NAME;
+ public static final String DATABASE_FILE_NAME = File.separator + DATABASE_NAME;
public static final String TABLE_ALARM = " AlarmTable";
@@ -22,9 +22,15 @@ public class AlarmOpenHelper extends SQLiteOpenHelper {
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_FILE_MD5 = "file_md5";
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";
+ public static final String KEY_IS_LOCAL = "is_local";
+ public static final String KEY_EDITED = "edited";
+ public static final String KEY_DELETED = "deleted";
+
String CREATE_ALARM_TABLE = "CREATE TABLE IF NOT EXISTS" + TABLE_ALARM +
"("
@@ -35,9 +41,14 @@ public class AlarmOpenHelper extends SQLiteOpenHelper {
+ KEY_VOICE + " TEXT,"
+ KEY_VOICE_MD5 + " TEXT,"
+ KEY_FILE + " TEXT,"
+ + KEY_FILE_MD5 + " TEXT,"
+ KEY_REMIND_TYPE + " INTEGER,"
+ KEY_IS_ONOFF + " INTEGER,"
- + KEY_FINISHED + " BOOLEAN DEFAULT 0"
+
+ + KEY_FINISHED + " BOOLEAN DEFAULT 0,"
+ + KEY_IS_LOCAL + " BOOLEAN DEFAULT 0,"
+ + KEY_EDITED + " BOOLEAN DEFAULT 0,"
+ + KEY_DELETED + " BOOLEAN DEFAULT 0"
+ ")";
public AlarmOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
@@ -51,10 +62,16 @@ public class AlarmOpenHelper extends SQLiteOpenHelper {
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- if (oldVersion >= newVersion) {
- return;
+ switch (oldVersion + 1) {
+ case 1:
+ db.execSQL(CREATE_ALARM_TABLE); // 执行修改表,添加字段的逻辑。
+ case 2:
+ String sql = "ALTER TABLE " + TABLE_ALARM + " ADD COLUMN " + KEY_EDITED + " BOOLEAN DEFAULT 0";
+ db.execSQL(sql);
+ String sql2 = "ALTER TABLE " + TABLE_ALARM + " ADD COLUMN " + KEY_DELETED + " BOOLEAN DEFAULT 0";
+ db.execSQL(sql2);
+ String sql3 = "ALTER TABLE " + TABLE_ALARM + " ADD COLUMN " + KEY_FILE_MD5 + " TEXT";
+ db.execSQL(sql3);
}
- db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARM);
- onCreate(db);
}
}
diff --git a/app/src/main/java/com/uiuios/aios/alarm/AlarmUtils.java b/app/src/main/java/com/uiuios/aios/alarm/AlarmUtils.java
index 3ee4085..a9a87f8 100644
--- a/app/src/main/java/com/uiuios/aios/alarm/AlarmUtils.java
+++ b/app/src/main/java/com/uiuios/aios/alarm/AlarmUtils.java
@@ -13,8 +13,6 @@ import android.util.Log;
import com.arialyy.aria.core.Aria;
import com.blankj.utilcode.util.FileUtils;
-import com.bumptech.glide.Glide;
-import com.uiuios.aios.bean.AlarmClockData;
import com.uiuios.aios.service.main.MainService;
import com.uiuios.aios.utils.FileUtil;
import com.uiuios.aios.utils.Utils;
@@ -35,23 +33,33 @@ import java.util.Map;
import java.util.TimeZone;
public class AlarmUtils {
+ private static final String TAG = AlarmUtils.class.getSimpleName();
+
@SuppressLint("StaticFieldLeak")
private static AlarmUtils sInstance;
- private static String TAG = AlarmUtils.class.getSimpleName();
private Context mContext;
- private AlarmManager alarmManager;
- private SQLiteDatabase db;
+ private AlarmManager mAlarmManager;
+ private SQLiteDatabase mDatabase;
private AlarmOpenHelper mAlarmOpenHelper;
+ private HashSet pendingIntents;
public static final int ONE_DAY_TIME = 1000 * 60 * 60 * 24;
+ /*一次性*/
+ public static final int ONCE = 1;
+ /*每天*/
+ public static final int LOOP = 2;
+ /*周一到周五*/
+ public static final int WORKING_DAY = 3;
+ /*休息日*/
+ public static final int OFF_DAY = 4;
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);
+ this.mAlarmOpenHelper = new AlarmOpenHelper(context, mContext.getExternalCacheDir() + AlarmOpenHelper.DATABASE_FILE_NAME, null, AlarmOpenHelper.DATABASE_VERSION);
+ this.mDatabase = mAlarmOpenHelper.getWritableDatabase();
+ this.mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
}
public static void init(Context context) {
@@ -65,15 +73,35 @@ public class AlarmUtils {
public static AlarmUtils getInstance() {
if (sInstance == null) {
- throw new IllegalStateException("You must be init AmapManager first");
+ throw new IllegalStateException("You must be init AlarmUtils first");
}
return sInstance;
}
- private void open() {
- if (db == null || !db.isOpen()) {
- db = mAlarmOpenHelper.getWritableDatabase();
- }
+ private void openDatabase() {
+// if (mDatabase == null || !mDatabase.isOpen()) {
+// mDatabase = mAlarmOpenHelper.getWritableDatabase();
+// }
+ }
+
+ private ContentValues getValuesFromAlarmClock(AlarmClockData alarmClockData) {
+ 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_FILE_MD5, alarmClockData.getFile_md5());
+ 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());
+ values.put(AlarmOpenHelper.KEY_IS_LOCAL, alarmClockData.isIs_local());
+ values.put(AlarmOpenHelper.KEY_EDITED, alarmClockData.isEdited());
+ values.put(AlarmOpenHelper.KEY_DELETED, alarmClockData.isDeleted());
+ return values;
}
/**
@@ -83,27 +111,19 @@ public class AlarmUtils {
* @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());
+ openDatabase();
+ ContentValues values = getValuesFromAlarmClock(alarmClockData);
long id = 0;
- db.beginTransaction();
+ mDatabase.beginTransaction();
try {
- id = db.insert(AlarmOpenHelper.TABLE_ALARM, null, values);
+ id = mDatabase.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+ mDatabase.setTransactionSuccessful();
} catch (Exception e) {
- db.setTransactionSuccessful();
+ Log.e(TAG, "addAlarmClock: " + e.getMessage());
} finally {
- db.endTransaction();
+ mDatabase.endTransaction();
}
- db.close();
+ setAlarm(alarmClockData);
return id > 0;
}
@@ -115,28 +135,53 @@ public class AlarmUtils {
* @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());
+ openDatabase();
+ AlarmClockData old = getDatabaseSingleAlarm(alarmClockData);
+ if (old != null) {
+ PendingIntent pendingIntent = getPendingIntent(old);
+ if (pendingIntent != null) {
+ mAlarmManager.cancel(pendingIntent);
+ }
+ }
+ ContentValues values = getValuesFromAlarmClock(alarmClockData);
long id = 0;
- db.beginTransaction();
+ mDatabase.beginTransaction();
try {
- id = db.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, values, SQLiteDatabase.CONFLICT_REPLACE);
- db.setTransactionSuccessful();
+ id = mDatabase.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+ mDatabase.setTransactionSuccessful();
} catch (Exception e) {
Log.e(TAG, "updateAlarmClock: " + e.getMessage());
} finally {
- db.endTransaction();
+ mDatabase.endTransaction();
}
- db.close();
+ setAlarm(alarmClockData);
+ return id > 0;
+ }
+
+ public boolean updateAlarmClock(AlarmClockData alarmClockData, int newId) {
+ openDatabase();
+ int oldId = alarmClockData.getId();
+ AlarmClockData old = getDatabaseSingleAlarm(alarmClockData);
+ if (old != null) {
+// deleteAlarmClock(oldId);
+ PendingIntent pendingIntent = getPendingIntent(old);
+ if (pendingIntent != null) {
+ mAlarmManager.cancel(pendingIntent);
+ }
+ }
+ alarmClockData.setId(newId);
+ ContentValues values = getValuesFromAlarmClock(alarmClockData);
+ long id = 0;
+ mDatabase.beginTransaction();
+ try {
+ id = mDatabase.update(AlarmOpenHelper.TABLE_ALARM, values, "id=" + oldId, null);
+ mDatabase.setTransactionSuccessful();
+ } catch (Exception e) {
+ Log.e(TAG, "updateAlarmClock: " + e.getMessage());
+ } finally {
+ mDatabase.endTransaction();
+ }
+ setAlarm(alarmClockData);
return id > 0;
}
@@ -145,35 +190,24 @@ public class AlarmUtils {
*
* @param list
*/
- public void insertListValues(List list) {
- open();
+ public void insertAlarmClockList(List list) {
+ openDatabase();
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());
+ ContentValues values = getValuesFromAlarmClock(alarmClockData);
contentValuesList.add(values);
}
- db.beginTransaction();
+ mDatabase.beginTransaction();
try {
for (ContentValues v : contentValuesList) {
- db.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, v, SQLiteDatabase.CONFLICT_REPLACE);
+ mDatabase.insertWithOnConflict(AlarmOpenHelper.TABLE_ALARM, null, v, SQLiteDatabase.CONFLICT_REPLACE);
}
- db.setTransactionSuccessful();
+ mDatabase.setTransactionSuccessful();
} catch (Exception e) {
Log.e(TAG, "insertListValues: " + e.getMessage());
} finally {
- db.endTransaction();
+ mDatabase.endTransaction();
}
- db.close();
}
/**
@@ -184,36 +218,42 @@ public class AlarmUtils {
*/
public boolean deleteAlarmClock(AlarmClockData alarmClockData) {
if (alarmClockData == null) {
- return false;
+ return true;
+ }
+ PendingIntent pendingIntent = getPendingIntent(alarmClockData);
+ if (pendingIntent != null) {
+ mAlarmManager.cancel(pendingIntent);
}
return deleteAlarmClock(alarmClockData.getId());
}
public boolean deleteAlarmClock(int RowID) {
- open();
+ openDatabase();
long id = 0;
- db.beginTransaction();
+ mDatabase.beginTransaction();
try {
- id = db.delete(AlarmOpenHelper.TABLE_ALARM, "id =" + RowID, null);
- db.setTransactionSuccessful();
+ id = mDatabase.delete(AlarmOpenHelper.TABLE_ALARM, " id =" + RowID, null);
+ mDatabase.setTransactionSuccessful();
} catch (Exception e) {
Log.e(TAG, "deleteAlarmClock: " + e.getMessage());
} finally {
- db.endTransaction();
+ mDatabase.endTransaction();
}
- db.close();
return id > 0;
}
+ /**
+ * 删除所有闹钟
+ */
public void deleteAllAlarmClock() {
- HashSet pendingIntents = getOldPendingIntents();
+ HashSet pendingIntents = getOldPendingIntentsSet();
Iterator pendingIntentIterator = pendingIntents.iterator();
while (pendingIntentIterator.hasNext()) {
PendingIntent pendingIntent = pendingIntentIterator.next();
- alarmManager.cancel(pendingIntent);
+ mAlarmManager.cancel(pendingIntent);
pendingIntentIterator.remove();
}
- List alarmClockData = getAllAlarms();
+ List alarmClockData = getDatabaseAlarms();
for (AlarmClockData data : alarmClockData) {
deleteAlarmClock(data.getId());
}
@@ -224,12 +264,11 @@ public class AlarmUtils {
*
* @return
*/
- public List getAllAlarms() {
- open();
+ public List getDatabaseAlarms() {
+ openDatabase();
List list = new ArrayList<>();
String selectQuery = "SELECT * FROM " + AlarmOpenHelper.TABLE_ALARM;
- open();
- Cursor cursor = db.rawQuery(selectQuery, null);
+ Cursor cursor = mDatabase.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
AlarmClockData alarmClockData = new AlarmClockData();
@@ -240,23 +279,139 @@ public class AlarmUtils {
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);
- }
+ alarmClockData.setFile_md5(cursor.getString(7));
+ alarmClockData.setRemind_type(cursor.getInt(8));
+ alarmClockData.setIs_onoff(cursor.getInt(9));
+ alarmClockData.setFinished(cursor.getInt(10) == 1);
+ alarmClockData.setIs_local(cursor.getInt(11) == 1);
+ alarmClockData.setEdited(cursor.getInt(12) == 1);
+ alarmClockData.setDeleted(cursor.getInt(13) == 1);
list.add(alarmClockData);
} while (cursor.moveToNext());
}
cursor.close();
- db.close();
return list;
}
+ /**
+ * @return 获取单个闹钟
+ */
+ public AlarmClockData getDatabaseSingleAlarm(AlarmClockData data) {
+ openDatabase();
+ List list = new ArrayList<>();
+ String selectQuery = "SELECT * FROM " + AlarmOpenHelper.TABLE_ALARM + " where id =" + data.getId();
+ Cursor cursor = mDatabase.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.setFile_md5(cursor.getString(7));
+ alarmClockData.setRemind_type(cursor.getInt(8));
+ alarmClockData.setIs_onoff(cursor.getInt(9));
+ alarmClockData.setFinished(cursor.getInt(10) == 1);
+ alarmClockData.setIs_local(cursor.getInt(11) == 1);
+ alarmClockData.setEdited(cursor.getInt(12) == 1);
+ alarmClockData.setDeleted(cursor.getInt(13) == 1);
+ list.add(alarmClockData);
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ return list.size() == 0 ? null : list.get(0);
+ }
+
+ public AlarmClockData getDatabaseSingleAlarm(int id) {
+ openDatabase();
+ List list = new ArrayList<>();
+ String selectQuery = "SELECT * FROM " + AlarmOpenHelper.TABLE_ALARM + " where id =" + id;
+ Cursor cursor = mDatabase.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.setFile_md5(cursor.getString(7));
+ alarmClockData.setRemind_type(cursor.getInt(8));
+ alarmClockData.setIs_onoff(cursor.getInt(9));
+ alarmClockData.setFinished(cursor.getInt(10) == 1);
+ alarmClockData.setIs_local(cursor.getInt(11) == 1);
+ alarmClockData.setEdited(cursor.getInt(12) == 1);
+ alarmClockData.setDeleted(cursor.getInt(13) == 1);
+ list.add(alarmClockData);
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ return list.size() == 0 ? null : list.get(0);
+ }
+
+ public List getDeletedAlarm() {
+ openDatabase();
+ List list = new ArrayList<>();
+ String selectQuery = "SELECT * FROM " + AlarmOpenHelper.TABLE_ALARM + " where deleted = 1";
+ Cursor cursor = mDatabase.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.setFile_md5(cursor.getString(7));
+ alarmClockData.setRemind_type(cursor.getInt(8));
+ alarmClockData.setIs_onoff(cursor.getInt(9));
+ alarmClockData.setFinished(cursor.getInt(10) == 1);
+ alarmClockData.setIs_local(cursor.getInt(11) == 1);
+ alarmClockData.setEdited(cursor.getInt(12) == 1);
+ alarmClockData.setDeleted(cursor.getInt(13) == 1);
+ list.add(alarmClockData);
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ return list;
+ }
+
+ public List getLocalAddAlarm() {
+ openDatabase();
+ List list = new ArrayList<>();
+ String selectQuery = "SELECT * FROM " + AlarmOpenHelper.TABLE_ALARM + " where is_local = 1";
+ Cursor cursor = mDatabase.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.setFile_md5(cursor.getString(7));
+ alarmClockData.setRemind_type(cursor.getInt(8));
+ alarmClockData.setIs_onoff(cursor.getInt(9));
+ alarmClockData.setFinished(cursor.getInt(10) == 1);
+ alarmClockData.setIs_local(cursor.getInt(11) == 1);
+ alarmClockData.setEdited(cursor.getInt(12) == 1);
+ alarmClockData.setDeleted(cursor.getInt(13) == 1);
+ list.add(alarmClockData);
+ } while (cursor.moveToNext());
+ }
+ cursor.close();
+ return list;
+ }
- private HashSet pendingIntents;
/**
* 设置闹钟列表
@@ -265,58 +420,54 @@ public class AlarmUtils {
*/
public void setAlarmClockData(List data) {
if (pendingIntents == null) {
- pendingIntents = getOldPendingIntents();
+ pendingIntents = getOldPendingIntentsSet();
}
Iterator pendingIntentIterator = pendingIntents.iterator();
while (pendingIntentIterator.hasNext()) {
PendingIntent pendingIntent = pendingIntentIterator.next();
- alarmManager.cancel(pendingIntent);
+ mAlarmManager.cancel(pendingIntent);
pendingIntentIterator.remove();
}
-// for (PendingIntent pendingIntent : pendingIntents) {
-//
-// }
List newData = mergeData(data);
for (AlarmClockData clockData : newData) {
setAlarm(clockData);
checkResource(clockData.getFile());
}
- insertListValues(newData);
+ insertAlarmClockList(newData);
}
+ /**
+ * @param url 下载资源
+ */
private void checkResource(String url) {
- if (TextUtils.isEmpty(url))
+ if (TextUtils.isEmpty(url)) {
return;
+ }
String fileName = url.substring(url.lastIndexOf("/") + 1, url.length());
- if (FileUtil.isVideoFile(fileName)) {
- String realPath = Utils.getDownLoadPath(mContext) + fileName;
- File file = new File(realPath);
- if (!file.exists()) {
- Aria.download(this)
- .load(url) //读取下载地址
- .setFilePath(Utils.getDownLoadPath(mContext) + fileName)
- // .ignoreFilePathOccupy()
- .create(); //启动下载}
- }
- }else if (FileUtil.isPictureFile(fileName)){
- Glide.with(mContext).load(url);
+ String realPath = Utils.getDownLoadPath(mContext) + fileName;
+ File file = new File(realPath);
+ if (!file.exists()) {
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(Utils.getDownLoadPath(mContext) + fileName)
+ .create(); //启动下载}
}
}
/**
* 合并闹钟列表,删除不存在闹钟
*
- * @param alarmClockDataList
- * @return
+ * @param newAlarmClockDataList
+ * @return 新增的闹钟
*/
- private List mergeData(List alarmClockDataList) {
+ private List mergeData(List newAlarmClockDataList) {
HashMap alarmClockDataMap = new HashMap<>();
- if (alarmClockDataList != null) {
- for (AlarmClockData alarmClockData : alarmClockDataList) {
+ if (newAlarmClockDataList != null) {
+ for (AlarmClockData alarmClockData : newAlarmClockDataList) {
alarmClockDataMap.put(alarmClockData.getId(), alarmClockData);
}
}
- HashMap oldData = getOldData();
+ HashMap oldData = getOldDataMap();
List deleteData = new ArrayList<>();
for (Map.Entry entry : oldData.entrySet()) {
if (alarmClockDataMap.get(entry.getKey()) == null) {
@@ -324,14 +475,18 @@ public class AlarmUtils {
}
}
for (AlarmClockData alarmClockData : deleteData) {
+ if (alarmClockData.isIs_local() || alarmClockData.deleted) {
+ Log.e(TAG, "mergeData: skip " + alarmClockData.getId());
+ continue;
+ }
deleteAlarmClock(alarmClockData);
}
List newData = new ArrayList<>();
- if (alarmClockDataList == null) {
+ if (newAlarmClockDataList == null) {
return newData;
}
- for (AlarmClockData alarm : alarmClockDataList) {
+ for (AlarmClockData alarm : newAlarmClockDataList) {
AlarmClockData oldAlarm = oldData.get(alarm.getId());
if (oldAlarm == null) {
newData.add(alarm);
@@ -353,53 +508,48 @@ public class AlarmUtils {
* @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());
+ openDatabase();
+ ContentValues values = getValuesFromAlarmClock(alarmClockData);
long id = 0;
- db.beginTransaction();
+ mDatabase.beginTransaction();
try {
- id = db.update(AlarmOpenHelper.TABLE_ALARM, values, AlarmOpenHelper.KEY_ID + "=?", new String[]{String.valueOf(alarmClockData.getId())});
- db.setTransactionSuccessful();
+ id = mDatabase.update(AlarmOpenHelper.TABLE_ALARM, values, AlarmOpenHelper.KEY_ID + "=?", new String[]{String.valueOf(alarmClockData.getId())});
+ mDatabase.setTransactionSuccessful();
} catch (Exception e) {
Log.e(TAG, "updateAlarmFinished: " + e.getMessage());
} finally {
- db.endTransaction();
+ mDatabase.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<>();
+ public List getOldData() {
+ List alarmClockData = new ArrayList<>();
+ List dataBaseAlarms = getDatabaseAlarms();
+ if (dataBaseAlarms != null && dataBaseAlarms.size() != 0) {
+ alarmClockData.addAll(dataBaseAlarms);
+ }
+ return alarmClockData;
+ }
+
+ public HashMap getOldDataMap() {
+ List alarmClockData = getOldData();
+ HashMap hashMap = new HashMap<>();
+ if (alarmClockData.size() != 0) {
for (AlarmClockData clockData : alarmClockData) {
hashMap.put(clockData.getId(), clockData);
}
- return hashMap;
}
+ return hashMap;
}
-
/**
* 获取最近一次的闹钟
*
* @return
*/
public AlarmClockData getRecentAlarmClock() {
- List alarmClockData = getAllAlarms();
+ List alarmClockData = getDatabaseAlarms();
if (alarmClockData == null || alarmClockData.size() == 0) {
return null;
} else {
@@ -417,15 +567,21 @@ public class AlarmUtils {
}
}
- private HashSet getOldPendingIntents() {
+ private HashSet getOldPendingIntentsSet() {
HashSet pendingIntents = new HashSet<>();
- HashMap data = getOldData();
+ HashMap data = getOldDataMap();
for (AlarmClockData alarmClockData : data.values()) {
pendingIntents.add(getPendingIntent(alarmClockData));
}
return pendingIntents;
}
+ /**
+ * 获取已设置闹钟的PendingIntent
+ *
+ * @param alarmClock
+ * @return
+ */
private PendingIntent getPendingIntent(AlarmClockData alarmClock) {
Intent intent = new Intent(MainService.ALARMWAKEUP);
intent.putExtra("title", alarmClock.getTitle());
@@ -475,14 +631,6 @@ public class AlarmUtils {
return zeroTime;
}
- /*一次性*/
- public static final int ONCE = 1;
- /*每天*/
- public static final int LOOP = 2;
- /*周一到周五*/
- public static final int WORKING_DAY = 3;
- /*休息日*/
- public static final int OFF_DAY = 4;
/**
* 设置闹钟
@@ -490,6 +638,9 @@ public class AlarmUtils {
* @param alarm
*/
public void setAlarm(AlarmClockData alarm) {
+ if (pendingIntents == null) {
+ pendingIntents = getOldPendingIntentsSet();
+ }
int id = alarm.getId();
int type = alarm.getType();
String timeString = alarm.getTime();
@@ -498,10 +649,17 @@ public class AlarmUtils {
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);
+ String voiceUrl = alarm.getVoice();
+ String voiceMd5 = alarm.getVoice_md5();
+ if (!TextUtils.isEmpty(voiceUrl)) {
+ if (!FileUtil.isLocalPath(voiceUrl))
+ ariaDownload(voiceUrl, voiceMd5);
+ }
+ String fileUrl = alarm.getFile();
+ String fileMd5 = alarm.getFile_md5();
+ if (!TextUtils.isEmpty(fileUrl)) {
+ if (!FileUtil.isLocalPath(fileUrl))
+ ariaDownload(fileUrl, fileMd5);
}
switch (type) {
case ONCE:
@@ -540,7 +698,7 @@ public class AlarmUtils {
intent.putExtra("id", requestCode);
PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
pendingIntents.add(startPendingIntent);
- alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
+ mAlarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
Log.e(TAG, "setOnceAlarm: " + "id: " + requestCode + " title: " + extra + " timeString: " + timestamp);
}
@@ -559,7 +717,7 @@ public class AlarmUtils {
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);
+ mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
Log.e(TAG, "setDayLoopAlarm: " + "title: " + extra + " timeString: " + timestamp);
// setLoopAlarm(action, extra, requestCode, AlarmManager.INTERVAL_DAY, timestamp);
}
@@ -585,7 +743,7 @@ public class AlarmUtils {
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);
+ mAlarmManager.setWindow(AlarmManager.RTC_WAKEUP, timestamp, intervalMillis, startPendingIntent);
Log.e(TAG, "setLoopAlarm: " + "title: " + extra + " timeString: " + timestamp);
}
@@ -609,7 +767,7 @@ public class AlarmUtils {
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);
+ mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
Log.e(TAG, "setWorkDayAlarm: " + "title: " + extra + " timeString: " + timestamp);
}
@@ -634,7 +792,7 @@ public class AlarmUtils {
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);
+ mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, startPendingIntent);
Log.e(TAG, "setOffDayAlarm: " + "title: " + extra + " timeString: " + timestamp);
}
@@ -646,7 +804,7 @@ public class AlarmUtils {
String fileMD5 = FileUtils.getFileMD5ToString(file);
Log.e("ariaDownload", "fileOnlineMD5=" + md5);
Log.e("ariaDownload", "fileMD5=" + fileMD5);
- if (!md5.equals(fileMD5)) {
+ if (!md5.equalsIgnoreCase(fileMD5)) {
Aria.download(this)
.load(url) //读取下载地址
.setFilePath(Utils.getDownLoadPath(mContext) + fileName)
@@ -666,5 +824,23 @@ public class AlarmUtils {
}
}
+ public void ariaDownload(String url) {
+ if (FileUtil.isLocalPath(url)) {
+ return;
+ }
+ 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", "fileMD5=" + fileMD5);
+ Log.e("ariaDownload", "fileName = " + fileName + " exists");
+ } else {
+ Aria.download(this)
+ .load(url) //读取下载地址
+ .setFilePath(Utils.getDownLoadPath(mContext) + fileName)
+ .create(); //启动下载}
+ }
+ }
+
}
diff --git a/app/src/main/java/com/uiuios/aios/base/BaseApplication.java b/app/src/main/java/com/uiuios/aios/base/BaseApplication.java
index a6fbaf8..2c84ca7 100644
--- a/app/src/main/java/com/uiuios/aios/base/BaseApplication.java
+++ b/app/src/main/java/com/uiuios/aios/base/BaseApplication.java
@@ -29,6 +29,7 @@ import com.uiuios.aios.service.main.MainService;
import com.uiuios.aios.utils.AppUsedTimeUtils;
import com.uiuios.aios.utils.JGYUtils;
import com.uiuios.aios.utils.Utils;
+import com.uiuios.aios.utils.WiFiUtils;
import java.util.ArrayList;
import java.util.List;
@@ -52,6 +53,7 @@ public class BaseApplication extends Application {
Aria.init(this);
Aria.get(this).getDownloadConfig().setMaxTaskNum(1);
Aria.get(this).getDownloadConfig().setConvertSpeed(true);
+ WiFiUtils.init(this);
AppUsedTimeUtils.init(this);
AlarmUtils.init(this);
HeConfig.init("HE2210211540591362", "fe42a7bb59b14eefb27eea4fb2c40e99");
diff --git a/app/src/main/java/com/uiuios/aios/base/BaseLifecycleActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseLifecycleActivity.java
new file mode 100644
index 0000000..fe530da
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/base/BaseLifecycleActivity.java
@@ -0,0 +1,116 @@
+package com.uiuios.aios.base;
+
+import android.os.Bundle;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.CheckResult;
+import androidx.annotation.ContentView;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.trello.rxlifecycle4.LifecycleProvider;
+import com.trello.rxlifecycle4.LifecycleTransformer;
+import com.trello.rxlifecycle4.RxLifecycle;
+import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+
+
+public abstract class BaseLifecycleActivity extends AppCompatActivity implements LifecycleProvider {
+ public final BehaviorSubject lifecycleSubject = BehaviorSubject.create();
+
+ public BaseLifecycleActivity() {
+ super();
+ }
+
+ @ContentView
+ public BaseLifecycleActivity(@LayoutRes int contentLayoutId) {
+ super(contentLayoutId);
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final Observable lifecycle() {
+ return lifecycleSubject.hide();
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer bindUntilEvent(@NonNull ActivityEvent event) {
+ return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer bindToLifecycle() {
+ return RxLifecycleAndroid.bindActivity(lifecycleSubject);
+ }
+
+ @Override
+ @CallSuper
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ lifecycleSubject.onNext(ActivityEvent.CREATE);
+ setContentView(this.getLayoutId());
+ initView();
+ initData();
+ }
+
+ /**
+ * 设置布局
+ */
+ public abstract int getLayoutId();
+
+ /**
+ * 初始化视图
+ */
+ public abstract void initView();
+
+
+ /**
+ * 初始化数据
+ */
+ public abstract void initData();
+
+ @Override
+ @CallSuper
+ protected void onStart() {
+ super.onStart();
+ lifecycleSubject.onNext(ActivityEvent.START);
+ }
+
+ @Override
+ @CallSuper
+ protected void onResume() {
+ super.onResume();
+ lifecycleSubject.onNext(ActivityEvent.RESUME);
+ }
+
+ @Override
+ @CallSuper
+ protected void onPause() {
+ lifecycleSubject.onNext(ActivityEvent.PAUSE);
+ super.onPause();
+ }
+
+ @Override
+ @CallSuper
+ protected void onStop() {
+ lifecycleSubject.onNext(ActivityEvent.STOP);
+ super.onStop();
+ }
+
+ @Override
+ @CallSuper
+ protected void onDestroy() {
+ lifecycleSubject.onNext(ActivityEvent.DESTROY);
+ super.onDestroy();
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/base/BaseLightLifecycleActivity.java b/app/src/main/java/com/uiuios/aios/base/BaseLightLifecycleActivity.java
new file mode 100644
index 0000000..2a33559
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/base/BaseLightLifecycleActivity.java
@@ -0,0 +1,115 @@
+package com.uiuios.aios.base;
+
+import android.os.Bundle;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.CheckResult;
+import androidx.annotation.ContentView;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.trello.rxlifecycle4.LifecycleProvider;
+import com.trello.rxlifecycle4.LifecycleTransformer;
+import com.trello.rxlifecycle4.RxLifecycle;
+import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+
+public abstract class BaseLightLifecycleActivity extends AppCompatActivity implements LifecycleProvider {
+ public final BehaviorSubject lifecycleSubject = BehaviorSubject.create();
+
+ public BaseLightLifecycleActivity() {
+ super();
+ }
+
+ @ContentView
+ public BaseLightLifecycleActivity(@LayoutRes int contentLayoutId) {
+ super(contentLayoutId);
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final Observable lifecycle() {
+ return lifecycleSubject.hide();
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer bindUntilEvent(@NonNull ActivityEvent event) {
+ return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
+ }
+
+ @Override
+ @NonNull
+ @CheckResult
+ public final LifecycleTransformer bindToLifecycle() {
+ return RxLifecycleAndroid.bindActivity(lifecycleSubject);
+ }
+
+ @Override
+ @CallSuper
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ lifecycleSubject.onNext(ActivityEvent.CREATE);
+ setContentView(this.getLayoutId());
+ initView();
+ initData();
+ }
+
+ /**
+ * 设置布局
+ */
+ public abstract int getLayoutId();
+
+ /**
+ * 初始化视图
+ */
+ public abstract void initView();
+
+
+ /**
+ * 初始化数据
+ */
+ public abstract void initData();
+
+ @Override
+ @CallSuper
+ protected void onStart() {
+ super.onStart();
+ lifecycleSubject.onNext(ActivityEvent.START);
+ }
+
+ @Override
+ @CallSuper
+ protected void onResume() {
+ super.onResume();
+ lifecycleSubject.onNext(ActivityEvent.RESUME);
+ }
+
+ @Override
+ @CallSuper
+ protected void onPause() {
+ lifecycleSubject.onNext(ActivityEvent.PAUSE);
+ super.onPause();
+ }
+
+ @Override
+ @CallSuper
+ protected void onStop() {
+ lifecycleSubject.onNext(ActivityEvent.STOP);
+ super.onStop();
+ }
+
+ @Override
+ @CallSuper
+ protected void onDestroy() {
+ lifecycleSubject.onNext(ActivityEvent.DESTROY);
+ super.onDestroy();
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/bean/AlarmClockId.java b/app/src/main/java/com/uiuios/aios/bean/AlarmClockId.java
new file mode 100644
index 0000000..d4ec732
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/bean/AlarmClockId.java
@@ -0,0 +1,16 @@
+package com.uiuios.aios.bean;
+
+import java.io.Serializable;
+
+public class AlarmClockId implements Serializable {
+ private static final long serialVersionUID = 4423679466957746841L;
+ int id;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/bean/WiFiInfo.java b/app/src/main/java/com/uiuios/aios/bean/WiFiInfo.java
new file mode 100644
index 0000000..26c215e
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/bean/WiFiInfo.java
@@ -0,0 +1,62 @@
+package com.uiuios.aios.bean;
+
+import java.io.Serializable;
+
+public class WiFiInfo implements Serializable {
+ private static final long serialVersionUID = 2429102475725706816L;
+
+ String SSID;
+ String BSSID;
+ int level;
+ boolean connected;
+ boolean isSaved;
+ boolean isAvailable;
+
+ public String getSSID() {
+ return SSID;
+ }
+
+ public void setSSID(String SSID) {
+ this.SSID = SSID;
+ }
+
+ public String getBSSID() {
+ return BSSID;
+ }
+
+ public void setBSSID(String BSSID) {
+ this.BSSID = BSSID;
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public void setLevel(int level) {
+ this.level = level;
+ }
+
+ public boolean isConnected() {
+ return connected;
+ }
+
+ public void setConnected(boolean connected) {
+ this.connected = connected;
+ }
+
+ public boolean isSaved() {
+ return isSaved;
+ }
+
+ public void setSaved(boolean saved) {
+ isSaved = saved;
+ }
+
+ public boolean isAvailable() {
+ return isAvailable;
+ }
+
+ public void setAvailable(boolean available) {
+ isAvailable = available;
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/dialog/DeleWifiDialog.java b/app/src/main/java/com/uiuios/aios/dialog/DeleWifiDialog.java
new file mode 100644
index 0000000..e26f9de
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/dialog/DeleWifiDialog.java
@@ -0,0 +1,246 @@
+package com.uiuios.aios.dialog;
+
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AlertDialog;
+
+import com.uiuios.aios.R;
+
+
+/**
+ * description:自定义dialog
+ */
+
+public class DeleWifiDialog extends AlertDialog {
+ /**
+ * 显示的图片
+ */
+ private ImageView imageIv;
+
+ /**
+ * 显示的标题
+ */
+ private TextView titleTv;
+
+ /**
+ * 显示的消息
+ */
+ private TextView messageTv;
+
+ /**
+ * 确认和取消按钮
+ */
+ private TextView positiveBn;
+ private TextView negtiveBn;
+ /**
+ * 按钮之间的分割线
+ */
+// private View columnLineView;
+
+ private Context mContext;
+
+ public DeleWifiDialog(Context context) {
+ super(context, R.style.CustomDialog);
+ this.mContext = context;
+ }
+
+ /**
+ * 都是内容数据
+ */
+ private String message;
+ private String title;
+ private String positive;
+ private int imageResId = -1;
+ private boolean showPasswd = false;
+
+ /**
+ * 底部是否只有一个按钮
+ */
+ private boolean isSingle = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.dialog_delete_wifi);
+ //按空白处不能取消动画
+ setCanceledOnTouchOutside(false);
+ //初始化界面控件
+ initView();
+ //初始化界面数据
+ refreshView();
+ //初始化界面控件的事件
+ initEvent();
+ }
+
+ /**
+ * 初始化界面的确定和取消监听器
+ */
+ private void initEvent() {
+ //设置确定按钮被点击后,向外界提供监听
+ positiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onPositiveClick();
+ }
+ }
+ });
+ negtiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ dismiss();
+ }
+ });
+ }
+
+ /**
+ * 初始化界面控件的显示数据
+ */
+ private void refreshView() {
+ //如果用户自定了title和message
+ if (!TextUtils.isEmpty(title)) {
+ titleTv.setText(title);
+ titleTv.setVisibility(View.VISIBLE);
+ } else {
+ titleTv.setVisibility(View.GONE);
+ }
+ if (!TextUtils.isEmpty(message)) {
+ messageTv.setText(message);
+ }
+ //如果设置按钮的文字
+ if (!TextUtils.isEmpty(positive)) {
+ positiveBn.setText(positive);
+ } else {
+ positiveBn.setText("确定");
+ }
+ negtiveBn.setText("取消");
+
+ if (imageResId != -1) {
+ imageIv.setImageResource(imageResId);
+ imageIv.setVisibility(View.VISIBLE);
+ } else {
+ imageIv.setVisibility(View.GONE);
+ }
+ /**
+ * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
+ */
+// if (isSingle) {
+//// columnLineView.setVisibility(View.GONE);
+// negtiveBn.setVisibility(View.GONE);
+// } else {
+// negtiveBn.setVisibility(View.VISIBLE);
+//// columnLineView.setVisibility(View.VISIBLE);
+// }
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ refreshView();
+ }
+
+ /**
+ * 初始化界面控件
+ */
+ private void initView() {
+ positiveBn = findViewById(R.id.positive);
+ negtiveBn = findViewById(R.id.negtive);
+ titleTv = findViewById(R.id.title);
+ messageTv = findViewById(R.id.message);
+ imageIv = findViewById(R.id.image);
+// columnLineView = findViewById(R.id.column_line);
+ showKeyboard();
+ }
+
+ public void showKeyboard() {
+ if (messageTv != null) {
+ //设置可获得焦点
+ messageTv.setFocusable(true);
+ messageTv.setFocusableInTouchMode(true);
+ //请求获得焦点
+ messageTv.requestFocus();
+ //调用系统输入法
+ InputMethodManager inputManager = (InputMethodManager) messageTv
+ .getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputManager.showSoftInput(messageTv, 0);
+ }
+ }
+
+ /**
+ * 设置确定取消按钮的回调
+ */
+ private OnClickBottomListener onClickBottomListener;
+
+ public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
+ this.onClickBottomListener = onClickBottomListener;
+ }
+
+ public interface OnClickBottomListener {
+ /**
+ * 点击确定按钮事件
+ */
+ void onPositiveClick();
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public DeleWifiDialog setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public DeleWifiDialog setTitle(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public String getPositive() {
+ return positive;
+ }
+
+ public DeleWifiDialog setPositive(String positive) {
+ this.positive = positive;
+ return this;
+ }
+
+ public int getImageResId() {
+ return imageResId;
+ }
+
+ public boolean isSingle() {
+ return isSingle;
+ }
+
+ public DeleWifiDialog setSingle(boolean single) {
+ isSingle = single;
+ return this;
+ }
+
+ public DeleWifiDialog setImageResId(int imageResId) {
+ this.imageResId = imageResId;
+ return this;
+ }
+
+ public String getPassword() {
+ String passwd = messageTv.getText().toString();
+ return passwd;
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/dialog/DeleteDialog.java b/app/src/main/java/com/uiuios/aios/dialog/DeleteDialog.java
new file mode 100644
index 0000000..24a9c4c
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/dialog/DeleteDialog.java
@@ -0,0 +1,251 @@
+package com.uiuios.aios.dialog;
+
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AlertDialog;
+
+import com.uiuios.aios.R;
+
+
+/**
+ * description:自定义dialog
+ */
+
+public class DeleteDialog extends AlertDialog {
+ /**
+ * 显示的图片
+ */
+ private ImageView imageIv;
+
+ /**
+ * 显示的标题
+ */
+ private TextView titleTv;
+
+ /**
+ * 显示的消息
+ */
+ private TextView messageTv;
+
+ /**
+ * 确认和取消按钮
+ */
+ private TextView positiveBn;
+ private TextView negtiveBn;
+
+ /**
+ * 按钮之间的分割线
+ */
+// private View columnLineView;
+
+ private Context mContext;
+
+ public DeleteDialog(Context context) {
+ super(context, R.style.CustomDialog);
+ this.mContext = context;
+ }
+
+ /**
+ * 都是内容数据
+ */
+ private String message;
+ private String title;
+ private String positive, negtive;
+ private int imageResId = -1;
+
+ /**
+ * 底部是否只有一个按钮
+ */
+ private boolean isSingle = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.dialog_delete);
+ //按空白处不能取消动画
+ setCanceledOnTouchOutside(false);
+ //初始化界面控件
+ initView();
+ //初始化界面数据
+ refreshView();
+ //初始化界面控件的事件
+ initEvent();
+ }
+
+ /**
+ * 初始化界面的确定和取消监听器
+ */
+ private void initEvent() {
+ //设置确定按钮被点击后,向外界提供监听
+ positiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onPositiveClick();
+ }
+ }
+ });
+ //设置取消按钮被点击后,向外界提供监听
+ negtiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onNegtiveClick();
+ }
+ }
+ });
+ }
+
+ /**
+ * 初始化界面控件的显示数据
+ */
+ private void refreshView() {
+ //如果用户自定了title和message
+ if (!TextUtils.isEmpty(title)) {
+ titleTv.setText(title);
+ titleTv.setVisibility(View.VISIBLE);
+ } else {
+ titleTv.setVisibility(View.GONE);
+ }
+ if (!TextUtils.isEmpty(message)) {
+ messageTv.setText(message);
+ }
+ //如果设置按钮的文字
+ if (!TextUtils.isEmpty(positive)) {
+ positiveBn.setText(positive);
+ } else {
+ positiveBn.setText("确定");
+ }
+ if (!TextUtils.isEmpty(negtive)) {
+ negtiveBn.setText(negtive);
+ } else {
+ negtiveBn.setText("取消");
+ }
+
+ if (imageResId != -1) {
+ imageIv.setImageResource(imageResId);
+ imageIv.setVisibility(View.VISIBLE);
+ } else {
+ imageIv.setVisibility(View.GONE);
+ }
+ /**
+ * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
+ */
+// if (isSingle) {
+//// columnLineView.setVisibility(View.GONE);
+// negtiveBn.setVisibility(View.GONE);
+// } else {
+// negtiveBn.setVisibility(View.VISIBLE);
+//// columnLineView.setVisibility(View.VISIBLE);
+// }
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ refreshView();
+ }
+
+ /**
+ * 初始化界面控件
+ */
+ private void initView() {
+ negtiveBn = findViewById(R.id.negtive);
+ positiveBn = findViewById(R.id.positive);
+ titleTv = findViewById(R.id.title);
+ messageTv = findViewById(R.id.message);
+ imageIv = findViewById(R.id.image);
+// columnLineView = findViewById(R.id.column_line);
+ }
+
+ /**
+ * 设置确定取消按钮的回调
+ */
+ private OnClickBottomListener onClickBottomListener;
+
+ public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
+ this.onClickBottomListener = onClickBottomListener;
+ }
+
+ public interface OnClickBottomListener {
+ /**
+ * 点击确定按钮事件
+ */
+ void onPositiveClick();
+
+ /**
+ * 点击取消按钮事件
+ */
+ void onNegtiveClick();
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public DeleteDialog setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public DeleteDialog setTitle(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public String getPositive() {
+ return positive;
+ }
+
+ public DeleteDialog setPositive(String positive) {
+ this.positive = positive;
+ return this;
+ }
+
+ public String getNegtive() {
+ return negtive;
+ }
+
+ public DeleteDialog setNegtive(String negtive) {
+ this.negtive = negtive;
+ return this;
+ }
+
+ public DeleteDialog setNegtiveText(String negtive) {
+ negtiveBn.setText(negtive);
+ return this;
+ }
+
+ public int getImageResId() {
+ return imageResId;
+ }
+
+ public boolean isSingle() {
+ return isSingle;
+ }
+
+ public DeleteDialog setSingle(boolean single) {
+ isSingle = single;
+ return this;
+ }
+
+ public DeleteDialog setImageResId(int imageResId) {
+ this.imageResId = imageResId;
+ return this;
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/dialog/WifiDialog.java b/app/src/main/java/com/uiuios/aios/dialog/WifiDialog.java
new file mode 100644
index 0000000..658ebc8
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/dialog/WifiDialog.java
@@ -0,0 +1,265 @@
+package com.uiuios.aios.dialog;
+
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.PasswordTransformationMethod;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AlertDialog;
+
+import com.uiuios.aios.R;
+
+
+/**
+ * description:自定义dialog
+ */
+
+public class WifiDialog extends AlertDialog {
+ /**
+ * 显示的图片
+ */
+ private ImageView imageIv;
+ private ImageView iv_show;
+ private ImageView iv_close;
+
+ /**
+ * 显示的标题
+ */
+ private TextView titleTv;
+
+ /**
+ * 显示的消息
+ */
+ private EditText messageTv;
+
+ /**
+ * 确认和取消按钮
+ */
+ private TextView positiveBn;
+
+ /**
+ * 按钮之间的分割线
+ */
+// private View columnLineView;
+
+ private Context mContext;
+
+ public WifiDialog(Context context) {
+ super(context, R.style.CustomDialog);
+ this.mContext = context;
+ }
+
+ /**
+ * 都是内容数据
+ */
+ private String message;
+ private String title;
+ private String positive;
+ private int imageResId = -1;
+ private boolean showPasswd = false;
+
+ /**
+ * 底部是否只有一个按钮
+ */
+ private boolean isSingle = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.dialog_wifi);
+ //按空白处不能取消动画
+ setCanceledOnTouchOutside(false);
+ //初始化界面控件
+ initView();
+ //初始化界面数据
+ refreshView();
+ //初始化界面控件的事件
+ initEvent();
+ }
+
+ /**
+ * 初始化界面的确定和取消监听器
+ */
+ private void initEvent() {
+ //设置确定按钮被点击后,向外界提供监听
+ positiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onPositiveClick();
+ }
+ }
+ });
+ iv_show.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (showPasswd) {
+ iv_show.setImageDrawable(mContext.getDrawable(R.drawable.icon_passwd_show));
+ messageTv.setTransformationMethod(PasswordTransformationMethod.getInstance());
+ } else {
+ iv_show.setImageDrawable(mContext.getDrawable(R.drawable.icon_passwd_hide));
+ messageTv.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
+ }
+ showPasswd = !showPasswd;
+ }
+ });
+ iv_close.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ dismiss();
+ }
+ });
+ }
+
+ /**
+ * 初始化界面控件的显示数据
+ */
+ private void refreshView() {
+ //如果用户自定了title和message
+ if (!TextUtils.isEmpty(title)) {
+ titleTv.setText(title);
+ titleTv.setVisibility(View.VISIBLE);
+ } else {
+ titleTv.setVisibility(View.GONE);
+ }
+ if (!TextUtils.isEmpty(message)) {
+ messageTv.setText(message);
+ }
+ //如果设置按钮的文字
+ if (!TextUtils.isEmpty(positive)) {
+ positiveBn.setText(positive);
+ } else {
+ positiveBn.setText("确定");
+ }
+
+ if (imageResId != -1) {
+ imageIv.setImageResource(imageResId);
+ imageIv.setVisibility(View.VISIBLE);
+ } else {
+ imageIv.setVisibility(View.GONE);
+ }
+ /**
+ * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
+ */
+// if (isSingle) {
+//// columnLineView.setVisibility(View.GONE);
+// negtiveBn.setVisibility(View.GONE);
+// } else {
+// negtiveBn.setVisibility(View.VISIBLE);
+//// columnLineView.setVisibility(View.VISIBLE);
+// }
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ refreshView();
+ }
+
+ /**
+ * 初始化界面控件
+ */
+ private void initView() {
+ positiveBn = findViewById(R.id.positive);
+ titleTv = findViewById(R.id.title);
+ messageTv = findViewById(R.id.message);
+ imageIv = findViewById(R.id.image);
+ iv_show = findViewById(R.id.iv_show);
+ iv_close = findViewById(R.id.iv_close);
+
+// columnLineView = findViewById(R.id.column_line);
+ showKeyboard();
+ }
+
+ public void showKeyboard() {
+ if (messageTv != null) {
+ //设置可获得焦点
+ messageTv.setFocusable(true);
+ messageTv.setFocusableInTouchMode(true);
+ //请求获得焦点
+ messageTv.requestFocus();
+ //调用系统输入法
+ InputMethodManager inputManager = (InputMethodManager) messageTv
+ .getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputManager.showSoftInput(messageTv, 0);
+ }
+ }
+
+ /**
+ * 设置确定取消按钮的回调
+ */
+ private OnClickBottomListener onClickBottomListener;
+
+ public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
+ this.onClickBottomListener = onClickBottomListener;
+ }
+
+ public interface OnClickBottomListener {
+ /**
+ * 点击确定按钮事件
+ */
+ void onPositiveClick();
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public WifiDialog setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public WifiDialog setTitle(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public String getPositive() {
+ return positive;
+ }
+
+ public WifiDialog setPositive(String positive) {
+ this.positive = positive;
+ return this;
+ }
+
+ public int getImageResId() {
+ return imageResId;
+ }
+
+ public boolean isSingle() {
+ return isSingle;
+ }
+
+ public WifiDialog setSingle(boolean single) {
+ isSingle = single;
+ return this;
+ }
+
+ public WifiDialog setImageResId(int imageResId) {
+ this.imageResId = imageResId;
+ return this;
+ }
+
+ public String getPassword() {
+ String passwd = messageTv.getText().toString();
+ return passwd;
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ }
+}
diff --git a/app/src/main/java/com/uiuios/aios/fragment/AppListFragment.java b/app/src/main/java/com/uiuios/aios/fragment/AppListFragment.java
index b2a8939..d968b23 100644
--- a/app/src/main/java/com/uiuios/aios/fragment/AppListFragment.java
+++ b/app/src/main/java/com/uiuios/aios/fragment/AppListFragment.java
@@ -23,12 +23,12 @@ import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.FragmentEvent;
import com.uiuios.aios.R;
import com.uiuios.aios.activity.DailyAppActivity;
-import com.uiuios.aios.activity.code.FamilySpaceActivity;
import com.uiuios.aios.base.BaseFragment;
import com.uiuios.aios.bean.BaseResponse;
import com.uiuios.aios.bean.DesktopIcon;
import com.uiuios.aios.config.CommonConfig;
import com.uiuios.aios.dialog.CustomDialog;
+import com.uiuios.aios.dialog.DailyAppDialog;
import com.uiuios.aios.manager.AppStatusManager;
import com.uiuios.aios.network.NetInterfaceManager;
import com.uiuios.aios.service.NotificationService;
@@ -169,6 +169,7 @@ public class AppListFragment extends BaseFragment {
iv.setImageDrawable(desktopIcon.getIcon());
} else {
iv.setImageDrawable(getActivity().getResources().getDrawable(resID));
+ desktopIcon.setIcon(mContext.getResources().getDrawable(resID));
}
} else {
iv.setImageBitmap(BitmapUtils.getIconBitmap(rootView.getContext(), desktopIcon.getIcon()));
@@ -253,9 +254,10 @@ public class AppListFragment extends BaseFragment {
switch (pkg) {
case "aios.exit":
case "com.uiuios.sn":
+ case "aios.daily.app":
break;
default:
- showHinDialog(pkg, desktopIcon.getLable());
+ showHideDialog(desktopIcon);
}
}
});
@@ -266,23 +268,25 @@ public class AppListFragment extends BaseFragment {
.compose(RxLifecycle.bindUntilEvent(lifecycleSubject, FragmentEvent.DESTROY))
.subscribe(new Observer() {
@Override
- public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
+ public void onSubscribe(@NonNull Disposable d) {
Log.e("updateAppDisableStatus", "onSubscribe: ");
}
@Override
- public void onNext(@io.reactivex.rxjava3.annotations.NonNull BaseResponse baseResponse) {
+ public void onNext(@NonNull BaseResponse baseResponse) {
Log.e("updateAppDisableStatus", "onNext: " + baseResponse);
if (baseResponse.code == 200) {
- ApkUtils.disableApp(mContext, pkg);
+// ApkUtils.disableApp(mContext, pkg);
+ AppStatusManager.getInstance().addHidedApp(pkg);
} else {
ToastUtil.show("隐藏失败,检查网络连接");
}
}
@Override
- public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
+ public void onError(@NonNull Throwable e) {
Log.e("updateAppDisableStatus", "onError: ");
+ ToastUtil.show("隐藏失败,检查网络连接");
onComplete();
}
@@ -293,23 +297,26 @@ public class AppListFragment extends BaseFragment {
});
}
- private void showHinDialog(String pkg, String label) {
- CustomDialog customDialog = new CustomDialog(mContext);
- customDialog.setTitle("隐藏应用");
- customDialog.setMessage("是否要隐藏:" + label);
- customDialog.setOnClickBottomListener(new CustomDialog.OnClickBottomListener() {
+ private void showHideDialog(DesktopIcon desktopIcon) {
+ String label = desktopIcon.getLable();
+ String pkg = desktopIcon.getPackageName();
+ DailyAppDialog dailyAppDialog = new DailyAppDialog(mContext);
+ dailyAppDialog.setTitle("移到日常应用");
+ dailyAppDialog.setMessage(label);
+ dailyAppDialog.setIconImage(desktopIcon.getIcon());
+ dailyAppDialog.setOnClickBottomListener(new DailyAppDialog.OnClickBottomListener() {
@Override
public void onPositiveClick() {
updateAppDisableStatus(pkg, label);
- customDialog.dismiss();
+ dailyAppDialog.dismiss();
}
@Override
public void onNegtiveClick() {
- customDialog.dismiss();
+ dailyAppDialog.dismiss();
}
});
- customDialog.show();
+ dailyAppDialog.show();
}
private void SendRunningApp(Context context) {
diff --git a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java
index d7676e2..d637c04 100644
--- a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java
+++ b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java
@@ -56,11 +56,12 @@ import com.uiuios.aios.activity.alarm.AlarmClockActivity;
import com.uiuios.aios.activity.code.FamilySpaceActivity;
import com.uiuios.aios.activity.contact.ContactActivity;
import com.uiuios.aios.activity.weather.WeatherActivity;
+import com.uiuios.aios.activity.wifi.WiFiManagerActivity;
import com.uiuios.aios.adapter.NotificationAdapter;
import com.uiuios.aios.adapter.SOSNnmberAdapter;
import com.uiuios.aios.alarm.AlarmUtils;
import com.uiuios.aios.base.BaseFragment;
-import com.uiuios.aios.bean.AlarmClockData;
+import com.uiuios.aios.alarm.AlarmClockData;
import com.uiuios.aios.bean.AlarmItem;
import com.uiuios.aios.bean.Contact;
import com.uiuios.aios.bean.HealthCode;
@@ -567,8 +568,10 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom
cl_wifi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
- startActivity(intent);
+// Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
+// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+// startActivity(intent);
+ startActivity(new Intent(mContext, WiFiManagerActivity.class));
}
});
cl_activation.setOnClickListener(new View.OnClickListener() {
@@ -603,7 +606,6 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom
} else {
// tv_name.setText("未设置");
}
-
}
private void showPassword() {
@@ -832,24 +834,25 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom
}
private void getAlarm() {
- NetInterfaceManager.getInstance().getAlarmClock(new NetInterfaceManager.AlarmClockCallback() {
- @Override
- public void setAlarmClock(List alarmClockList) {
- startActivity(new Intent(mContext, AlarmClockActivity.class));
- }
-
- @Override
- public void setAlarmClockEmpty() {
- showNoData("温馨提示", "请在小程序上设置爱心闹钟");
- rv_noti.setVisibility(View.GONE);
- iv_note_nodata.setVisibility(View.VISIBLE);
- }
-
- @Override
- public void onError() {
-
- }
- });
+ startActivity(new Intent(mContext, AlarmClockActivity.class));
+// NetInterfaceManager.getInstance().getAlarmClock(new NetInterfaceManager.AlarmClockCallback() {
+// @Override
+// public void setAlarmClock(List alarmClockList) {
+// startActivity(new Intent(mContext, AlarmClockActivity.class));
+// }
+//
+// @Override
+// public void setAlarmClockEmpty() {
+// showNoData("温馨提示", "请在小程序上设置爱心闹钟");
+// rv_noti.setVisibility(View.GONE);
+// iv_note_nodata.setVisibility(View.VISIBLE);
+// }
+//
+// @Override
+// public void onError() {
+//
+// }
+// });
}
private void getAlarmCache() {
diff --git a/app/src/main/java/com/uiuios/aios/gson/GsonUtils.java b/app/src/main/java/com/uiuios/aios/gson/GsonUtils.java
new file mode 100644
index 0000000..ea86f97
--- /dev/null
+++ b/app/src/main/java/com/uiuios/aios/gson/GsonUtils.java
@@ -0,0 +1,144 @@
+package com.uiuios.aios.gson;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+
+public class GsonUtils {
+ //https://blog.csdn.net/zte1055889498/article/details/122400299
+
+ public static JsonObject getJsonObject(String jsonString) {
+ JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
+ return jsonObject;
+ }
+
+ private static final Gson gson;
+
+ static {
+ GsonBuilder builder = new GsonBuilder();
+ builder.registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory());
+ builder.registerTypeAdapter(Integer.class, new IntegerDefault0Adapter());
+ builder.registerTypeAdapter(int.class, new IntegerDefault0Adapter());
+ builder.disableHtmlEscaping();
+ builder.enableComplexMapKeySerialization();
+ // builder.excludeFieldsWithoutExposeAnnotation();
+ builder.setDateFormat("yyyy-MM-dd HH:mm:ss");
+ gson = builder.create();
+ }
+
+ public static Type makeJavaType(Type rawType, Type... typeArguments) {
+ return TypeToken.getParameterized(rawType, typeArguments).getType();
+ }
+
+ public static String toString(Object value) {
+ if (Objects.isNull(value)) {
+ return null;
+ }
+ if (value instanceof String) {
+ return (String) value;
+ }
+ return toJSONString(value);
+ }
+
+ public static String toJSONString(Object value) {
+ return gson.toJson(value);
+ }
+
+ public static String toPrettyString(Object value) {
+ return gson.newBuilder().setPrettyPrinting().create().toJson(value);
+ }
+
+ public static JsonElement fromJavaObject(Object value) {
+ JsonElement result = null;
+ if (Objects.nonNull(value) && (value instanceof String)) {
+ result = parseObject((String) value);
+ } else {
+ result = gson.toJsonTree(value);
+ }
+ return result;
+ }
+
+ public static JsonElement parseObject(String content) {
+ return JsonParser.parseString(content);
+ }
+
+ public static JsonElement getJsonElement(JsonObject node, String name) {
+ return node.get(name);
+ }
+
+ public static JsonElement getJsonElement(JsonArray node, int index) {
+ return node.get(index);
+ }
+
+ public static T toJavaObject(JsonElement node, Class clazz) {
+ return gson.fromJson(node, clazz);
+ }
+
+ public static T toJavaObject(JsonElement node, Type type) {
+ return gson.fromJson(node, type);
+ }
+
+ public static T toJavaObject(JsonElement node, TypeToken> typeToken) {
+ return toJavaObject(node, typeToken.getType());
+ }
+
+ public static List toJavaList(JsonElement node, Class clazz) {
+ return toJavaObject(node, makeJavaType(List.class, clazz));
+ }
+
+ public static List