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