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; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Switch; 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.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestOptions; import com.uiui.aios.R; import com.uiui.aios.bean.AlarmClockData; import com.uiui.aios.utils.FFmpegUtils; import com.uiui.aios.utils.ScreenUtils; import com.uiui.aios.view.JzvdStdRound; 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 { private FragmentActivity mContext; private List mAlarmClockData; public void setAlarmClockData(List alarmClockData) { this.mAlarmClockData = alarmClockData; notifyDataSetChanged(); } @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)); } @Override public void onBindViewHolder(@NonNull holder holder, int position) { AlarmClockData alarmClockData = mAlarmClockData.get(position); switch (alarmClockData.getType()) { case 1: 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_remind_type.setText("单次"); break; case 2: holder.tv_time.setText(alarmClockData.getTime()); holder.tv_remind_type.setText("循环"); break; case 3: holder.tv_time.setText(alarmClockData.getTime()); holder.tv_remind_type.setText("周一至周五"); break; case 4: holder.tv_time.setText(alarmClockData.getTime()); holder.tv_remind_type.setText("周六至周日"); break; default: } String title = alarmClockData.getTitle(); if (TextUtils.isEmpty(title)) { holder.tv_title.setText("无标题"); } else { holder.tv_title.setText(title); } String voice = alarmClockData.getVoice(); if (TextUtils.isEmpty(voice)) { holder.cl_voice.setVisibility(View.GONE); } else { holder.cl_voice.setVisibility(View.VISIBLE); MediaPlayer mMediaPlayer = new MediaPlayer(); mMediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() ); mMediaPlayer.setOnCompletionListener(mp -> Log.e("setOnCompletionListener", "onCompletion: ")); mMediaPlayer.setOnPreparedListener(mp -> Log.e("setOnPreparedListener", "onPrepared: ")); mMediaPlayer.setOnErrorListener((mp, what, extra) -> false); //设置音频文件到MediaPlayer对象中 try { mMediaPlayer.setDataSource(voice); } catch (IOException e) { e.printStackTrace(); } //让MediaPlayer对象准备,用这个方法防止加载时耗时导致anr mMediaPlayer.prepareAsync(); FFmpegUtils.getDurationInMilliseconds(voice, new Observer() { @Override public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { } @Override public void onNext(@io.reactivex.rxjava3.annotations.NonNull Integer integer) { holder.tv_voice.setText(integer + "秒"); } @Override public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { } @Override public void onComplete() { } }); holder.cl_voice.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mMediaPlayer.start(); } }); } 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()) { RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(mContext, 16F))); Glide.with(mContext).load(url).apply(options).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() { @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()) { RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(mContext, 16F))); Glide.with(mContext).load(bitmap).apply(options).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 public int getItemCount() { return mAlarmClockData == null ? 0 : mAlarmClockData.size(); } class holder extends RecyclerView.ViewHolder { TextView tv_time, tv_remind_type, tv_title, tv_voice; ConstraintLayout cl_voice, cl_vp; JzvdStdRound jz_video; ImageView imageView; Switch switch1; public holder(@NonNull View itemView) { super(itemView); tv_time = itemView.findViewById(R.id.tv_time); tv_remind_type = itemView.findViewById(R.id.tv_remind_type); 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); jz_video = itemView.findViewById(R.id.jz_video); imageView = itemView.findViewById(R.id.imageView); } } }