diff --git a/.gitignore b/.gitignore index 531f93c..a000a40 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ /app/src/test/java/com/uiui/videoplayer/ /app/src/androidTest/java/com/uiui/videoplayer/ /library/build/ +/JZVideo/build/ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c90c774..56bef83 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,14 +10,15 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java b/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java index 9bc37b2..9f91b8a 100644 --- a/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java +++ b/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java @@ -1,23 +1,12 @@ package com.uiui.videoplayer.activity; -import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.RecyclerView; -import androidx.recyclerview.widget.SimpleItemAnimator; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; - import android.Manifest; -import android.content.pm.ActivityInfo; +import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; @@ -29,13 +18,23 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.WindowManager; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.uiui.videoplayer.R; +import com.uiui.videoplayer.adapter.VideoAdapter; +import com.uiui.videoplayer.base.CustomDialog; import com.uiui.videoplayer.base.RecycleGridLayoutManager; import com.uiui.videoplayer.base.SpacesItemDecoration; -import com.uiui.videoplayer.adapter.VideoAdapter; import com.uiui.videoplayer.utils.ToastUtil; import java.io.File; @@ -64,8 +63,12 @@ public class MainActivity extends AppCompatActivity { // String rootPath = Environment.getExternalStorageDirectory().getPath() + File.separator; // traverseFolder(rootPath); - ScanTask scanTask = new ScanTask(); - scanTask.execute(); + + } + + @Override + protected void onResume() { + super.onResume(); } @Override @@ -115,9 +118,50 @@ public class MainActivity extends AppCompatActivity { getResources().getDimensionPixelSize(R.dimen.PX1x), getResources().getDimensionPixelSize(R.dimen.PX1x))); ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); adapter = new VideoAdapter(MainActivity.this); + adapter.setOnLongClickListener(new VideoAdapter.onItemLongClickListener() { + @Override + public void onItemLongClick(String path, int position) { + showDialog(path, position); + } + }); recyclerView.setAdapter(adapter); } + private void showDialog(String path, int position) { + CustomDialog dialog = new CustomDialog(MainActivity.this); + dialog.setTitle("删除文件") + .setMessage("确定要删除文件 " + getFileName(path) + "吗") + .setPositive("确定") + .setNegtive("取消") +// .setSingle(true) + .setOnClickBottomListener(new CustomDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + dialog.dismiss(); + File file = new File(path); + if (file.delete()) { + adapter.removeItem(position); + ToastUtil.show("删除成功"); + } else { + ToastUtil.show("删除失败,检查权限是否开启"); + } + } + + @Override + public void onNegtiveClick() { + dialog.dismiss(); + } + }); +// dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + dialog.show(); + } + + private String getFileName(String path) { + String name = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + Log.e("getFileName", "Name: " + name); + return name; + } + private void initActionBar() { setToolbarCustomTheme(); //显示返回按钮 @@ -277,6 +321,9 @@ public class MainActivity extends AppCompatActivity { for (String s : permissions) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { mPermissionList.add(s); + }else { + ScanTask scanTask = new ScanTask(); + scanTask.execute(); } } if (mPermissionList.size() > 0) {//有权限没有通过,需要申请 @@ -291,13 +338,26 @@ public class MainActivity extends AppCompatActivity { if (requestCode == REQUEST_PERMISSION_CODE) { //当然权限多了,建议使用Switch,不必纠结于此 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - + ScanTask scanTask = new ScanTask(); + scanTask.execute(); } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) { - + if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)){ + ToastUtil.show("需要存储空间权限才能正常使用软件"); + checkSelfPermission(); + }else { + ToastUtil.show("请打开存储空间权限后使用软件"); + Intent intent = new Intent(); + intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.parse("package:" + this.getPackageName())); + startActivity(intent); + } + refreshLayout.setRefreshing(false); } } } + + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); diff --git a/app/src/main/java/com/uiui/videoplayer/adapter/VideoAdapter.java b/app/src/main/java/com/uiui/videoplayer/adapter/VideoAdapter.java index 918c155..afd6e7c 100644 --- a/app/src/main/java/com/uiui/videoplayer/adapter/VideoAdapter.java +++ b/app/src/main/java/com/uiui/videoplayer/adapter/VideoAdapter.java @@ -49,7 +49,7 @@ import wseemann.media.FFmpegMediaMetadataRetriever; public class VideoAdapter extends RecyclerView.Adapter { private Context mContext; private List videoPath; - + private onItemLongClickListener onItemLongClickListener; public VideoAdapter() { @@ -74,6 +74,10 @@ public class VideoAdapter extends RecyclerView.Adapter notifyDataSetChanged(); } + public void setOnLongClickListener(onItemLongClickListener listener) { + this.onItemLongClickListener = listener; + } + @NonNull @Override public VideoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -155,6 +159,21 @@ public class VideoAdapter extends RecyclerView.Adapter mContext.startActivity(intent); } }); + holder.root.setOnLongClickListener(view -> { + onItemLongClickListener.onItemLongClick(path, position); + return false; + }); + } + + public interface onItemLongClickListener { + void onItemLongClick(String path, int position); + } + + public void removeItem(int position) { + if (null != videoPath.get(position)) { + videoPath.remove(position); + } + notifyDataSetChanged(); } @Override diff --git a/app/src/main/java/com/uiui/videoplayer/base/CustomDialog.java b/app/src/main/java/com/uiui/videoplayer/base/CustomDialog.java new file mode 100644 index 0000000..5b3c34f --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/base/CustomDialog.java @@ -0,0 +1,259 @@ +package com.uiui.videoplayer.base; + + +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.uiui.videoplayer.R; +import com.uiui.videoplayer.activity.MainActivity; + + +/** + * description:自定义dialog + */ + +public class CustomDialog extends Dialog { + /** + * 显示的图片 + */ + private ImageView imageIv; + + /** + * 显示的标题 + */ + private TextView titleTv; + + /** + * 显示的消息 + */ + private TextView messageTv; + + /** + * 确认和取消按钮 + */ + private Button negtiveBn, positiveBn; + + /** + * 按钮之间的分割线 + */ + private View columnLineView; + + private Context mContext; + + public CustomDialog(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.custom_dialog); + //按空白处不能取消动画 + 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 { +// columnLineView.setVisibility(View.VISIBLE); + negtiveBn.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); + } + + /** + * 设置确定取消按钮的回调 + */ + public OnClickBottomListener onClickBottomListener; + + public CustomDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener) { + this.onClickBottomListener = onClickBottomListener; + return this; + } + + public interface OnClickBottomListener { + /** + * 点击确定按钮事件 + */ + void onPositiveClick(); + + /** + * 点击取消按钮事件 + */ + void onNegtiveClick(); + } + + public String getMessage() { + return message; + } + + public CustomDialog setMessage(String message) { + this.message = message; + return this; + } + + public String getTitle() { + return title; + } + + public CustomDialog setTitle(String title) { + this.title = title; + return this; + } + + public String getPositive() { + return positive; + } + + public CustomDialog setPositive(String positive) { + this.positive = positive; + return this; + } + + public String getNegtive() { + return negtive; + } + + public CustomDialog setNegtive(String negtive) { + this.negtive = negtive; + return this; + } + + public CustomDialog setNegtiveText(String negtive) { + negtiveBn.setText(negtive); + return this; + } + + public int getImageResId() { + return imageResId; + } + + public boolean isSingle() { + return isSingle; + } + + public CustomDialog setSingle(boolean single) { + isSingle = single; + return this; + } + + public CustomDialog setImageResId(int imageResId) { + this.imageResId = imageResId; + return this; + } + + @Override + public void dismiss() { + super.dismiss(); + Intent intent = new Intent(mContext, MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(intent); + } +} diff --git a/app/src/main/java/com/uiui/videoplayer/utils/ToastUtil.java b/app/src/main/java/com/uiui/videoplayer/utils/ToastUtil.java index a3d4853..c25d5d8 100644 --- a/app/src/main/java/com/uiui/videoplayer/utils/ToastUtil.java +++ b/app/src/main/java/com/uiui/videoplayer/utils/ToastUtil.java @@ -39,7 +39,7 @@ public class ToastUtil { time2 = System.currentTimeMillis(); if ((time2 - time1) > 3499) { showToast(mContext, msg, Toast.LENGTH_LONG); - Log.e("fht", "LENGTH_LONG"); +// Log.e("fht", "LENGTH_LONG"); time1 = time2; } } else { diff --git a/app/src/main/res/mipmap-xhdpi/tiktok_add_star.png b/app/src/main/res/drawable-hdpi/tiktok_add_star.png similarity index 100% rename from app/src/main/res/mipmap-xhdpi/tiktok_add_star.png rename to app/src/main/res/drawable-hdpi/tiktok_add_star.png diff --git a/app/src/main/res/mipmap-xhdpi/tiktok_bg_add.png b/app/src/main/res/drawable-hdpi/tiktok_bg_add.png similarity index 100% rename from app/src/main/res/mipmap-xhdpi/tiktok_bg_add.png rename to app/src/main/res/drawable-hdpi/tiktok_bg_add.png diff --git a/app/src/main/res/mipmap-xhdpi/tiktok_btn_share.png b/app/src/main/res/drawable-hdpi/tiktok_btn_share.png similarity index 100% rename from app/src/main/res/mipmap-xhdpi/tiktok_btn_share.png rename to app/src/main/res/drawable-hdpi/tiktok_btn_share.png diff --git a/app/src/main/res/drawable/bg_dialog.xml b/app/src/main/res/drawable/bg_dialog.xml new file mode 100644 index 0000000..15df4e5 --- /dev/null +++ b/app/src/main/res/drawable/bg_dialog.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/res/drawable/bt_cancel_normnl.xml b/app/src/main/res/drawable/bt_cancel_normnl.xml new file mode 100644 index 0000000..df3dd39 --- /dev/null +++ b/app/src/main/res/drawable/bt_cancel_normnl.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_cancel_pressed.xml b/app/src/main/res/drawable/bt_cancel_pressed.xml new file mode 100644 index 0000000..7e12d4d --- /dev/null +++ b/app/src/main/res/drawable/bt_cancel_pressed.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_cancel_selector.xml b/app/src/main/res/drawable/bt_cancel_selector.xml new file mode 100644 index 0000000..10689e4 --- /dev/null +++ b/app/src/main/res/drawable/bt_cancel_selector.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_sure_normnl.xml b/app/src/main/res/drawable/bt_sure_normnl.xml new file mode 100644 index 0000000..aec3440 --- /dev/null +++ b/app/src/main/res/drawable/bt_sure_normnl.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_sure_pressed.xml b/app/src/main/res/drawable/bt_sure_pressed.xml new file mode 100644 index 0000000..aec3440 --- /dev/null +++ b/app/src/main/res/drawable/bt_sure_pressed.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_sure_selector.xml b/app/src/main/res/drawable/bt_sure_selector.xml new file mode 100644 index 0000000..ac9ba40 --- /dev/null +++ b/app/src/main/res/drawable/bt_sure_selector.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/custom_dialog.xml b/app/src/main/res/layout-land/custom_dialog.xml new file mode 100644 index 0000000..a7b4ead --- /dev/null +++ b/app/src/main/res/layout-land/custom_dialog.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + +