version:2.7

fix:
update:优化爱心提醒,修改高度一致
This commit is contained in:
2022-08-31 14:52:14 +08:00
parent 7388d2bbf4
commit 61fb4663a6
18 changed files with 468 additions and 99 deletions

View File

@@ -73,6 +73,7 @@ public class NoticeActivity extends AppCompatActivity {
if (alarmClockData == null) {
finish();
}
Log.e(TAG, "onCreate: " + alarmClockData);
showData(alarmClockData);
}

View File

@@ -1,7 +1,10 @@
package com.uiui.aios.adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.media.AudioAttributes;
import android.media.MediaPlayer;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -13,23 +16,25 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.uiui.aios.R;
import com.uiui.aios.bean.AlarmClockData;
import com.uiui.aios.utils.AudioUtils;
import com.uiui.aios.utils.FFmpegUtils;
import com.uiui.aios.view.MyJzvdStdNoTitleNoClarity;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.holder> {
private FragmentActivity mContext;
private List<AlarmClockData> mAlarmClockData;
public void setAlarmClockData(List<AlarmClockData> alarmClockData) {
@@ -40,6 +45,7 @@ public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.holder> {
@NonNull
@Override
public holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
mContext = (FragmentActivity) parent.getContext();
return new AlarmAdapter.holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_alarm_clock, parent, false));
}
@@ -48,15 +54,16 @@ public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.holder> {
AlarmClockData alarmClockData = mAlarmClockData.get(position);
switch (alarmClockData.getType()) {
case 1:
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(alarmClockData.getTime());
SimpleDateFormat hours = new SimpleDateFormat("HH:mm");
String time = hours.format(date);
holder.tv_time.setText(time);
} catch (ParseException e) {
e.printStackTrace();
}
// try {
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
// Date date = sdf.parse(alarmClockData.getTime());
// SimpleDateFormat hours = new SimpleDateFormat("HH:mm");
// String time = hours.format(date);
// holder.tv_time.setText(time);
// } catch (ParseException e) {
// e.printStackTrace();
// }
holder.tv_time.setText(alarmClockData.getTime());
holder.tv_remind_type.setText("单次");
break;
case 2:
@@ -101,7 +108,7 @@ public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.holder> {
}
//让MediaPlayer对象准备用这个方法防止加载时耗时导致anr
mMediaPlayer.prepareAsync();
AudioUtils.getDurationInMilliseconds(voice, new Observer<Integer>() {
FFmpegUtils.getDurationInMilliseconds(voice, new Observer<Integer>() {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
@@ -129,7 +136,60 @@ public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.holder> {
}
});
}
String url = alarmClockData.getFile();
if (TextUtils.isEmpty(url)) {
holder.cl_vp.setVisibility(View.GONE);
} else {
holder.cl_vp.setVisibility(View.VISIBLE);
if (isImgUrl(url)) {
holder.imageView.setVisibility(View.VISIBLE);
holder.jz_video.setVisibility(View.GONE);
if (!mContext.isDestroyed()) {
Glide.with(mContext).load(url).into(holder.imageView);
}
} else {
holder.imageView.setVisibility(View.GONE);
holder.jz_video.setVisibility(View.VISIBLE);
holder.jz_video.setUp(url, "");
holder.jz_video.startButton.setImageDrawable(mContext.getDrawable(R.drawable.play));
FFmpegUtils.loadVideoScreenshot(url, new Observer<Bitmap>() {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
}
@Override
public void onNext(@io.reactivex.rxjava3.annotations.NonNull Bitmap bitmap) {
if (!mContext.isDestroyed()) {
Glide.with(mContext).load(bitmap).into(holder.jz_video.posterImageView);
}
holder.jz_video.startButton.setImageDrawable(mContext.getDrawable(R.drawable.play));
}
@Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
}
private Pattern mCompile = Pattern.compile(".*?(gif|jpeg|png|jpg|bmp|webp)");
private boolean isImgUrl(String url) {
if (TextUtils.isEmpty(url) || url.trim().length() == 0) {
return false;
}
return mCompile.matcher(url).matches();
}
@Override
@@ -138,13 +198,11 @@ public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.holder> {
}
class holder extends RecyclerView.ViewHolder {
TextView tv_time;
TextView tv_remind_type;
TextView tv_title;
TextView tv_voice;
ConstraintLayout cl_voice;
TextView tv_time, tv_remind_type, tv_title, tv_voice;
ConstraintLayout cl_voice, cl_vp;
MyJzvdStdNoTitleNoClarity jz_video;
ImageView imageView;
Switch switch1;
ImageView iv_delete;
public holder(@NonNull View itemView) {
super(itemView);
@@ -154,7 +212,9 @@ public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.holder> {
tv_voice = itemView.findViewById(R.id.tv_voice);
cl_voice = itemView.findViewById(R.id.cl_voice);
switch1 = itemView.findViewById(R.id.switch1);
iv_delete = itemView.findViewById(R.id.iv_delete);
cl_vp = itemView.findViewById(R.id.cl_vp);
jz_video = itemView.findViewById(R.id.jz_video);
imageView = itemView.findViewById(R.id.imageView);
}
}
}

View File

@@ -15,7 +15,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.uiui.aios.R;
import com.uiui.aios.bean.AlarmClockData;
import com.uiui.aios.utils.AudioUtils;
import com.uiui.aios.utils.FFmpegUtils;
import java.io.IOException;
import java.util.List;
@@ -59,7 +59,7 @@ public class NotificationAdapter extends RecyclerView.Adapter<NotificationAdapte
}
//让MediaPlayer对象准备用这个方法防止加载时耗时导致anr
mMediaPlayer.prepareAsync();
AudioUtils.getDurationInMilliseconds(voice, new Observer<Integer>() {
FFmpegUtils.getDurationInMilliseconds(voice, new Observer<Integer>() {
@Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {

View File

@@ -18,6 +18,8 @@ public class AlarmClockData implements Serializable {
String voice;//语音文件地址
String voice_md5;
String file;//图片或视频文件地址
int remind_type;
int is_onoff;//0关闭 1开启
boolean finished = false;
@@ -85,6 +87,22 @@ public class AlarmClockData implements Serializable {
this.finished = finished;
}
public int getRemind_type() {
return remind_type;
}
public void setRemind_type(int remind_type) {
this.remind_type = remind_type;
}
public int getIs_onoff() {
return is_onoff;
}
public void setIs_onoff(int is_onoff) {
this.is_onoff = is_onoff;
}
@NonNull
@Override
public String toString() {
@@ -102,6 +120,9 @@ public class AlarmClockData implements Serializable {
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 (remind_type != ((AlarmClockData) obj).remind_type) return false;
if (is_onoff != ((AlarmClockData) obj).is_onoff) return false;
return true;
}
}

View File

@@ -50,6 +50,7 @@ import com.uiui.aios.adapter.SOSNnmberAdapter;
import com.uiui.aios.bean.AlarmClockData;
import com.uiui.aios.bean.AlarmItem;
import com.uiui.aios.manager.AmapManager;
import com.uiui.aios.utils.AlarmUtils;
import com.uiui.aios.utils.ApkUtils;
import com.uiui.aios.utils.AppUtil;
import com.uiui.aios.utils.SchemeUtils;
@@ -442,11 +443,8 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt
private void getAlarmClock() {
String jsonString = mmkv.decodeString("AlarmClock", "");
if (!TextUtils.isEmpty(jsonString)) {
Type type = new TypeToken<List<AlarmClockData>>() {
}.getType();
Gson gson = new Gson();
List<AlarmClockData> data = gson.fromJson(jsonString, type);
List<AlarmClockData> showData = data.subList(0, 1);
List<AlarmClockData> data = new ArrayList<>();
data.add(AlarmUtils.getInstance().getRecentAlarmClock());
notificationAdapter.setDataList(data);
rv_noti.setVisibility(View.VISIBLE);
iv_note_nodata.setVisibility(View.GONE);

View File

@@ -18,9 +18,14 @@ 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.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -107,7 +112,7 @@ public class AlarmUtils {
}.getType();
Gson gson = new Gson();
List<AlarmClockData> data = gson.fromJson(jsonString, type);
HashMap hashMap = new HashMap();
HashMap<Integer, AlarmClockData> hashMap = new HashMap<>();
for (AlarmClockData clockData : data) {
hashMap.put(clockData.getId(), clockData);
}
@@ -115,6 +120,41 @@ public class AlarmUtils {
}
}
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();
@@ -246,7 +286,6 @@ public class AlarmUtils {
}
public void ariaDownload(String url, String md5) {
String fileName = Utils.getFileNamefromURL(url);
File file = new File(Utils.getDownLoadPath(mContext) + fileName);

View File

@@ -1,5 +1,7 @@
package com.uiui.aios.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
@@ -11,7 +13,7 @@ import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.schedulers.Schedulers;
import wseemann.media.FFmpegMediaMetadataRetriever;
public class AudioUtils {
public class FFmpegUtils {
/**
* 获取在线音频时间长度
*
@@ -34,4 +36,22 @@ public class AudioUtils {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public static void loadVideoScreenshot(String url, Observer<Bitmap> observer) {
Observable.create(new ObservableOnSubscribe<Bitmap>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Bitmap> emitter) throws Throwable {
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(url);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST);
Bitmap b = mmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // frame at 2 seconds
byte[] artwork = mmr.getEmbeddedPicture();
mmr.release();
emitter.onNext(b);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}

View File

@@ -39,9 +39,9 @@ public class IconUtils {
this.add("com.mediatek.fmradio");//收音机
this.add("com.android.fmradio");//收音机
this.add("com.android.email");//电子邮件
this.add("com.ss.android.ugc.aweme");//抖音
this.add("com.ss.android.article.news");//头条
this.add("com.tencent.mm");//微信
// this.add("com.ss.android.ugc.aweme");//抖音
// this.add("com.ss.android.article.news");//头条
// this.add("com.tencent.mm");//微信
}};
public static List<String> appIconList = new ArrayList<String>() {{
@@ -77,9 +77,9 @@ public class IconUtils {
this.add("com_mediatek_fmradio");
this.add("com_mediatek_fmradio");//收音机
this.add("com_android_email");
this.add("com_android_aweme2");
this.add("com_android_news2");
this.add("com_tencent_mm2");
// this.add("com_android_aweme2");
// this.add("com_android_news2");
// this.add("com_tencent_mm2");
}};
public static List<String> appIconList2 = new ArrayList<String>() {{

View File

@@ -0,0 +1,25 @@
package com.uiui.aios.view;
import android.content.Context;
import android.util.AttributeSet;
import com.uiui.aios.R;
import cn.jzvd.JzvdStd;
public class MyJzvdStdNoTitleNoClarity extends JzvdStd {
public MyJzvdStdNoTitleNoClarity(Context context) {
super(context);
}
public MyJzvdStdNoTitleNoClarity(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public int getLayoutId() {
return R.layout.layout_jzstd_notitle;
}
}