imageViews) {
+ this.mImageViews = imageViews;
+ }
+
+ @Override
+ public int getCount() {
+ return mImageViews == null ? 0 : mImageViews.size();
+ }
+
+ @Override
+ public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
+ return view == object;
+
+ }
+
+ @NonNull
+ @Override
+ public Object instantiateItem(@NonNull ViewGroup container, int position) {
+ // 给 container 添加一个view
+ container.addView(mImageViews.get(position));
+ // 返回一个和该view相对的object
+ return mImageViews.get(position);
+ }
+
+ @Override
+ public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
+ container.removeView(mImageViews.get(position));
+ }
+}
diff --git a/app/src/main/java/com/uiui/videoplayer/base/BGABaseAdapterUtil.java b/app/src/main/java/com/uiui/videoplayer/base/BGABaseAdapterUtil.java
new file mode 100644
index 0000000..813d984
--- /dev/null
+++ b/app/src/main/java/com/uiui/videoplayer/base/BGABaseAdapterUtil.java
@@ -0,0 +1,88 @@
+package com.uiui.videoplayer.base;
+
+import android.app.Application;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import androidx.annotation.ColorRes;
+import androidx.annotation.DimenRes;
+import android.util.Log;
+import android.util.TypedValue;
+
+import java.util.List;
+
+/**
+ * 作者:王浩 邮件:bingoogolapple@gmail.com
+ * 创建时间:17/1/6 上午4:04
+ * 描述:
+ */
+public class BGABaseAdapterUtil {
+ private static final Application sApp;
+
+ static {
+ Application app = null;
+ try {
+ app = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null);
+ if (app == null)
+ throw new IllegalStateException("Static initialization of Applications must be on main thread.");
+ } catch (final Exception e) {
+ Log.e(BGABaseAdapterUtil.class.getSimpleName(), "Failed to get current application from AppGlobals." + e.getMessage());
+ try {
+ app = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null);
+ } catch (final Exception ex) {
+ Log.e(BGABaseAdapterUtil.class.getSimpleName(), "Failed to get current application from ActivityThread." + e.getMessage());
+ }
+ } finally {
+ sApp = app;
+ }
+ }
+
+ private BGABaseAdapterUtil() {
+ }
+
+ public static Application getApp() {
+ return sApp;
+ }
+
+ public static int dp2px(float dpValue) {
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, getApp().getResources().getDisplayMetrics());
+ }
+
+ public static int sp2px(float dpValue) {
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, dpValue, getApp().getResources().getDisplayMetrics());
+ }
+
+ public static int getDimensionPixelOffset(@DimenRes int resId) {
+ return getApp().getResources().getDimensionPixelOffset(resId);
+ }
+
+ public static int getColor(@ColorRes int resId) {
+ return getApp().getResources().getColor(resId);
+ }
+
+ public static Drawable rotateBitmap(Bitmap inputBitmap) {
+ Matrix matrix = new Matrix();
+ matrix.setRotate(90, (float) inputBitmap.getWidth() / 2, (float) inputBitmap.getHeight() / 2);
+
+ float outputX = inputBitmap.getHeight();
+ float outputY = 0;
+
+ final float[] values = new float[9];
+ matrix.getValues(values);
+ float x1 = values[Matrix.MTRANS_X];
+ float y1 = values[Matrix.MTRANS_Y];
+ matrix.postTranslate(outputX - x1, outputY - y1);
+ Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap.getHeight(), inputBitmap.getWidth(), Bitmap.Config.ARGB_8888);
+ Paint paint = new Paint();
+ Canvas canvas = new Canvas(outputBitmap);
+ canvas.drawBitmap(inputBitmap, matrix, paint);
+ return new BitmapDrawable(null, outputBitmap);
+ }
+
+ public static boolean isListNotEmpty(List list) {
+ return list != null && !list.isEmpty();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/uiui/videoplayer/base/BGAGridDivider.java b/app/src/main/java/com/uiui/videoplayer/base/BGAGridDivider.java
new file mode 100644
index 0000000..8a95748
--- /dev/null
+++ b/app/src/main/java/com/uiui/videoplayer/base/BGAGridDivider.java
@@ -0,0 +1,58 @@
+package com.uiui.videoplayer.base;
+
+import android.graphics.Rect;
+import android.view.View;
+
+import androidx.annotation.DimenRes;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * 作者:王浩 邮件:bingoogolapple@gmail.com
+ * 创建时间:17/1/9 下午11:12
+ * 描述:
+ */
+public class BGAGridDivider extends RecyclerView.ItemDecoration {
+ private int mSpace;
+
+ private BGAGridDivider(int space) {
+ mSpace = space;
+ }
+
+ /**
+ * 设置间距资源 id
+ *
+ * @param resId
+ * @return
+ */
+ public static BGAGridDivider newInstanceWithSpaceRes(@DimenRes int resId) {
+ return new BGAGridDivider(BGABaseAdapterUtil.getDimensionPixelOffset(resId));
+ }
+
+ /**
+ * 设置间距
+ *
+ * @param spaceDp 单位为 dp
+ * @return
+ */
+ public static BGAGridDivider newInstanceWithSpaceDp(int spaceDp) {
+ return new BGAGridDivider(BGABaseAdapterUtil.dp2px(spaceDp));
+ }
+
+ /**
+ * 设置间距
+ *
+ * @param spacePx 单位为 px
+ * @return
+ */
+ public static BGAGridDivider newInstanceWithSpacePx(int spacePx) {
+ return new BGAGridDivider(spacePx);
+ }
+
+ @Override
+ public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+ outRect.left = mSpace;
+ outRect.right = mSpace;
+ outRect.top = mSpace;
+ outRect.bottom = mSpace;
+ }
+}
diff --git a/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java b/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java
index bc13a53..26758b2 100644
--- a/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java
+++ b/app/src/main/java/com/uiui/videoplayer/base/BaseLightActivity.java
@@ -1,5 +1,6 @@
package com.uiui.videoplayer.base;
+import android.graphics.Color;
import android.os.Bundle;
import androidx.annotation.CallSuper;
@@ -61,17 +62,19 @@ public abstract class BaseLightActivity extends AppCompatActivity implements Lif
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(ActivityEvent.CREATE);
// StatusBarUtil.init(this);
+ setContentView(this.getLayoutId());
UltimateBarX.statusBar(this)
- .transparent()
- .colorRes(R.color.colorPrimaryDark)
- .light(true)
+// .transparent()
+ .colorRes(R.color.colorAccent)
+ .fitWindow(true)
+ .light(false)
.apply();
UltimateBarX.navigationBar(this)
.transparent()
- .colorRes(R.color.colorPrimaryDark)
- .light(true)
+// .color(Color.TRANSPARENT)
+ .fitWindow(false)
+ .light(false)
.apply();
- setContentView(this.getLayoutId());
initView();
initData();
}
diff --git a/app/src/main/java/com/uiui/videoplayer/base/GridSpaceItemDecoration.java b/app/src/main/java/com/uiui/videoplayer/base/GridSpaceItemDecoration.java
new file mode 100644
index 0000000..57a7aea
--- /dev/null
+++ b/app/src/main/java/com/uiui/videoplayer/base/GridSpaceItemDecoration.java
@@ -0,0 +1,59 @@
+package com.uiui.videoplayer.base;
+
+import android.graphics.Rect;
+import android.util.Log;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * 描述 : RecyclerView GridLayoutManager 等间距。
+ *
+ * 等间距需满足两个条件:
+ * 1.各个模块的大小相等,即 各列的left+right 值相等;
+ * 2.各列的间距相等,即 前列的right + 后列的left = 列间距;
+ *
+ * 在{@link #getItemOffsets(Rect, View, RecyclerView, RecyclerView.State)} 中针对 outRect 的left 和right 满足这两个条件即可
+ *
+ * 作者 : shiguotao
+ * 版本 : V1
+ * 创建时间 : 2020/3/19 4:54 PM
+ */
+public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration {
+
+ private final String TAG = "GridSpaceItemDecoration";
+
+ private int mSpanCount;//横条目数量
+ private int mRowSpacing;//行间距
+ private int mColumnSpacing;// 列间距
+
+ /**
+ * @param spanCount 列数
+ * @param rowSpacing 行间距
+ * @param columnSpacing 列间距
+ */
+ public GridSpaceItemDecoration(int spanCount, int rowSpacing, int columnSpacing) {
+ this.mSpanCount = spanCount;
+ this.mRowSpacing = rowSpacing;
+ this.mColumnSpacing = columnSpacing;
+ }
+
+ @Override
+ public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
+ int position = parent.getChildAdapterPosition(view); // 获取view 在adapter中的位置。
+ int column = position % mSpanCount; // view 所在的列
+
+ outRect.left = column * mColumnSpacing / mSpanCount; // column * (列间距 * (1f / 列数))
+ outRect.right = mColumnSpacing - (column + 1) * mColumnSpacing / mSpanCount; // 列间距 - (column + 1) * (列间距 * (1f /列数))
+
+ Log.e(TAG, "position:" + position
+ + " columnIndex: " + column
+ + " left,right ->" + outRect.left + "," + outRect.right);
+
+ // 如果position > 行数,说明不是在第一行,则不指定行高,其他行的上间距为 top=mRowSpacing
+ if (position >= mSpanCount) {
+ outRect.top = mRowSpacing; // item top
+ }
+ }
+}
diff --git a/app/src/main/java/com/uiui/videoplayer/base/ScaleCircleNavigator.java b/app/src/main/java/com/uiui/videoplayer/base/ScaleCircleNavigator.java
new file mode 100644
index 0000000..53ef03b
--- /dev/null
+++ b/app/src/main/java/com/uiui/videoplayer/base/ScaleCircleNavigator.java
@@ -0,0 +1,323 @@
+package com.uiui.videoplayer.base;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PointF;
+import android.util.SparseArray;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+
+import net.lucode.hackware.magicindicator.NavigatorHelper;
+import net.lucode.hackware.magicindicator.abs.IPagerNavigator;
+import net.lucode.hackware.magicindicator.buildins.ArgbEvaluatorHolder;
+import net.lucode.hackware.magicindicator.buildins.UIUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+// _oo0oo_
+// o8888888o
+// 88" . "88
+// (| -_- |)
+// 0\ = /0
+// ___/`---'\___
+// .' \\| |// '.
+// / \\||| : |||// \
+// / _||||| -:- |||||- \
+// | | \\\ - /// | |
+// | \_| ''\---/'' |_/ |
+// \ .-\__ '-' ___/-. /
+// ___'. .' /--.--\ `. .'___
+// ."" '< `.___\_<|>_/___.' >' "".
+// | | : `- \`.;`\ _ /`;.`/ - ` : | |
+// \ \ `_. \_ __\ /__ _/ .-` / /
+// =====`-.____`.___ \_____/___.-`___.-'=====
+// `=---='
+//
+//
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// 佛祖保佑 永无BUG
+
+/**
+ * 类似CircleIndicator的效果
+ * Created by hackware on 2016/9/3.
+ */
+
+public class ScaleCircleNavigator extends View implements IPagerNavigator, NavigatorHelper.OnNavigatorScrollListener {
+ private int mMinRadius;
+ private int mMaxRadius;
+ private int mNormalCircleColor = Color.LTGRAY;
+ private int mSelectedCircleColor = Color.GRAY;
+ private int mCircleSpacing;
+ private int mCircleCount;
+
+ private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private List mCirclePoints = new ArrayList();
+ private SparseArray mCircleRadiusArray = new SparseArray();
+
+ // 事件回调
+ private boolean mTouchable;
+ private ScaleCircleNavigator.OnCircleClickListener mCircleClickListener;
+ private float mDownX;
+ private float mDownY;
+ private int mTouchSlop;
+
+ private boolean mFollowTouch = true; // 是否跟随手指滑动
+ private NavigatorHelper mNavigatorHelper = new NavigatorHelper();
+ private Interpolator mStartInterpolator = new LinearInterpolator();
+
+ public ScaleCircleNavigator(Context context) {
+ super(context);
+ init(context);
+ }
+
+ private void init(Context context) {
+ mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+ mMinRadius = UIUtil.dip2px(context, 3);
+ mMaxRadius = UIUtil.dip2px(context, 4);
+ mCircleSpacing = UIUtil.dip2px(context, 8);
+ mNavigatorHelper.setNavigatorScrollListener(this);
+ mNavigatorHelper.setSkimOver(true);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
+ }
+
+ private int measureWidth(int widthMeasureSpec) {
+ int mode = MeasureSpec.getMode(widthMeasureSpec);
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+ int result = 0;
+ switch (mode) {
+ case MeasureSpec.EXACTLY:
+ result = width;
+ break;
+ case MeasureSpec.AT_MOST:
+ case MeasureSpec.UNSPECIFIED:
+ if (mCircleCount <= 0) {
+ result = getPaddingLeft() + getPaddingRight();
+ } else {
+ result = (mCircleCount - 1) * mMinRadius * 2 + mMaxRadius * 2 + (mCircleCount - 1) * mCircleSpacing + getPaddingLeft() + getPaddingRight();
+ }
+ break;
+ default:
+ break;
+ }
+ return result;
+ }
+
+ private int measureHeight(int heightMeasureSpec) {
+ int mode = MeasureSpec.getMode(heightMeasureSpec);
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+ int result = 0;
+ switch (mode) {
+ case MeasureSpec.EXACTLY:
+ result = height;
+ break;
+ case MeasureSpec.AT_MOST:
+ case MeasureSpec.UNSPECIFIED:
+ result = mMaxRadius * 2 + getPaddingTop() + getPaddingBottom();
+ break;
+ default:
+ break;
+ }
+ return result;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ for (int i = 0, j = mCirclePoints.size(); i < j; i++) {
+ PointF point = mCirclePoints.get(i);
+ float radius = mCircleRadiusArray.get(i, (float) mMinRadius);
+ mPaint.setColor(ArgbEvaluatorHolder.eval((radius - mMinRadius) / (mMaxRadius - mMinRadius), mNormalCircleColor, mSelectedCircleColor));
+ canvas.drawCircle(point.x, getHeight() / 2.0f, radius, mPaint);
+ }
+ }
+
+ private void prepareCirclePoints() {
+ mCirclePoints.clear();
+ if (mCircleCount > 0) {
+ int y = Math.round(getHeight() / 2.0f);
+ int centerSpacing = mMinRadius * 2 + mCircleSpacing;
+ int startX = mMaxRadius + getPaddingLeft();
+ for (int i = 0; i < mCircleCount; i++) {
+ PointF pointF = new PointF(startX, y);
+ mCirclePoints.add(pointF);
+ startX += centerSpacing;
+ }
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ float x = event.getX();
+ float y = event.getY();
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (mTouchable) {
+ mDownX = x;
+ mDownY = y;
+ return true;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mCircleClickListener != null) {
+ if (Math.abs(x - mDownX) <= mTouchSlop && Math.abs(y - mDownY) <= mTouchSlop) {
+ float max = Float.MAX_VALUE;
+ int index = 0;
+ for (int i = 0; i < mCirclePoints.size(); i++) {
+ PointF pointF = mCirclePoints.get(i);
+ float offset = Math.abs(pointF.x - x);
+ if (offset < max) {
+ max = offset;
+ index = i;
+ }
+ }
+ mCircleClickListener.onClick(index);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ mNavigatorHelper.onPageScrolled(position, positionOffset, positionOffsetPixels);
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ mNavigatorHelper.onPageSelected(position);
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ mNavigatorHelper.onPageScrollStateChanged(state);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ prepareCirclePoints();
+ }
+
+ @Override
+ public void notifyDataSetChanged() {
+ prepareCirclePoints();
+ requestLayout();
+ }
+
+ @Override
+ public void onAttachToMagicIndicator() {
+ }
+
+ @Override
+ public void onDetachFromMagicIndicator() {
+ }
+
+ public void setMinRadius(int minRadius) {
+ mMinRadius = minRadius;
+ prepareCirclePoints();
+ invalidate();
+ }
+
+ public void setMaxRadius(int maxRadius) {
+ mMaxRadius = maxRadius;
+ prepareCirclePoints();
+ invalidate();
+ }
+
+ public void setNormalCircleColor(int normalCircleColor) {
+ mNormalCircleColor = normalCircleColor;
+ invalidate();
+ }
+
+ public void setSelectedCircleColor(int selectedCircleColor) {
+ mSelectedCircleColor = selectedCircleColor;
+ invalidate();
+ }
+
+ public void setCircleSpacing(int circleSpacing) {
+ mCircleSpacing = circleSpacing;
+ prepareCirclePoints();
+ invalidate();
+ }
+
+ public void setStartInterpolator(Interpolator startInterpolator) {
+ mStartInterpolator = startInterpolator;
+ if (mStartInterpolator == null) {
+ mStartInterpolator = new LinearInterpolator();
+ }
+ }
+
+ public void setCircleCount(int count) {
+ mCircleCount = count; // 此处不调用invalidate,让外部调用notifyDataSetChanged
+ mNavigatorHelper.setTotalCount(mCircleCount);
+ }
+
+ public void setTouchable(boolean touchable) {
+ mTouchable = touchable;
+ }
+
+ public void setFollowTouch(boolean followTouch) {
+ mFollowTouch = followTouch;
+ }
+
+ public void setSkimOver(boolean skimOver) {
+ mNavigatorHelper.setSkimOver(skimOver);
+ }
+
+ public void setCircleClickListener(OnCircleClickListener circleClickListener) {
+ if (!mTouchable) {
+ mTouchable = true;
+ }
+ mCircleClickListener = circleClickListener;
+ }
+
+ @Override
+ public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) {
+ if (mFollowTouch) {
+ float radius = mMinRadius + (mMaxRadius - mMinRadius) * mStartInterpolator.getInterpolation(enterPercent);
+ mCircleRadiusArray.put(index, radius);
+ invalidate();
+ }
+ }
+
+ @Override
+ public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) {
+ if (mFollowTouch) {
+ float radius = mMaxRadius + (mMinRadius - mMaxRadius) * mStartInterpolator.getInterpolation(leavePercent);
+ mCircleRadiusArray.put(index, radius);
+ invalidate();
+ }
+ }
+
+ @Override
+ public void onSelected(int index, int totalCount) {
+ if (!mFollowTouch) {
+ mCircleRadiusArray.put(index, (float) mMaxRadius);
+ invalidate();
+ }
+ }
+
+ @Override
+ public void onDeselected(int index, int totalCount) {
+ if (!mFollowTouch) {
+ mCircleRadiusArray.put(index, (float) mMinRadius);
+ invalidate();
+ }
+ }
+
+ public interface OnCircleClickListener {
+ void onClick(int index);
+ }
+}
diff --git a/app/src/main/java/com/uiui/videoplayer/bean/PhotoInfo.java b/app/src/main/java/com/uiui/videoplayer/bean/PhotoInfo.java
new file mode 100644
index 0000000..77bc914
--- /dev/null
+++ b/app/src/main/java/com/uiui/videoplayer/bean/PhotoInfo.java
@@ -0,0 +1,79 @@
+package com.uiui.videoplayer.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+
+import java.io.Serializable;
+
+public class PhotoInfo implements Serializable, Parcelable {
+ private static final long serialVersionUID = 4205742067664126524L;
+
+ String file_name;
+ String file;
+ long file_size;
+
+ protected PhotoInfo(Parcel in) {
+ file_name = in.readString();
+ file = in.readString();
+ file_size = in.readLong();
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public PhotoInfo createFromParcel(Parcel in) {
+ return new PhotoInfo(in);
+ }
+
+ @Override
+ public PhotoInfo[] newArray(int size) {
+ return new PhotoInfo[size];
+ }
+ };
+
+ public String getFile_name() {
+ return file_name;
+ }
+
+ public void setFile_name(String file_name) {
+ this.file_name = file_name;
+ }
+
+ public String getFile() {
+ return file;
+ }
+
+ public void setFile(String file) {
+ this.file = file;
+ }
+
+ public long getFile_size() {
+ return file_size;
+ }
+
+ public void setFile_size(long file_size) {
+ this.file_size = file_size;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(file_name);
+ dest.writeString(file);
+ dest.writeLong(file_size);
+ }
+}
diff --git a/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java b/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java
index 8ed474e..bd907d6 100644
--- a/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java
+++ b/app/src/main/java/com/uiui/videoplayer/manager/RemoteManager.java
@@ -13,6 +13,7 @@ import android.util.Log;
import com.tencent.mmkv.MMKV;
import com.uiui.sn.IGetInfoInterface;
import com.uiui.videoplayer.BuildConfig;
+import com.uiui.videoplayer.config.CommonConfig;
import java.util.HashSet;
import java.util.Set;
@@ -27,7 +28,7 @@ public class RemoteManager {
@SuppressLint("StaticFieldLeak")
private static RemoteManager sInstance;
private Context mContext;
- private MMKV mMMKV = MMKV.defaultMMKV();
+ private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
private IGetInfoInterface mIGetInfoInterface;
private ServiceConnection mServiceConnection;
@@ -117,7 +118,7 @@ public class RemoteManager {
public String getSerial() {
if (BuildConfig.DEBUG) {
- return "T1030B128GB22435020359";
+// return "T1030B128GB22435020359";
}
String sn = mMMKV.decodeString(serialKey, "");
Log.e(TAG, "sn: " + sn);
diff --git a/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java
index e23bbad..8061cb6 100644
--- a/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java
+++ b/app/src/main/java/com/uiui/videoplayer/network/NetInterfaceManager.java
@@ -13,6 +13,7 @@ import com.tencent.mmkv.MMKV;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.uiui.videoplayer.bean.BaseResponse;
+import com.uiui.videoplayer.bean.PhotoInfo;
import com.uiui.videoplayer.bean.VideoInfo;
import com.uiui.videoplayer.bean.LocalVideoInfo;
import com.uiui.videoplayer.config.CommonConfig;
@@ -21,6 +22,7 @@ import com.uiui.videoplayer.gson.GsonUtils;
import com.uiui.videoplayer.manager.ConnectManager;
import com.uiui.videoplayer.manager.ConnectMode;
import com.uiui.videoplayer.manager.RemoteManager;
+import com.uiui.videoplayer.network.api.HomePhotoApi;
import com.uiui.videoplayer.network.api.HomeVideoApi;
import com.uiui.videoplayer.network.interceptor.RepeatRequestInterceptor;
import com.uiui.videoplayer.utils.JGYUtils;
@@ -156,6 +158,13 @@ public class NetInterfaceManager {
.observeOn(AndroidSchedulers.mainThread());
}
+ public Observable>> getHomePhotoControl() {
+ return mRetrofit.create(HomePhotoApi.class)
+ .getHomePhoto(RemoteManager.getInstance().getSerial())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+
public interface onVideoPathCallback {
void setVideoList(ArrayList videoList);
@@ -385,4 +394,115 @@ public class NetInterfaceManager {
}
});
}
+
+ public interface onPhotoCallback {
+ void setPhotoList(ArrayList photoList);
+
+ void onComplete();
+ }
+
+ public void getHomePhoto(boolean refresh, BehaviorSubject lifecycle, onPhotoCallback callback) {
+ ConnectMode connectMode = ConnectMode.ONE_MINUTE;
+ if (refresh) {
+ connectMode = ConnectMode.DEFAULT;
+ }
+ if (ConnectManager.getInstance().isNeedConnect(UrlAddress.HOME_PHOTO, connectMode)) {
+ getHomePhoto(lifecycle, callback);
+ } else {
+ String jsonString = mCacheHelper.getAsString(UrlAddress.HOME_PHOTO);
+ //为 "" 是已经请求成功的
+ if (jsonString == null) {
+ getHomePhoto(lifecycle, callback);
+ } else {
+ getHomePhotoCache(jsonString, callback);
+ }
+ }
+ }
+
+
+ public void getHomePhotoCache(String jsonString, onPhotoCallback callback) {
+ Gson gson = new Gson();
+ Type type = new TypeToken>() {
+ }.getType();
+ try {
+ ArrayList photoInfoList = gson.fromJson(jsonString, type);
+ if (callback != null) {
+ callback.setPhotoList(photoInfoList);
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "getHomePhotoCache: " + e.getMessage());
+ if (callback != null) {
+ callback.setPhotoList(null);
+ }
+ }
+ if (callback != null) {
+ callback.onComplete();
+ }
+ }
+
+ public void getHomePhoto(BehaviorSubject lifecycle, onPhotoCallback callback) {
+ getHomePhotoControl()
+ .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY))
+ .subscribe(getHomePhotoObserver(callback));
+ }
+
+ public void getHomePhoto(onPhotoCallback callback) {
+ getHomePhotoControl()
+ .subscribe(getHomePhotoObserver(callback));
+ }
+
+ public void getHomePhoto() {
+ getHomePhotoControl()
+ .subscribe(getHomePhotoObserver(null));
+ }
+
+ private Observer>> getHomePhotoObserver(onPhotoCallback callback) {
+ return new Observer>>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getHomePhotoObserver", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse> listBaseResponse) {
+ Log.e("getHomePhotoObserver", "onNext: " + listBaseResponse);
+ int code = listBaseResponse.code;
+ if (code == 200) {
+ ArrayList photoInfoList = listBaseResponse.data;
+ for (PhotoInfo photoInfo : photoInfoList) {
+ if (!JGYUtils.getInstance().fileExists(photoInfo.getFile())) {
+ JGYUtils.getInstance().ariaDownload(photoInfo.getFile(), GsonUtils.getJsonObject(GsonUtils.toJSONString(photoInfo)));
+ }
+ }
+ mCacheHelper.put(UrlAddress.HOME_PHOTO, GsonUtils.toJSONString(photoInfoList));
+ if (callback != null) {
+ callback.setPhotoList(photoInfoList);
+ }
+ } else {
+ mCacheHelper.put(UrlAddress.HOME_PHOTO, "");
+ if (callback != null) {
+ callback.setPhotoList(null);
+ }
+ }
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("getHomePhotoObserver", "onError: " + e.getMessage());
+ ToastUtil.show("网络连接失败");
+ String jsonString = mCacheHelper.getAsString(UrlAddress.HOME_PHOTO);
+ getHomePhotoCache(jsonString, callback);
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("getHomePhotoObserver", "onComplete: ");
+ if (callback != null) {
+ callback.onComplete();
+ }
+ }
+ };
+ }
+
}
diff --git a/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java b/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java
index b61cc26..90bb098 100644
--- a/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java
+++ b/app/src/main/java/com/uiui/videoplayer/network/UrlAddress.java
@@ -4,7 +4,8 @@ public class UrlAddress {
/*主页接口*/
public static final String ROOT_URL = "https://led.zuoyepad.com/android/";
- /*获取视频*/
+ /*获取家庭视频*/
public static final String HOME_VIDEO ="File/getHomeVideo";
-
+ /*获取家庭照片*/
+ public static final String HOME_PHOTO ="File/getHomePhoto";
}
diff --git a/app/src/main/java/com/uiui/videoplayer/network/api/HomePhotoApi.java b/app/src/main/java/com/uiui/videoplayer/network/api/HomePhotoApi.java
new file mode 100644
index 0000000..30a4497
--- /dev/null
+++ b/app/src/main/java/com/uiui/videoplayer/network/api/HomePhotoApi.java
@@ -0,0 +1,19 @@
+package com.uiui.videoplayer.network.api;
+
+import com.uiui.videoplayer.bean.BaseResponse;
+import com.uiui.videoplayer.bean.PhotoInfo;
+import com.uiui.videoplayer.network.UrlAddress;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.reactivex.rxjava3.core.Observable;
+import retrofit2.http.GET;
+import retrofit2.http.Query;
+
+public interface HomePhotoApi {
+ @GET(UrlAddress.HOME_PHOTO)
+ Observable>> getHomePhoto(
+ @Query("sn") String sn
+ );
+}
diff --git a/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java b/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java
index 7d912c3..32f561c 100644
--- a/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java
+++ b/app/src/main/java/com/uiui/videoplayer/utils/VideoUtils.java
@@ -1,14 +1,7 @@
package com.uiui.videoplayer.utils;
-import android.content.Context;
-import android.os.Environment;
import android.util.Log;
-import androidx.core.content.ContextCompat;
-
-import com.arialyy.aria.core.Aria;
-import com.google.gson.JsonObject;
-
import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
@@ -36,12 +29,25 @@ public class VideoUtils {
return matches;
}
- private static final String[] extension = new String[]{
+ private static final String[] video_extension = new String[]{
".3gp", ".avi", ".flv", ".mkv", ".mov", ".mp4", ".webm"
};
+ private static final String[] picture_extension = new String[]{
+ ".jgp", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".jpe"
+ };
+
public static boolean isVideoFormat(String filePath) {
- for (String s : extension) {
+ for (String s : video_extension) {
+ if (filePath.endsWith(s)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean isPicFormat(String filePath) {
+ for (String s : picture_extension) {
if (filePath.endsWith(s)) {
return true;
}
diff --git a/app/src/main/res/drawable-hdpi/back.png b/app/src/main/res/drawable-hdpi/back.png
new file mode 100644
index 0000000..519aedb
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/back.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_pic.png b/app/src/main/res/drawable-hdpi/icon_pic.png
new file mode 100644
index 0000000..a5f56ee
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_pic.png differ
diff --git a/app/src/main/res/drawable-hdpi/icon_video.png b/app/src/main/res/drawable-hdpi/icon_video.png
new file mode 100644
index 0000000..1da2e48
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_video.png differ
diff --git a/app/src/main/res/drawable-hdpi/no_video_data.png b/app/src/main/res/drawable-hdpi/no_video_data.png
new file mode 100644
index 0000000..a2f45fd
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/no_video_data.png differ
diff --git a/app/src/main/res/drawable-hdpi/play.png b/app/src/main/res/drawable-hdpi/play.png
new file mode 100644
index 0000000..a4d33c3
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/play.png differ
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
deleted file mode 100644
index 2b068d1..0000000
--- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml
deleted file mode 100644
index ef24ea1..0000000
--- a/app/src/main/res/layout-land/activity_main.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_video.xml b/app/src/main/res/layout-land/activity_video.xml
new file mode 100644
index 0000000..33ad4ca
--- /dev/null
+++ b/app/src/main/res/layout-land/activity_video.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-port/activity_main.xml b/app/src/main/res/layout-port/activity_main.xml
deleted file mode 100644
index ef24ea1..0000000
--- a/app/src/main/res/layout-port/activity_main.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout-port/activity_video.xml b/app/src/main/res/layout-port/activity_video.xml
new file mode 100644
index 0000000..33ad4ca
--- /dev/null
+++ b/app/src/main/res/layout-port/activity_video.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_gallery.xml b/app/src/main/res/layout/activity_gallery.xml
new file mode 100644
index 0000000..888cea1
--- /dev/null
+++ b/app/src/main/res/layout/activity_gallery.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..a9f7bfd
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_preview.xml b/app/src/main/res/layout/activity_preview.xml
new file mode 100644
index 0000000..4fdd42f
--- /dev/null
+++ b/app/src/main/res/layout/activity_preview.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_pic.xml b/app/src/main/res/layout/item_pic.xml
new file mode 100644
index 0000000..1379d2b
--- /dev/null
+++ b/app/src/main/res/layout/item_pic.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 999ee77..21397b9 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 999ee77..21397b9 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 999ee77..21397b9 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 999ee77..21397b9 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 999ee77..21397b9 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 68563a9..adc2439 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -2,7 +2,9 @@
#6200EE
#3700B3
- #03DAC5
+ #4880ff
+ #f3f3f3
+
#FFFFFF
#000000
#333333
@@ -11,4 +13,144 @@
#d0d0d0
#9F9F9F
+
+ #00000000
+ #FFE2C59B
+ #FFFFFFF0
+ #FFFFFFE0
+ #FFFFFF00
+ #FFFFFAFA
+ #FFFFFAF0
+ #FFFFFACD
+ #FFFFF8DC
+ #FFFFF5EE
+ #FFFFF0F5
+ #FFFFEFD5
+ #FFFFEBCD
+ #FFFFE4E1
+ #FFFFE4C4
+ #FFFFE4B5
+ #FFFFDEAD
+ #FFFFDAB9
+ #FFFFD700
+ #FFFFC0CB
+ #FFFFB6C1
+ #FFFFA500
+ #FFFFA07A
+ #FFFF8C00
+ #FFFF7F50
+ #FFFF69B4
+ #FFFF6347
+ #FFFF4500
+ #FFFF1493
+ #FFFF00FF
+ #FFFF0000
+ #FFFDF5E6
+ #FFFAFAD2
+ #FFFAF0E6
+ #FFFAEBD7
+ #FFFA8072
+ #FFF8F8FF
+ #FFF5FFFA
+ #FFF5F5F5
+ #FFF5F5DC
+ #FFF5DEB3
+ #FFF4A460
+ #FFF0FFFF
+ #FFF0F8FF
+ #FFF0E68C
+ #FFF08080
+ #FFEEE8AA
+ #FFEE82EE
+ #FFE9967A
+ #FFE6E6FA
+ #FFE0FFFF
+ #FFDEB887
+ #FFDDA0DD
+ #FFDCDCDC
+ #FFDC143C
+ #FFDB7093
+ #FFDAA520
+ #FFDA70D6
+ #FFD8BFD8
+ #FFD3D3D3
+ #FFD2B48C
+ #FFD2691E
+ #FFCD853F
+ #FFCD5C5C
+ #FFC71585
+ #FFC0C0C0
+ #FFBDB76B
+ #FFBC8F8F
+ #FFBA55D3
+ #FFB8860B
+ #FFB22222
+ #FFB0E0E6
+ #FFB0C4DE
+ #FFAFEEEE
+ #FFADFF2F
+ #FFADD8E6
+ #FFA9A9A9
+ #FFA52A2A
+ #FFA0522D
+ #FF9932CC
+ #FF98FB98
+ #FF9400D3
+ #FF9370DB
+ #FF90EE90
+ #FF8FBC8F
+ #FF8B4513
+ #FF8B008B
+ #FF8B0000
+ #FF8A2BE2
+ #FF87CEFA
+ #FF87CEEB
+ #FF808080
+ #FF808000
+ #FF800080
+ #FF800000
+ #FF7FFFD4
+ #FF7FFF00
+ #FF7CFC00
+ #FF7B68EE
+ #FF778899
+ #FF708090
+ #FF6B8E23
+ #FF6A5ACD
+ #FF696969
+ #FF66CDAA
+ #FF6495ED
+ #FF5F9EA0
+ #FF556B2F
+ #FF4B0082
+ #FF48D1CC
+ #FF483D8B
+ #FF4682B4
+ #FF4169E1
+ #FF40E0D0
+ #FF3CB371
+ #FF32CD32
+ #FF2F4F4F
+ #FF2E8B57
+ #FF228B22
+ #FF20B2AA
+ #FF1E90FF
+ #FF191970
+ #FF00FFFF
+ #FF00FF7F
+ #FF00FF00
+ #FF00FA9A
+ #FF00CED1
+ #FF00BFFF
+ #FF008B8B
+ #FF008080
+ #FF008000
+ #FF006400
+ #FF0000FF
+ #FF0000CD
+ #FF00008B
+ #FF000080
+ #FF2B2B2B
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 1d8cfb3..c8050c6 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,13 +1,22 @@
-
-
+
+
+
+
+
+
+
+