list) {
+ if (list != null && list.size() > 0) {
+ map.clear();
+ for (DayFinish finish : list) {
+ map.put(finish.day, finish);
+ }
+ }
+ invalidate();
+ }
+
+ /**
+ * 月份增减
+ */
+ public void monthChange(int change) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(month);
+ calendar.add(Calendar.MONTH, change);
+ setMonth(getMonthStr(calendar.getTime()));
+ map.clear();
+ invalidate();
+ }
+
+ public void setOnClickListener(onClickListener listener) {
+ this.listener = listener;
+ }
+
+ interface onClickListener {
+
+ public abstract void onLeftRowClick();
+
+ public abstract void onRightRowClick();
+
+ public abstract void onTitleClick(String monthStr, Date month);
+
+ public abstract void onWeekClick(int weekIndex, String weekStr);
+
+ public abstract void onDayClick(int day, String dayStr, DayFinish finish);
+ }
+
+
+ /***********************接口API↑↑↑↑↑↑↑**************************/
+
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/calendar/DayFinish.java b/app/src/main/java/com/lechange/demo/localvideo/calendar/DayFinish.java
new file mode 100644
index 0000000..66da3da
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/calendar/DayFinish.java
@@ -0,0 +1,16 @@
+package com.lechange.demo.localvideo.calendar;
+
+/**
+ * Created by Administrator on 2019/3/7.
+ */
+
+public class DayFinish {
+ int day;
+ int all;
+ int finish;
+ public DayFinish(int day, int finish, int all) {
+ this.day = day;
+ this.all = all;
+ this.finish = finish;
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/calendar/FontUtil.java b/app/src/main/java/com/lechange/demo/localvideo/calendar/FontUtil.java
new file mode 100644
index 0000000..7da877c
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/calendar/FontUtil.java
@@ -0,0 +1,44 @@
+package com.lechange.demo.localvideo.calendar;
+
+import android.graphics.Paint;
+
+/**
+ * author : openXu
+ * create at : 2016/07/8 12:40
+ * blog : http://blog.csdn.net/xmxkf
+ * gitHub : https://github.com/openXu
+ * project : StockChart
+ * class name : FontUtil
+ * version : 1.0
+ * class describe:文字相关处理帮助类
+ */
+public class FontUtil {
+
+ /**
+ * @param paint
+ * @param str
+ * @return 返回指定笔和指定字符串的长度
+ * @add yujiangtao 16/8/5
+ */
+ public static float getFontlength(Paint paint, String str) {
+ return paint.measureText(str);
+ }
+ /**
+ * @return 返回指定笔的文字高度
+ * @add yujiangtao 16/8/5
+ */
+ public static float getFontHeight(Paint paint) {
+ Paint.FontMetrics fm = paint.getFontMetrics();
+ return fm.descent - fm.ascent;
+ }
+ /**
+ * @return 返回指定笔离文字顶部的基准距离
+ * @add yujiangtao 16/8/5
+ */
+ public static float getFontLeading(Paint paint) {
+ Paint.FontMetrics fm = paint.getFontMetrics();
+ return fm.leading- fm.ascent;
+ }
+
+
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/LayoutController.java b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/LayoutController.java
new file mode 100644
index 0000000..d0f941d
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/LayoutController.java
@@ -0,0 +1,83 @@
+package com.lechange.demo.localvideo.timeshaftbar;
+
+import android.content.Context;
+import android.util.Log;
+
+
+public class LayoutController {
+ protected int mWidth;
+ protected int mHeight;
+
+ protected int mScrollPosition;
+
+ protected int mContentLength = 0;
+ protected OverScroller mScroller;
+ protected int mPaddingLeft = 0;
+ protected int mPaddingRight = 0;
+ protected int mPaddingTop = 0;
+
+ public LayoutController(Context context) {
+ mScroller = new OverScroller(context);
+ }
+
+ public void setLayoutSize(int width,int height,int contentLength) {
+ mWidth = width;
+ mHeight = height;
+ mPaddingLeft = mWidth/2;
+ mPaddingRight = mWidth/2;
+ mContentLength = mPaddingLeft + contentLength + mPaddingRight;
+ }
+ public int getScrollLimit() {
+ int limit = mContentLength - mPaddingLeft - mPaddingRight;
+ return limit <= 0 ? 0 : limit;
+ }
+ //for scroll
+ public boolean computeScrollOffset() {
+ return mScroller.computeScrollOffset();
+ }
+ public void forceFinished() {
+ mScroller.forceFinished(true);
+ mScroller.startScroll(mScroller.getCurrX(), mScroller.getCurrY(),0, 0 , 0);
+ }
+ public int getPosition() {
+ return mScroller.getCurrX();
+ }
+
+
+ public int getPaddingLeft() {
+ return mPaddingLeft;
+ }
+
+ public int getPaddingRight() {
+ return mPaddingRight;
+ }
+
+ public void fling(int velocity, int min, int max) {
+ int currX = getPosition();
+ mScroller.fling(currX, 0, velocity, 0, min, max, 0, 0,0,0);
+ }
+ // Returns the input value x clamped to the range [min, max].
+ public static int clamp(int x, int min, int max) {
+ if (x > max) return max;
+ if (x < min) return min;
+ return x;
+ }
+ // Returns the distance that over the scroll limit.
+ public int startScroll(int distance, int min, int max) {
+ int currPosition = mScroller.getCurrX();
+ int newPosition = clamp(currPosition + distance, min, max);
+ if (newPosition != currPosition) {
+ Log.d("LayoutController","currPosition = " + currPosition +" distance = "+distance);
+ mScroller.startScroll(currPosition,0, newPosition - currPosition,0, 0);
+ }
+ return distance - newPosition;
+ }
+
+ public void setPosition(int postion) {
+ mScrollPosition = postion;
+ mScroller.startScroll(postion,mScroller.getCurrY(),0, 0 , 0);
+ }
+ public boolean isFinished() {
+ return mScroller.isFinished();
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/OverScroller.java b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/OverScroller.java
new file mode 100644
index 0000000..cb079cb
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/OverScroller.java
@@ -0,0 +1,952 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lechange.demo.localvideo.timeshaftbar;
+
+import android.content.Context;
+import android.hardware.SensorManager;
+import android.view.ViewConfiguration;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+
+
+/**
+ * This class encapsulates scrolling with the ability to overshoot the bounds
+ * of a scrolling operation. This class is a drop-in replacement for
+ * {@link android.widget.Scroller} in most cases.
+ */
+public class OverScroller {
+ private int mMode;
+
+ private final SplineOverScroller mScrollerX;
+ private final SplineOverScroller mScrollerY;
+
+ private Interpolator mInterpolator;
+
+ private final boolean mFlywheel;
+
+ private static final int DEFAULT_DURATION = 250;
+ private static final int SCROLL_MODE = 0;
+ private static final int FLING_MODE = 1;
+
+ /**
+ * Creates an OverScroller with a viscous fluid scroll interpolator and flywheel.
+ * @param context
+ */
+ public OverScroller(Context context) {
+ this(context, null);
+ }
+
+ /**
+ * Creates an OverScroller with flywheel enabled.
+ * @param context The context of this application.
+ * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
+ * be used.
+ */
+ public OverScroller(Context context, Interpolator interpolator) {
+ this(context, interpolator, true);
+ }
+
+ /**
+ * Creates an OverScroller.
+ * @param context The context of this application.
+ * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
+ * be used.
+ * @param flywheel If true, successive fling motions will keep on increasing scroll speed.
+ * @hide
+ */
+ public OverScroller(Context context, Interpolator interpolator, boolean flywheel) {
+ mInterpolator = interpolator;
+ mFlywheel = flywheel;
+ mScrollerX = new SplineOverScroller(context);
+ mScrollerY = new SplineOverScroller(context);
+ }
+
+ /**
+ * Creates an OverScroller with flywheel enabled.
+ * @param context The context of this application.
+ * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
+ * be used.
+ * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the
+ * velocity which is preserved in the bounce when the horizontal edge is reached. A null value
+ * means no bounce. This behavior is no longer supported and this coefficient has no effect.
+ * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This
+ * behavior is no longer supported and this coefficient has no effect.
+ * !deprecated Use {!link #OverScroller(Context, Interpolator, boolean)} instead.
+ */
+ public OverScroller(Context context, Interpolator interpolator,
+ float bounceCoefficientX, float bounceCoefficientY) {
+ this(context, interpolator, true);
+ }
+
+ /**
+ * Creates an OverScroller.
+ * @param context The context of this application.
+ * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
+ * be used.
+ * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the
+ * velocity which is preserved in the bounce when the horizontal edge is reached. A null value
+ * means no bounce. This behavior is no longer supported and this coefficient has no effect.
+ * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This
+ * behavior is no longer supported and this coefficient has no effect.
+ * @param flywheel If true, successive fling motions will keep on increasing scroll speed.
+ * !deprecated Use {!link OverScroller(Context, Interpolator, boolean)} instead.
+ */
+ public OverScroller(Context context, Interpolator interpolator,
+ float bounceCoefficientX, float bounceCoefficientY, boolean flywheel) {
+ this(context, interpolator, flywheel);
+ }
+
+ void setInterpolator(Interpolator interpolator) {
+ mInterpolator = interpolator;
+ }
+
+ /**
+ * The amount of friction applied to flings. The default value
+ * is {@link ViewConfiguration#getScrollFriction}.
+ *
+ * @param friction A scalar dimension-less value representing the coefficient of
+ * friction.
+ */
+ public final void setFriction(float friction) {
+ mScrollerX.setFriction(friction);
+ mScrollerY.setFriction(friction);
+ }
+
+ /**
+ *
+ * Returns whether the scroller has finished scrolling.
+ *
+ * @return True if the scroller has finished scrolling, false otherwise.
+ */
+ public final boolean isFinished() {
+ return mScrollerX.mFinished && mScrollerY.mFinished;
+ }
+
+ /**
+ * Force the finished field to a particular value. Contrary to
+ * {@link #abortAnimation()}, forcing the animation to finished
+ * does NOT cause the scroller to move to the final x and y
+ * position.
+ *
+ * @param finished The new finished value.
+ */
+ public final void forceFinished(boolean finished) {
+ mScrollerX.mFinished = mScrollerY.mFinished = finished;
+ }
+
+ /**
+ * Returns the current X offset in the scroll.
+ *
+ * @return The new X offset as an absolute distance from the origin.
+ */
+ public final int getCurrX() {
+ return mScrollerX.mCurrentPosition;
+ }
+
+ /**
+ * Returns the current Y offset in the scroll.
+ *
+ * @return The new Y offset as an absolute distance from the origin.
+ */
+ public final int getCurrY() {
+ return mScrollerY.mCurrentPosition;
+ }
+
+ /**
+ * Returns the absolute value of the current velocity.
+ *
+ * @return The original velocity less the deceleration, norm of the X and Y velocity vector.
+ */
+ public float getCurrVelocity() {
+ float squaredNorm = mScrollerX.mCurrVelocity * mScrollerX.mCurrVelocity;
+ squaredNorm += mScrollerY.mCurrVelocity * mScrollerY.mCurrVelocity;
+ return (float) Math.sqrt(squaredNorm);
+ }
+
+ /**
+ * Returns the start X offset in the scroll.
+ *
+ * @return The start X offset as an absolute distance from the origin.
+ */
+ public final int getStartX() {
+ return mScrollerX.mStart;
+ }
+
+ /**
+ * Returns the start Y offset in the scroll.
+ *
+ * @return The start Y offset as an absolute distance from the origin.
+ */
+ public final int getStartY() {
+ return mScrollerY.mStart;
+ }
+
+ /**
+ * Returns where the scroll will end. Valid only for "fling" scrolls.
+ *
+ * @return The final X offset as an absolute distance from the origin.
+ */
+ public final int getFinalX() {
+ return mScrollerX.mFinal;
+ }
+
+ /**
+ * Returns where the scroll will end. Valid only for "fling" scrolls.
+ *
+ * @return The final Y offset as an absolute distance from the origin.
+ */
+ public final int getFinalY() {
+ return mScrollerY.mFinal;
+ }
+
+ /**
+ * Returns how long the scroll event will take, in milliseconds.
+ *
+ * @return The duration of the scroll in milliseconds.
+ *
+ * @hide Pending removal once nothing depends on it
+ * @deprecated OverScrollers don't necessarily have a fixed duration.
+ * This function will lie to the best of its ability.
+ */
+ @Deprecated
+ public final int getDuration() {
+ return Math.max(mScrollerX.mDuration, mScrollerY.mDuration);
+ }
+
+ /**
+ * Extend the scroll animation. This allows a running animation to scroll
+ * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}.
+ *
+ * @param extend Additional time to scroll in milliseconds.
+ * @see #setFinalX(int)
+ * @see #setFinalY(int)
+ *
+ * @hide Pending removal once nothing depends on it
+ * @deprecated OverScrollers don't necessarily have a fixed duration.
+ * Instead of setting a new final position and extending
+ * the duration of an existing scroll, use startScroll
+ * to begin a new animation.
+ */
+ @Deprecated
+ public void extendDuration(int extend) {
+ mScrollerX.extendDuration(extend);
+ mScrollerY.extendDuration(extend);
+ }
+
+ /**
+ * Sets the final position (X) for this scroller.
+ *
+ * @param newX The new X offset as an absolute distance from the origin.
+ * @see #extendDuration(int)
+ * @see #setFinalY(int)
+ *
+ * @hide Pending removal once nothing depends on it
+ * @deprecated OverScroller's final position may change during an animation.
+ * Instead of setting a new final position and extending
+ * the duration of an existing scroll, use startScroll
+ * to begin a new animation.
+ */
+ @Deprecated
+ public void setFinalX(int newX) {
+ mScrollerX.setFinalPosition(newX);
+ }
+
+ /**
+ * Sets the final position (Y) for this scroller.
+ *
+ * @param newY The new Y offset as an absolute distance from the origin.
+ * @see #extendDuration(int)
+ * @see #setFinalX(int)
+ *
+ * @hide Pending removal once nothing depends on it
+ * @deprecated OverScroller's final position may change during an animation.
+ * Instead of setting a new final position and extending
+ * the duration of an existing scroll, use startScroll
+ * to begin a new animation.
+ */
+ @Deprecated
+ public void setFinalY(int newY) {
+ mScrollerY.setFinalPosition(newY);
+ }
+
+ /**
+ * Call this when you want to know the new location. If it returns true, the
+ * animation is not yet finished.
+ */
+ public boolean computeScrollOffset() {
+ if (isFinished()) {
+ return false;
+ }
+
+ switch (mMode) {
+ case SCROLL_MODE:
+ long time = AnimationUtils.currentAnimationTimeMillis();
+ // Any scroller can be used for time, since they were started
+ // together in scroll mode. We use X here.
+ final long elapsedTime = time - mScrollerX.mStartTime;
+
+ final int duration = mScrollerX.mDuration;
+ if (elapsedTime < duration) {
+ float q = (float) (elapsedTime) / duration;
+
+ if (mInterpolator == null) {
+ q = Scroller.viscousFluid(q);
+ } else {
+ q = mInterpolator.getInterpolation(q);
+ }
+
+ mScrollerX.updateScroll(q);
+ mScrollerY.updateScroll(q);
+ } else {
+ abortAnimation();
+ }
+ break;
+
+ case FLING_MODE:
+ if (!mScrollerX.mFinished) {
+ if (!mScrollerX.update()) {
+ if (!mScrollerX.continueWhenFinished()) {
+ mScrollerX.finish();
+ }
+ }
+ }
+
+ if (!mScrollerY.mFinished) {
+ if (!mScrollerY.update()) {
+ if (!mScrollerY.continueWhenFinished()) {
+ mScrollerY.finish();
+ }
+ }
+ }
+
+ break;
+ }
+
+ return true;
+ }
+
+ /**
+ * Start scrolling by providing a starting point and the distance to travel.
+ * The scroll will use the default value of 250 milliseconds for the
+ * duration.
+ *
+ * @param startX Starting horizontal scroll offset in pixels. Positive
+ * numbers will scroll the content to the left.
+ * @param startY Starting vertical scroll offset in pixels. Positive numbers
+ * will scroll the content up.
+ * @param dx Horizontal distance to travel. Positive numbers will scroll the
+ * content to the left.
+ * @param dy Vertical distance to travel. Positive numbers will scroll the
+ * content up.
+ */
+ public void startScroll(int startX, int startY, int dx, int dy) {
+ startScroll(startX, startY, dx, dy, DEFAULT_DURATION);
+ }
+
+ /**
+ * Start scrolling by providing a starting point and the distance to travel.
+ *
+ * @param startX Starting horizontal scroll offset in pixels. Positive
+ * numbers will scroll the content to the left.
+ * @param startY Starting vertical scroll offset in pixels. Positive numbers
+ * will scroll the content up.
+ * @param dx Horizontal distance to travel. Positive numbers will scroll the
+ * content to the left.
+ * @param dy Vertical distance to travel. Positive numbers will scroll the
+ * content up.
+ * @param duration Duration of the scroll in milliseconds.
+ */
+ public void startScroll(int startX, int startY, int dx, int dy, int duration) {
+ mMode = SCROLL_MODE;
+ mScrollerX.startScroll(startX, dx, duration);
+ mScrollerY.startScroll(startY, dy, duration);
+ }
+
+ /**
+ * Call this when you want to 'spring back' into a valid coordinate range.
+ *
+ * @param startX Starting X coordinate
+ * @param startY Starting Y coordinate
+ * @param minX Minimum valid X value
+ * @param maxX Maximum valid X value
+ * @param minY Minimum valid Y value
+ * @param maxY Minimum valid Y value
+ * @return true if a springback was initiated, false if startX and startY were
+ * already within the valid range.
+ */
+ public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) {
+ mMode = FLING_MODE;
+
+ // Make sure both methods are called.
+ final boolean spingbackX = mScrollerX.springback(startX, minX, maxX);
+ final boolean spingbackY = mScrollerY.springback(startY, minY, maxY);
+ return spingbackX || spingbackY;
+ }
+
+ public void fling(int startX, int startY, int velocityX, int velocityY,
+ int minX, int maxX, int minY, int maxY) {
+ fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0);
+ }
+
+ /**
+ * Start scrolling based on a fling gesture. The distance traveled will
+ * depend on the initial velocity of the fling.
+ *
+ * @param startX Starting point of the scroll (X)
+ * @param startY Starting point of the scroll (Y)
+ * @param velocityX Initial velocity of the fling (X) measured in pixels per
+ * second.
+ * @param velocityY Initial velocity of the fling (Y) measured in pixels per
+ * second
+ * @param minX Minimum X value. The scroller will not scroll past this point
+ * unless overX > 0. If overfling is allowed, it will use minX as
+ * a springback boundary.
+ * @param maxX Maximum X value. The scroller will not scroll past this point
+ * unless overX > 0. If overfling is allowed, it will use maxX as
+ * a springback boundary.
+ * @param minY Minimum Y value. The scroller will not scroll past this point
+ * unless overY > 0. If overfling is allowed, it will use minY as
+ * a springback boundary.
+ * @param maxY Maximum Y value. The scroller will not scroll past this point
+ * unless overY > 0. If overfling is allowed, it will use maxY as
+ * a springback boundary.
+ * @param overX Overfling range. If > 0, horizontal overfling in either
+ * direction will be possible.
+ * @param overY Overfling range. If > 0, vertical overfling in either
+ * direction will be possible.
+ */
+ public void fling(int startX, int startY, int velocityX, int velocityY,
+ int minX, int maxX, int minY, int maxY, int overX, int overY) {
+ // Continue a scroll or fling in progress
+ if (mFlywheel && !isFinished()) {
+ float oldVelocityX = mScrollerX.mCurrVelocity;
+ float oldVelocityY = mScrollerY.mCurrVelocity;
+ if (Math.signum(velocityX) == Math.signum(oldVelocityX) &&
+ Math.signum(velocityY) == Math.signum(oldVelocityY)) {
+ velocityX += oldVelocityX;
+ velocityY += oldVelocityY;
+ }
+ }
+
+ mMode = FLING_MODE;
+ mScrollerX.fling(startX, velocityX, minX, maxX, overX);
+ mScrollerY.fling(startY, velocityY, minY, maxY, overY);
+ }
+
+ /**
+ * Notify the scroller that we've reached a horizontal boundary.
+ * Normally the information to handle this will already be known
+ * when the animation is started, such as in a call to one of the
+ * fling functions. However there are cases where this cannot be known
+ * in advance. This function will transition the current motion and
+ * animate from startX to finalX as appropriate.
+ *
+ * @param startX Starting/current X position
+ * @param finalX Desired final X position
+ * @param overX Magnitude of overscroll allowed. This should be the maximum
+ * desired distance from finalX. Absolute value - must be positive.
+ */
+ public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) {
+ mScrollerX.notifyEdgeReached(startX, finalX, overX);
+ }
+
+ /**
+ * Notify the scroller that we've reached a vertical boundary.
+ * Normally the information to handle this will already be known
+ * when the animation is started, such as in a call to one of the
+ * fling functions. However there are cases where this cannot be known
+ * in advance. This function will animate a parabolic motion from
+ * startY to finalY.
+ *
+ * @param startY Starting/current Y position
+ * @param finalY Desired final Y position
+ * @param overY Magnitude of overscroll allowed. This should be the maximum
+ * desired distance from finalY. Absolute value - must be positive.
+ */
+ public void notifyVerticalEdgeReached(int startY, int finalY, int overY) {
+ mScrollerY.notifyEdgeReached(startY, finalY, overY);
+ }
+
+ /**
+ * Returns whether the current Scroller is currently returning to a valid position.
+ * Valid bounds were provided by the
+ * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method.
+ *
+ * One should check this value before calling
+ * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress
+ * to restore a valid position will then be stopped. The caller has to take into account
+ * the fact that the started scroll will start from an overscrolled position.
+ *
+ * @return true when the current position is overscrolled and in the process of
+ * interpolating back to a valid value.
+ */
+ public boolean isOverScrolled() {
+ return ((!mScrollerX.mFinished &&
+ mScrollerX.mState != SplineOverScroller.SPLINE) ||
+ (!mScrollerY.mFinished &&
+ mScrollerY.mState != SplineOverScroller.SPLINE));
+ }
+
+ /**
+ * Stops the animation. Contrary to {@link #forceFinished(boolean)},
+ * aborting the animating causes the scroller to move to the final x and y
+ * positions.
+ *
+ * @see #forceFinished(boolean)
+ */
+ public void abortAnimation() {
+ mScrollerX.finish();
+ mScrollerY.finish();
+ }
+
+ /**
+ * Returns the time elapsed since the beginning of the scrolling.
+ *
+ * @return The elapsed time in milliseconds.
+ *
+ * @hide
+ */
+ public int timePassed() {
+ final long time = AnimationUtils.currentAnimationTimeMillis();
+ final long startTime = Math.min(mScrollerX.mStartTime, mScrollerY.mStartTime);
+ return (int) (time - startTime);
+ }
+
+ /**
+ * @hide
+ */
+ public boolean isScrollingInDirection(float xvel, float yvel) {
+ final int dx = mScrollerX.mFinal - mScrollerX.mStart;
+ final int dy = mScrollerY.mFinal - mScrollerY.mStart;
+ return !isFinished() && Math.signum(xvel) == Math.signum(dx) &&
+ Math.signum(yvel) == Math.signum(dy);
+ }
+
+ static class SplineOverScroller {
+ // Initial position
+ private int mStart;
+
+ // Current position
+ private int mCurrentPosition;
+
+ // Final position
+ private int mFinal;
+
+ // Initial velocity
+ private int mVelocity;
+
+ // Current velocity
+ private float mCurrVelocity;
+
+ // Constant current deceleration
+ private float mDeceleration;
+
+ // Animation starting time, in system milliseconds
+ private long mStartTime;
+
+ // Animation duration, in milliseconds
+ private int mDuration;
+
+ // Duration to complete spline component of animation
+ private int mSplineDuration;
+
+ // Distance to travel along spline animation
+ private int mSplineDistance;
+
+ // Whether the animation is currently in progress
+ private boolean mFinished;
+
+ // The allowed overshot distance before boundary is reached.
+ private int mOver;
+
+ // Fling friction
+ private float mFlingFriction = ViewConfiguration.getScrollFriction();
+
+ // Current state of the animation.
+ private int mState = SPLINE;
+
+ // Constant gravity value, used in the deceleration phase.
+ private static final float GRAVITY = 2000.0f;
+
+ // A context-specific coefficient adjusted to physical values.
+ private float mPhysicalCoeff;
+
+ private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
+ private static final float INFLEXION = 0.35f; // Tension lines cross at (INFLEXION, 1)
+ private static final float START_TENSION = 0.5f;
+ private static final float END_TENSION = 1.0f;
+ private static final float P1 = START_TENSION * INFLEXION;
+ private static final float P2 = 1.0f - END_TENSION * (1.0f - INFLEXION);
+
+ private static final int NB_SAMPLES = 100;
+ private static final float[] SPLINE_POSITION = new float[NB_SAMPLES + 1];
+ private static final float[] SPLINE_TIME = new float[NB_SAMPLES + 1];
+
+ private static final int SPLINE = 0;
+ private static final int CUBIC = 1;
+ private static final int BALLISTIC = 2;
+
+ static {
+ float x_min = 0.0f;
+ float y_min = 0.0f;
+ for (int i = 0; i < NB_SAMPLES; i++) {
+ final float alpha = (float) i / NB_SAMPLES;
+
+ float x_max = 1.0f;
+ float x, tx, coef;
+ while (true) {
+ x = x_min + (x_max - x_min) / 2.0f;
+ coef = 3.0f * x * (1.0f - x);
+ tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x;
+ if (Math.abs(tx - alpha) < 1E-5) break;
+ if (tx > alpha) x_max = x;
+ else x_min = x;
+ }
+ SPLINE_POSITION[i] = coef * ((1.0f - x) * START_TENSION + x) + x * x * x;
+
+ float y_max = 1.0f;
+ float y, dy;
+ while (true) {
+ y = y_min + (y_max - y_min) / 2.0f;
+ coef = 3.0f * y * (1.0f - y);
+ dy = coef * ((1.0f - y) * START_TENSION + y) + y * y * y;
+ if (Math.abs(dy - alpha) < 1E-5) break;
+ if (dy > alpha) y_max = y;
+ else y_min = y;
+ }
+ SPLINE_TIME[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y;
+ }
+ SPLINE_POSITION[NB_SAMPLES] = SPLINE_TIME[NB_SAMPLES] = 1.0f;
+ }
+
+ void setFriction(float friction) {
+ mFlingFriction = friction;
+ }
+
+ SplineOverScroller(Context context) {
+ mFinished = true;
+ final float ppi = context.getResources().getDisplayMetrics().density * 160.0f;
+ mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2)
+ * 39.37f // inch/meter
+ * ppi
+ * 0.84f; // look and feel tuning
+ }
+
+ void updateScroll(float q) {
+ mCurrentPosition = mStart + Math.round(q * (mFinal - mStart));
+ }
+
+ /*
+ * Get a signed deceleration that will reduce the velocity.
+ */
+ static private float getDeceleration(int velocity) {
+ return velocity > 0 ? -GRAVITY : GRAVITY;
+ }
+
+ /*
+ * Modifies mDuration to the duration it takes to get from start to newFinal using the
+ * spline interpolation. The previous duration was needed to get to oldFinal.
+ */
+ private void adjustDuration(int start, int oldFinal, int newFinal) {
+ final int oldDistance = oldFinal - start;
+ final int newDistance = newFinal - start;
+ final float x = Math.abs((float) newDistance / oldDistance);
+ final int index = (int) (NB_SAMPLES * x);
+ if (index < NB_SAMPLES) {
+ final float x_inf = (float) index / NB_SAMPLES;
+ final float x_sup = (float) (index + 1) / NB_SAMPLES;
+ final float t_inf = SPLINE_TIME[index];
+ final float t_sup = SPLINE_TIME[index + 1];
+ final float timeCoef = t_inf + (x - x_inf) / (x_sup - x_inf) * (t_sup - t_inf);
+ mDuration *= timeCoef;
+ }
+ }
+
+ void startScroll(int start, int distance, int duration) {
+ mFinished = false;
+
+ mStart = start;
+ mFinal = start + distance;
+
+ mStartTime = AnimationUtils.currentAnimationTimeMillis();
+ mDuration = duration;
+
+ // Unused
+ mDeceleration = 0.0f;
+ mVelocity = 0;
+ }
+
+ void finish() {
+ mCurrentPosition = mFinal;
+ // Not reset since WebView relies on this value for fast fling.
+ // TODO: restore when WebView uses the fast fling implemented in this class.
+ // mCurrVelocity = 0.0f;
+ mFinished = true;
+ }
+
+ void setFinalPosition(int position) {
+ mFinal = position;
+ mFinished = false;
+ }
+
+ void extendDuration(int extend) {
+ final long time = AnimationUtils.currentAnimationTimeMillis();
+ final int elapsedTime = (int) (time - mStartTime);
+ mDuration = elapsedTime + extend;
+ mFinished = false;
+ }
+
+ boolean springback(int start, int min, int max) {
+ mFinished = true;
+
+ mStart = mFinal = start;
+ mVelocity = 0;
+
+ mStartTime = AnimationUtils.currentAnimationTimeMillis();
+ mDuration = 0;
+
+ if (start < min) {
+ startSpringback(start, min, 0);
+ } else if (start > max) {
+ startSpringback(start, max, 0);
+ }
+
+ return !mFinished;
+ }
+
+ private void startSpringback(int start, int end, int velocity) {
+ // mStartTime has been set
+ mFinished = false;
+ mState = CUBIC;
+ mStart = start;
+ mFinal = end;
+ final int delta = start - end;
+ mDeceleration = getDeceleration(delta);
+ // TODO take velocity into account
+ mVelocity = -delta; // only sign is used
+ mOver = Math.abs(delta);
+ mDuration = (int) (1000.0 * Math.sqrt(-2.0 * delta / mDeceleration));
+ }
+
+ void fling(int start, int velocity, int min, int max, int over) {
+ mOver = over;
+ mFinished = false;
+ mCurrVelocity = mVelocity = velocity;
+ mDuration = mSplineDuration = 0;
+ mStartTime = AnimationUtils.currentAnimationTimeMillis();
+ mCurrentPosition = mStart = start;
+
+ if (start > max || start < min) {
+ startAfterEdge(start, min, max, velocity);
+ return;
+ }
+
+ mState = SPLINE;
+ double totalDistance = 0.0;
+
+ if (velocity != 0) {
+ mDuration = mSplineDuration = getSplineFlingDuration(velocity);
+ totalDistance = getSplineFlingDistance(velocity);
+ }
+
+ mSplineDistance = (int) (totalDistance * Math.signum(velocity));
+ mFinal = start + mSplineDistance;
+
+ // Clamp to a valid final position
+ if (mFinal < min) {
+ adjustDuration(mStart, mFinal, min);
+ mFinal = min;
+ }
+
+ if (mFinal > max) {
+ adjustDuration(mStart, mFinal, max);
+ mFinal = max;
+ }
+ }
+
+ private double getSplineDeceleration(int velocity) {
+ return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff));
+ }
+
+ private double getSplineFlingDistance(int velocity) {
+ final double l = getSplineDeceleration(velocity);
+ final double decelMinusOne = DECELERATION_RATE - 1.0;
+ return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
+ }
+
+ /* Returns the duration, expressed in milliseconds */
+ private int getSplineFlingDuration(int velocity) {
+ final double l = getSplineDeceleration(velocity);
+ final double decelMinusOne = DECELERATION_RATE - 1.0;
+ return (int) (1000.0 * Math.exp(l / decelMinusOne));
+ }
+
+ private void fitOnBounceCurve(int start, int end, int velocity) {
+ // Simulate a bounce that started from edge
+ final float durationToApex = - velocity / mDeceleration;
+ final float distanceToApex = velocity * velocity / 2.0f / Math.abs(mDeceleration);
+ final float distanceToEdge = Math.abs(end - start);
+ final float totalDuration = (float) Math.sqrt(
+ 2.0 * (distanceToApex + distanceToEdge) / Math.abs(mDeceleration));
+ mStartTime -= (int) (1000.0f * (totalDuration - durationToApex));
+ mStart = end;
+ mVelocity = (int) (- mDeceleration * totalDuration);
+ }
+
+ private void startBounceAfterEdge(int start, int end, int velocity) {
+ mDeceleration = getDeceleration(velocity == 0 ? start - end : velocity);
+ fitOnBounceCurve(start, end, velocity);
+ onEdgeReached();
+ }
+
+ private void startAfterEdge(int start, int min, int max, int velocity) {
+ if (start > min && start < max) {
+ mFinished = true;
+ return;
+ }
+ final boolean positive = start > max;
+ final int edge = positive ? max : min;
+ final int overDistance = start - edge;
+ boolean keepIncreasing = overDistance * velocity >= 0;
+ if (keepIncreasing) {
+ // Will result in a bounce or a to_boundary depending on velocity.
+ startBounceAfterEdge(start, edge, velocity);
+ } else {
+ final double totalDistance = getSplineFlingDistance(velocity);
+ if (totalDistance > Math.abs(overDistance)) {
+ fling(start, velocity, positive ? min : start, positive ? start : max, mOver);
+ } else {
+ startSpringback(start, edge, velocity);
+ }
+ }
+ }
+
+ void notifyEdgeReached(int start, int end, int over) {
+ // mState is used to detect successive notifications
+ if (mState == SPLINE) {
+ mOver = over;
+ mStartTime = AnimationUtils.currentAnimationTimeMillis();
+ // We were in fling/scroll mode before: current velocity is such that distance to
+ // edge is increasing. This ensures that startAfterEdge will not start a new fling.
+ startAfterEdge(start, end, end, (int) mCurrVelocity);
+ }
+ }
+
+ private void onEdgeReached() {
+ // mStart, mVelocity and mStartTime were adjusted to their values when edge was reached.
+ float distance = mVelocity * mVelocity / (2.0f * Math.abs(mDeceleration));
+ final float sign = Math.signum(mVelocity);
+
+ if (distance > mOver) {
+ // Default deceleration is not sufficient to slow us down before boundary
+ mDeceleration = - sign * mVelocity * mVelocity / (2.0f * mOver);
+ distance = mOver;
+ }
+
+ mOver = (int) distance;
+ mState = BALLISTIC;
+ mFinal = mStart + (int) (mVelocity > 0 ? distance : -distance);
+ mDuration = - (int) (1000.0f * mVelocity / mDeceleration);
+ }
+
+ boolean continueWhenFinished() {
+ switch (mState) {
+ case SPLINE:
+ // Duration from start to null velocity
+ if (mDuration < mSplineDuration) {
+ // If the animation was clamped, we reached the edge
+ mStart = mFinal;
+ // TODO Better compute speed when edge was reached
+ mVelocity = (int) mCurrVelocity;
+ mDeceleration = getDeceleration(mVelocity);
+ mStartTime += mDuration;
+ onEdgeReached();
+ } else {
+ // Normal stop, no need to continue
+ return false;
+ }
+ break;
+ case BALLISTIC:
+ mStartTime += mDuration;
+ startSpringback(mFinal, mStart, 0);
+ break;
+ case CUBIC:
+ return false;
+ }
+
+ update();
+ return true;
+ }
+
+ /*
+ * Update the current position and velocity for current time. Returns
+ * true if update has been done and false if animation duration has been
+ * reached.
+ */
+ boolean update() {
+ final long time = AnimationUtils.currentAnimationTimeMillis();
+ final long currentTime = time - mStartTime;
+
+ if (currentTime > mDuration) {
+ return false;
+ }
+
+ double distance = 0.0;
+ switch (mState) {
+ case SPLINE: {
+ final float t = (float) currentTime / mSplineDuration;
+ final int index = (int) (NB_SAMPLES * t);
+ float distanceCoef = 1.f;
+ float velocityCoef = 0.f;
+ if (index < NB_SAMPLES) {
+ final float t_inf = (float) index / NB_SAMPLES;
+ final float t_sup = (float) (index + 1) / NB_SAMPLES;
+ final float d_inf = SPLINE_POSITION[index];
+ final float d_sup = SPLINE_POSITION[index + 1];
+ velocityCoef = (d_sup - d_inf) / (t_sup - t_inf);
+ distanceCoef = d_inf + (t - t_inf) * velocityCoef;
+ }
+
+ distance = distanceCoef * mSplineDistance;
+ mCurrVelocity = velocityCoef * mSplineDistance / mSplineDuration * 1000.0f;
+ break;
+ }
+
+ case BALLISTIC: {
+ final float t = currentTime / 1000.0f;
+ mCurrVelocity = mVelocity + mDeceleration * t;
+ distance = mVelocity * t + mDeceleration * t * t / 2.0f;
+ break;
+ }
+
+ case CUBIC: {
+ final float t = (float) (currentTime) / mDuration;
+ final float t2 = t * t;
+ final float sign = Math.signum(mVelocity);
+ distance = sign * mOver * (3.0f * t2 - 2.0f * t * t2);
+ mCurrVelocity = sign * mOver * 6.0f * (- t + t2);
+ break;
+ }
+ }
+
+ mCurrentPosition = mStart + (int) Math.round(distance);
+
+ return true;
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/Scroller.java b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/Scroller.java
new file mode 100644
index 0000000..061d347
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/Scroller.java
@@ -0,0 +1,586 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lechange.demo.localvideo.timeshaftbar;
+
+import android.content.Context;
+import android.hardware.SensorManager;
+import android.os.Build;
+import android.view.ViewConfiguration;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+
+
+/**
+ * This class encapsulates scrolling. You can use scrollers ({@link Scroller}
+ * or {@link OverScroller}) to collect the data you need to produce a scrolling
+ * animation—for example, in response to a fling gesture. Scrollers track
+ * scroll offsets for you over time, but they don't automatically apply those
+ * positions to your view. It's your responsibility to get and apply new
+ * coordinates at a rate that will make the scrolling animation look smooth.
+ *
+ * Here is a simple example:
+ *
+ * private Scroller mScroller = new Scroller(context);
+ * ...
+ * public void zoomIn() {
+ * // Revert any animation currently in progress
+ * mScroller.forceFinished(true);
+ * // Start scrolling by providing a starting point and
+ * // the distance to travel
+ * mScroller.startScroll(0, 0, 100, 0);
+ * // Invalidate to request a redraw
+ * invalidate();
+ * }
+ *
+ * To track the changing positions of the x/y coordinates, use
+ * {@link #computeScrollOffset}. The method returns a boolean to indicate
+ * whether the scroller is finished. If it isn't, it means that a fling or
+ * programmatic pan operation is still in progress. You can use this method to
+ * find the current offsets of the x and y coordinates, for example:
+ *
+ * if (mScroller.computeScrollOffset()) {
+ * // Get current x and y positions
+ * int currX = mScroller.getCurrX();
+ * int currY = mScroller.getCurrY();
+ * ...
+ * }
+ */
+public class Scroller {
+ private int mMode;
+
+ private int mStartX;
+ private int mStartY;
+ private int mFinalX;
+ private int mFinalY;
+
+ private int mMinX;
+ private int mMaxX;
+ private int mMinY;
+ private int mMaxY;
+
+ private int mCurrX;
+ private int mCurrY;
+ private long mStartTime;
+ private int mDuration;
+ private float mDurationReciprocal;
+ private float mDeltaX;
+ private float mDeltaY;
+ private boolean mFinished;
+ private Interpolator mInterpolator;
+ private boolean mFlywheel;
+
+ private float mVelocity;
+ private float mCurrVelocity;
+ private int mDistance;
+
+ private float mFlingFriction = ViewConfiguration.getScrollFriction();
+
+ private static final int DEFAULT_DURATION = 250;
+ private static final int SCROLL_MODE = 0;
+ private static final int FLING_MODE = 1;
+
+ private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
+ private static final float INFLEXION = 0.35f; // Tension lines cross at (INFLEXION, 1)
+ private static final float START_TENSION = 0.5f;
+ private static final float END_TENSION = 1.0f;
+ private static final float P1 = START_TENSION * INFLEXION;
+ private static final float P2 = 1.0f - END_TENSION * (1.0f - INFLEXION);
+
+ private static final int NB_SAMPLES = 100;
+ private static final float[] SPLINE_POSITION = new float[NB_SAMPLES + 1];
+ private static final float[] SPLINE_TIME = new float[NB_SAMPLES + 1];
+
+ private float mDeceleration;
+ private final float mPpi;
+
+ // A context-specific coefficient adjusted to physical values.
+ private float mPhysicalCoeff;
+
+ static {
+ float x_min = 0.0f;
+ float y_min = 0.0f;
+ for (int i = 0; i < NB_SAMPLES; i++) {
+ final float alpha = (float) i / NB_SAMPLES;
+
+ float x_max = 1.0f;
+ float x, tx, coef;
+ while (true) {
+ x = x_min + (x_max - x_min) / 2.0f;
+ coef = 3.0f * x * (1.0f - x);
+ tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x;
+ if (Math.abs(tx - alpha) < 1E-5) break;
+ if (tx > alpha) x_max = x;
+ else x_min = x;
+ }
+ SPLINE_POSITION[i] = coef * ((1.0f - x) * START_TENSION + x) + x * x * x;
+
+ float y_max = 1.0f;
+ float y, dy;
+ while (true) {
+ y = y_min + (y_max - y_min) / 2.0f;
+ coef = 3.0f * y * (1.0f - y);
+ dy = coef * ((1.0f - y) * START_TENSION + y) + y * y * y;
+ if (Math.abs(dy - alpha) < 1E-5) break;
+ if (dy > alpha) y_max = y;
+ else y_min = y;
+ }
+ SPLINE_TIME[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y;
+ }
+ SPLINE_POSITION[NB_SAMPLES] = SPLINE_TIME[NB_SAMPLES] = 1.0f;
+
+ // This controls the viscous fluid effect (how much of it)
+ sViscousFluidScale = 8.0f;
+ // must be set to 1.0 (used in viscousFluid())
+ sViscousFluidNormalize = 1.0f;
+ sViscousFluidNormalize = 1.0f / viscousFluid(1.0f);
+
+ }
+
+ private static float sViscousFluidScale;
+ private static float sViscousFluidNormalize;
+
+ /**
+ * Create a Scroller with the default duration and interpolator.
+ */
+ public Scroller(Context context) {
+ this(context, null);
+ }
+
+ /**
+ * Create a Scroller with the specified interpolator. If the interpolator is
+ * null, the default (viscous) interpolator will be used. "Flywheel" behavior will
+ * be in effect for apps targeting Honeycomb or newer.
+ */
+ public Scroller(Context context, Interpolator interpolator) {
+ this(context, interpolator,
+ context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB);
+ }
+
+ /**
+ * Create a Scroller with the specified interpolator. If the interpolator is
+ * null, the default (viscous) interpolator will be used. Specify whether or
+ * not to support progressive "flywheel" behavior in flinging.
+ */
+ public Scroller(Context context, Interpolator interpolator, boolean flywheel) {
+ mFinished = true;
+ mInterpolator = interpolator;
+ mPpi = context.getResources().getDisplayMetrics().density * 160.0f;
+ mDeceleration = computeDeceleration(ViewConfiguration.getScrollFriction());
+ mFlywheel = flywheel;
+
+ mPhysicalCoeff = computeDeceleration(0.84f); // look and feel tuning
+ }
+
+ /**
+ * The amount of friction applied to flings. The default value
+ * is {@link ViewConfiguration#getScrollFriction}.
+ *
+ * @param friction A scalar dimension-less value representing the coefficient of
+ * friction.
+ */
+ public final void setFriction(float friction) {
+ mDeceleration = computeDeceleration(friction);
+ mFlingFriction = friction;
+ }
+
+ private float computeDeceleration(float friction) {
+ return SensorManager.GRAVITY_EARTH // g (m/s^2)
+ * 39.37f // inch/meter
+ * mPpi // pixels per inch
+ * friction;
+ }
+
+ /**
+ *
+ * Returns whether the scroller has finished scrolling.
+ *
+ * @return True if the scroller has finished scrolling, false otherwise.
+ */
+ public final boolean isFinished() {
+ return mFinished;
+ }
+
+ /**
+ * Force the finished field to a particular value.
+ *
+ * @param finished The new finished value.
+ */
+ public final void forceFinished(boolean finished) {
+ mFinished = finished;
+ }
+
+ /**
+ * Returns how long the scroll event will take, in milliseconds.
+ *
+ * @return The duration of the scroll in milliseconds.
+ */
+ public final int getDuration() {
+ return mDuration;
+ }
+
+ /**
+ * Returns the current X offset in the scroll.
+ *
+ * @return The new X offset as an absolute distance from the origin.
+ */
+ public final int getCurrX() {
+ return mCurrX;
+ }
+
+ /**
+ * Returns the current Y offset in the scroll.
+ *
+ * @return The new Y offset as an absolute distance from the origin.
+ */
+ public final int getCurrY() {
+ return mCurrY;
+ }
+
+ /**
+ * Returns the current velocity.
+ *
+ * @return The original velocity less the deceleration. Result may be
+ * negative.
+ */
+ public float getCurrVelocity() {
+ return mMode == FLING_MODE ?
+ mCurrVelocity : mVelocity - mDeceleration * timePassed() / 2000.0f;
+ }
+
+ /**
+ * Returns the start X offset in the scroll.
+ *
+ * @return The start X offset as an absolute distance from the origin.
+ */
+ public final int getStartX() {
+ return mStartX;
+ }
+
+ /**
+ * Returns the start Y offset in the scroll.
+ *
+ * @return The start Y offset as an absolute distance from the origin.
+ */
+ public final int getStartY() {
+ return mStartY;
+ }
+
+ /**
+ * Returns where the scroll will end. Valid only for "fling" scrolls.
+ *
+ * @return The final X offset as an absolute distance from the origin.
+ */
+ public final int getFinalX() {
+ return mFinalX;
+ }
+
+ /**
+ * Returns where the scroll will end. Valid only for "fling" scrolls.
+ *
+ * @return The final Y offset as an absolute distance from the origin.
+ */
+ public final int getFinalY() {
+ return mFinalY;
+ }
+
+ /**
+ * Call this when you want to know the new location. If it returns true,
+ * the animation is not yet finished.
+ */
+ public boolean computeScrollOffset() {
+ if (mFinished) {
+ return false;
+ }
+
+ int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);
+
+ if (timePassed < mDuration) {
+ switch (mMode) {
+ case SCROLL_MODE:
+ float x = timePassed * mDurationReciprocal;
+
+ if (mInterpolator == null)
+ x = viscousFluid(x);
+ else
+ x = mInterpolator.getInterpolation(x);
+
+ mCurrX = mStartX + Math.round(x * mDeltaX);
+ mCurrY = mStartY + Math.round(x * mDeltaY);
+ break;
+ case FLING_MODE:
+ final float t = (float) timePassed / mDuration;
+ final int index = (int) (NB_SAMPLES * t);
+ float distanceCoef = 1.f;
+ float velocityCoef = 0.f;
+ if (index < NB_SAMPLES) {
+ final float t_inf = (float) index / NB_SAMPLES;
+ final float t_sup = (float) (index + 1) / NB_SAMPLES;
+ final float d_inf = SPLINE_POSITION[index];
+ final float d_sup = SPLINE_POSITION[index + 1];
+ velocityCoef = (d_sup - d_inf) / (t_sup - t_inf);
+ distanceCoef = d_inf + (t - t_inf) * velocityCoef;
+ }
+
+ mCurrVelocity = velocityCoef * mDistance / mDuration * 1000.0f;
+
+ mCurrX = mStartX + Math.round(distanceCoef * (mFinalX - mStartX));
+ // Pin to mMinX <= mCurrX <= mMaxX
+ mCurrX = Math.min(mCurrX, mMaxX);
+ mCurrX = Math.max(mCurrX, mMinX);
+
+ mCurrY = mStartY + Math.round(distanceCoef * (mFinalY - mStartY));
+ // Pin to mMinY <= mCurrY <= mMaxY
+ mCurrY = Math.min(mCurrY, mMaxY);
+ mCurrY = Math.max(mCurrY, mMinY);
+
+ if (mCurrX == mFinalX && mCurrY == mFinalY) {
+ mFinished = true;
+ }
+
+ break;
+ }
+ }
+ else {
+ mCurrX = mFinalX;
+ mCurrY = mFinalY;
+ mFinished = true;
+ }
+ return true;
+ }
+
+ /**
+ * Start scrolling by providing a starting point and the distance to travel.
+ * The scroll will use the default value of 250 milliseconds for the
+ * duration.
+ *
+ * @param startX Starting horizontal scroll offset in pixels. Positive
+ * numbers will scroll the content to the left.
+ * @param startY Starting vertical scroll offset in pixels. Positive numbers
+ * will scroll the content up.
+ * @param dx Horizontal distance to travel. Positive numbers will scroll the
+ * content to the left.
+ * @param dy Vertical distance to travel. Positive numbers will scroll the
+ * content up.
+ */
+ public void startScroll(int startX, int startY, int dx, int dy) {
+ startScroll(startX, startY, dx, dy, DEFAULT_DURATION);
+ }
+
+ /**
+ * Start scrolling by providing a starting point, the distance to travel,
+ * and the duration of the scroll.
+ *
+ * @param startX Starting horizontal scroll offset in pixels. Positive
+ * numbers will scroll the content to the left.
+ * @param startY Starting vertical scroll offset in pixels. Positive numbers
+ * will scroll the content up.
+ * @param dx Horizontal distance to travel. Positive numbers will scroll the
+ * content to the left.
+ * @param dy Vertical distance to travel. Positive numbers will scroll the
+ * content up.
+ * @param duration Duration of the scroll in milliseconds.
+ */
+ public void startScroll(int startX, int startY, int dx, int dy, int duration) {
+ mMode = SCROLL_MODE;
+ mFinished = false;
+ mDuration = duration;
+ mStartTime = AnimationUtils.currentAnimationTimeMillis();
+ mStartX = startX;
+ mStartY = startY;
+ mFinalX = startX + dx;
+ mFinalY = startY + dy;
+ mDeltaX = dx;
+ mDeltaY = dy;
+ mDurationReciprocal = 1.0f / (float) mDuration;
+ }
+
+ /**
+ * Start scrolling based on a fling gesture. The distance travelled will
+ * depend on the initial velocity of the fling.
+ *
+ * @param startX Starting point of the scroll (X)
+ * @param startY Starting point of the scroll (Y)
+ * @param velocityX Initial velocity of the fling (X) measured in pixels per
+ * second.
+ * @param velocityY Initial velocity of the fling (Y) measured in pixels per
+ * second
+ * @param minX Minimum X value. The scroller will not scroll past this
+ * point.
+ * @param maxX Maximum X value. The scroller will not scroll past this
+ * point.
+ * @param minY Minimum Y value. The scroller will not scroll past this
+ * point.
+ * @param maxY Maximum Y value. The scroller will not scroll past this
+ * point.
+ */
+ public void fling(int startX, int startY, int velocityX, int velocityY,
+ int minX, int maxX, int minY, int maxY) {
+ // Continue a scroll or fling in progress
+ if (mFlywheel && !mFinished) {
+ float oldVel = getCurrVelocity();
+
+ float dx = (float) (mFinalX - mStartX);
+ float dy = (float) (mFinalY - mStartY);
+ float hyp = (float) Math.sqrt(dx * dx + dy * dy);
+
+ float ndx = dx / hyp;
+ float ndy = dy / hyp;
+
+ float oldVelocityX = ndx * oldVel;
+ float oldVelocityY = ndy * oldVel;
+ if (Math.signum(velocityX) == Math.signum(oldVelocityX) &&
+ Math.signum(velocityY) == Math.signum(oldVelocityY)) {
+ velocityX += oldVelocityX;
+ velocityY += oldVelocityY;
+ }
+ }
+
+ mMode = FLING_MODE;
+ mFinished = false;
+
+ float velocity = (float) Math.sqrt(velocityX * velocityX + velocityY * velocityY);
+
+ mVelocity = velocity;
+ mDuration = getSplineFlingDuration(velocity);
+ mStartTime = AnimationUtils.currentAnimationTimeMillis();
+ mStartX = startX;
+ mStartY = startY;
+
+ float coeffX = velocity == 0 ? 1.0f : velocityX / velocity;
+ float coeffY = velocity == 0 ? 1.0f : velocityY / velocity;
+
+ double totalDistance = getSplineFlingDistance(velocity);
+ mDistance = (int) (totalDistance * Math.signum(velocity));
+
+ mMinX = minX;
+ mMaxX = maxX;
+ mMinY = minY;
+ mMaxY = maxY;
+
+ mFinalX = startX + (int) Math.round(totalDistance * coeffX);
+ // Pin to mMinX <= mFinalX <= mMaxX
+ mFinalX = Math.min(mFinalX, mMaxX);
+ mFinalX = Math.max(mFinalX, mMinX);
+
+ mFinalY = startY + (int) Math.round(totalDistance * coeffY);
+ // Pin to mMinY <= mFinalY <= mMaxY
+ mFinalY = Math.min(mFinalY, mMaxY);
+ mFinalY = Math.max(mFinalY, mMinY);
+ }
+
+ private double getSplineDeceleration(float velocity) {
+ return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff));
+ }
+
+ private int getSplineFlingDuration(float velocity) {
+ final double l = getSplineDeceleration(velocity);
+ final double decelMinusOne = DECELERATION_RATE - 1.0;
+ return (int) (1000.0 * Math.exp(l / decelMinusOne));
+ }
+
+ private double getSplineFlingDistance(float velocity) {
+ final double l = getSplineDeceleration(velocity);
+ final double decelMinusOne = DECELERATION_RATE - 1.0;
+ return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
+ }
+
+ static float viscousFluid(float x)
+ {
+ x *= sViscousFluidScale;
+ if (x < 1.0f) {
+ x -= (1.0f - (float) Math.exp(-x));
+ } else {
+ float start = 0.36787944117f; // 1/e == exp(-1)
+ x = 1.0f - (float) Math.exp(1.0f - x);
+ x = start + x * (1.0f - start);
+ }
+ x *= sViscousFluidNormalize;
+ return x;
+ }
+
+ /**
+ * Stops the animation. Contrary to {@link #forceFinished(boolean)},
+ * aborting the animating cause the scroller to move to the final x and y
+ * position
+ *
+ * @see #forceFinished(boolean)
+ */
+ public void abortAnimation() {
+ mCurrX = mFinalX;
+ mCurrY = mFinalY;
+ mFinished = true;
+ }
+
+ /**
+ * Extend the scroll animation. This allows a running animation to scroll
+ * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}.
+ *
+ * @param extend Additional time to scroll in milliseconds.
+ * @see #setFinalX(int)
+ * @see #setFinalY(int)
+ */
+ public void extendDuration(int extend) {
+ int passed = timePassed();
+ mDuration = passed + extend;
+ mDurationReciprocal = 1.0f / mDuration;
+ mFinished = false;
+ }
+
+ /**
+ * Returns the time elapsed since the beginning of the scrolling.
+ *
+ * @return The elapsed time in milliseconds.
+ */
+ public int timePassed() {
+ return (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);
+ }
+
+ /**
+ * Sets the final position (X) for this scroller.
+ *
+ * @param newX The new X offset as an absolute distance from the origin.
+ * @see #extendDuration(int)
+ * @see #setFinalY(int)
+ */
+ public void setFinalX(int newX) {
+ mFinalX = newX;
+ mDeltaX = mFinalX - mStartX;
+ mFinished = false;
+ }
+
+ /**
+ * Sets the final position (Y) for this scroller.
+ *
+ * @param newY The new Y offset as an absolute distance from the origin.
+ * @see #extendDuration(int)
+ * @see #setFinalX(int)
+ */
+ public void setFinalY(int newY) {
+ mFinalY = newY;
+ mDeltaY = mFinalY - mStartY;
+ mFinished = false;
+ }
+
+ /**
+ * @hide
+ */
+ public boolean isScrollingInDirection(float xvel, float yvel) {
+ return !mFinished && Math.signum(xvel) == Math.signum(mFinalX - mStartX) &&
+ Math.signum(yvel) == Math.signum(mFinalY - mStartY);
+ }
+}
+
diff --git a/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimebarTick.java b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimebarTick.java
new file mode 100644
index 0000000..47b2097
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimebarTick.java
@@ -0,0 +1,103 @@
+/*
+ * This source code is licensed under the MIT-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+package com.lechange.demo.localvideo.timeshaftbar;
+
+/**
+ * 时间轴显示的等级
+ */
+public class TimebarTick {
+ /**
+ * 时间轴总长度
+ */
+ private long viewLength;
+
+ /**
+ * 时间轴未缩放时的标准长度
+ */
+ private long standardViewLength;
+
+ /**
+ * 间隔距离
+ */
+ private float intervel;
+
+
+ /**
+ * 时间轴未缩放时的屏幕显示的时间(秒)
+ */
+ private int totalSecondsInOneScreen;
+
+ /**
+ * 时间轴中大刻度之间的时间间隔(秒)
+ */
+ private int maxTickInSecond;
+
+ /**
+ * 时间轴中小刻度之间的时间间隔(秒)
+ */
+ private int minTickInSecond;
+
+ /**
+ * 刻度显示的格式
+ */
+ private String dataPattern;
+
+ public long getViewLength() {
+ return viewLength;
+ }
+
+ public void setViewLength(long viewLength) {
+ this.viewLength = viewLength;
+ }
+
+ public int getTotalSecondsInOneScreen() {
+ return totalSecondsInOneScreen;
+ }
+
+ public void setTotalSecondsInOneScreen(int totalSecondsInOneScreen) {
+ this.totalSecondsInOneScreen = totalSecondsInOneScreen;
+ }
+
+ public int getMaxTickInSecond() {
+ return maxTickInSecond;
+ }
+
+ public void setMaxTickInSecond(int maxTickInSecond) {
+ this.maxTickInSecond = maxTickInSecond;
+ }
+
+ public int getMinTickInSecond() {
+ return minTickInSecond;
+ }
+
+ public void setMinTickInSecond(int minTickInSecond) {
+ this.minTickInSecond = minTickInSecond;
+ }
+
+ public String getDataPattern() {
+ return dataPattern;
+ }
+
+ public void setDataPattern(String dataPattern) {
+ this.dataPattern = dataPattern;
+ }
+
+ public long getStandardViewLength() {
+ return standardViewLength;
+ }
+
+ public void setStandardViewLength(long standardViewLength) {
+ this.standardViewLength = standardViewLength;
+ this.viewLength = this.standardViewLength;
+ }
+
+ public void setIntervel(float intervel) {
+ this.intervel = intervel;
+ }
+
+ public float getIntervel() {
+ return intervel;
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftBar.java b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftBar.java
new file mode 100644
index 0000000..278d776
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftBar.java
@@ -0,0 +1,731 @@
+package com.lechange.demo.localvideo.timeshaftbar;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.ScaleGestureDetector;
+import android.view.View;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * 项目名称:EZUIKitDemo
+ * 类描述:回放时间轴
+ * 创建人:dingwei3
+ * 创建时间:2017/4/12 14:03
+ * 修改人:dingwei3
+ * 修改时间:2017/4/12 14:03
+ * 修改备注:
+ */
+public class TimerShaftBar extends View implements TimerShaftInterface {
+ private static final String TAG = "TimerShaftBar";
+ /**
+ * Touch默认模式
+ */
+ private final static int TOUCH_MODE_NONE = 0;
+ /**
+ * 滑动事件
+ */
+ private final static int TOUCH_MODE_SCROLLER = 1;
+ /**
+ * 缩放事件
+ */
+ private final static int TOUCH_MODE_SCALE = 2;
+ /**
+ * 滑动FlING事件
+ */
+ private final static int TOUCH_MODE_SCROLLER_FlING = 3;
+ private Context mContext;
+ /**
+ * 手势事件处理
+ */
+ private GestureDetector mGestureDetector;
+ /**
+ * 缩放手势事件处理
+ */
+ private ScaleGestureDetector mScaleGestureDetector;
+ /**
+ * 手势事件模式
+ */
+ private int mTouchMode = TOUCH_MODE_NONE;
+
+
+ /**
+ * 滑动处理
+ */
+ private LayoutController mLayoutController;
+ /**
+ * 是否触摸屏幕
+ */
+ private boolean isTouchScreent = false;
+ /**
+ * 组件屏幕上现实的宽度
+ */
+ private int mWidth;
+ /**
+ * 组件屏幕上现实的高度
+ */
+ private int mHeight;
+ /**
+ *
+ */
+ private TimebarTick mTimebarTick;
+
+ /**
+ * 绘制时间轴起始时间
+ */
+ private Calendar mStartCalendar;
+ /**
+ * 绘制时间轴结束时间
+ */
+ private Calendar mEndCalendar;
+
+ /**
+ * 绘制时间轴总时长(秒)
+ */
+ private long TOTOAL_TIME = 24 * 60 * 60L;
+ /**
+ * 时间刻度画笔
+ */
+ private Paint mTextPaint = new Paint();
+
+ /**
+ * 当前时间刻度画笔
+ */
+ private Paint mCurrentTimeLinePaint = new Paint();
+ /**
+ * 时间区域画笔
+ */
+ private Paint mTimeRegionPaint = new Paint();
+
+ /**
+ * 时间轴区域背景画笔
+ */
+ private Paint mBackParint = new Paint();
+ /**
+ * 当前时间画笔
+ */
+ private Paint mCurrentTimePaint = new Paint();
+ /**
+ * 时间轴与上边距间距
+ */
+ private int mTop;
+
+ /**
+ * 播放时间显示区域高度
+ */
+ private int mCurrentTimeTextHeight;
+
+ private Paint.FontMetrics mFontMetrics;
+
+ private ArrayList mTimebarTicks = new ArrayList();
+ private ArrayList mTimeShaftItems = new ArrayList<>();
+
+ /**
+ * 对比起始位置的时间(秒)
+ */
+ private int mCurrentSecond;
+
+ /**
+ * 组件当前位置
+ */
+ private int mCurrentPosition;
+
+ /**
+ * 单位距离(每秒)
+ */
+ private float mPixelsPerSecond = 0;
+
+ /**
+ * 当前屏幕位置的起始秒数
+ */
+ private long mStartSecondOnScreen;
+ /**
+ * 当前屏幕位置的结束秒数
+ */
+ private long mEndSecondOnScreen;
+
+ private TimerShaftBarListener mTimerShaftBarListener;
+
+ /**
+ * 大刻度绘线绘制高度
+ */
+ private int mMaxScaleHeight;
+
+ /**
+ * 中刻度绘线绘制高度
+ */
+ private int mMidScaleHeight;
+
+ /**
+ * 小刻度绘线绘制高度
+ */
+ private int mMinScaleHeight;
+
+ /**
+ * 刻度显示字体大小
+ */
+ private int mScaleTextSize = 10;
+
+ /**
+ * 当前时间显示字体大小
+ */
+ private int mCurrentScaleTextSize = 10;
+
+ /**
+ * 刻度显示字体高度
+ */
+ private int mScaleTextHeight;
+
+ /**
+ * 绘制包含时间区域的颜色
+ */
+ private int mRegionCloudBackColor = 0xFFFF0606;
+
+ /**
+ * 绘制包含时间区域的颜色
+ */
+ private int mRegionLocalBackColor = 0xFFFF0606;
+
+
+ /**
+ * 刻度已经时间显示字体颜色
+ */
+ private int mTextColor = 0xFF888888;
+
+ /**
+ * 绘制时间轴区域的颜色
+ */
+ private int mBackColor = 0xFFF5F5F5;
+
+ /**
+ * 绘制当前时间轴区域的颜色
+ */
+ private int mCurrentTimeLineColor = 0xFFF7AC00;
+
+ /**
+ * 当前时间calendar
+ */
+ private Calendar mPositonCalendar;
+
+ /**
+ * 更具播放器进度显示当前位置
+ */
+ private boolean isRefereshPlayTimeWithPlayer = false;
+
+
+ public TimerShaftBar(Context context) {
+ super(context);
+ mContext = context;
+ init();
+ }
+
+
+ public TimerShaftBar(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ mContext = context;
+ init();
+ }
+
+ private static int dip2px(Context context, float dpValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
+
+ /**
+ * 设置时间轴事件监听
+ *
+ * @param timerShaftBarListener
+ */
+ @Override
+ public void setTimerShaftLayoutListener(TimerShaftBarListener timerShaftBarListener) {
+ mTimerShaftBarListener = timerShaftBarListener;
+ }
+
+ /**
+ * 设置绘制区域
+ *
+ * @param timeShaftItems 绘制区域item
+ */
+ public void setTimeShaftItems(ArrayList timeShaftItems) {
+ /*if (mTimeShaftItems.size() != 0) {
+ mTimeShaftItems.clear();
+ }*/
+ mTimeShaftItems = timeShaftItems;
+ if (mTimeShaftItems != null && mTimeShaftItems.size() > 0) {
+ Calendar calendar = mTimeShaftItems.get(0).getStartCalendar();
+ mStartCalendar = (Calendar) calendar.clone();
+
+ calendar = mTimeShaftItems.get(mTimeShaftItems.size() - 1).getEndCalendar();
+ mEndCalendar = (Calendar) calendar.clone();
+ mEndCalendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + 1);
+ initCalendar();
+ }
+ initTimebarTicks();
+ }
+
+ /**
+ * 设置时间轴是否根据接受外部播放进度,当播放成功是需要调用设置用来刷新播放时间
+ */
+ @Override
+ public void setRefereshPlayTimeWithPlayer() {
+ isRefereshPlayTimeWithPlayer = true;
+ }
+
+ /**
+ * 设置播放当前时间
+ *
+ * @param calendar
+ */
+ @Override
+ public void setPlayCalendar(Calendar calendar) {
+ Log.i("setPlayCalendar", calendar.getTime().toString());
+ if (!mLayoutController.computeScrollOffset() && !isTouchScreent && isRefereshPlayTimeWithPlayer) {
+ mPositonCalendar = (Calendar) calendar.clone();
+ mCurrentSecond = (int) ((mPositonCalendar.getTimeInMillis() - mStartCalendar.getTimeInMillis()) / 1000);
+ mLayoutController.setPosition((int) (mCurrentSecond * mPixelsPerSecond));
+ invalidate();
+ }
+ }
+
+ /**
+ * 初始化时间轴显示的等级
+ */
+ private void initTimebarTicks() {
+ if (mTimebarTicks.size() <= 0) {
+ TimebarTick timebarTick1 = new TimebarTick();
+ timebarTick1.setTotalSecondsInOneScreen(24 * 60 * 60);
+ timebarTick1.setMaxTickInSecond(4 * 60 * 60);
+ timebarTick1.setMinTickInSecond(60 * 60);
+ timebarTick1.setDataPattern("HH:mm");
+ timebarTick1.setStandardViewLength(((long) ((double) mWidth * TOTOAL_TIME / (double) timebarTick1.getTotalSecondsInOneScreen())));
+
+ TimebarTick timebarTick2 = new TimebarTick();
+ timebarTick2.setTotalSecondsInOneScreen(18 * 60 * 60);
+ timebarTick2.setMaxTickInSecond(2 * 60 * 60);
+ timebarTick2.setMinTickInSecond(30 * 60);
+ timebarTick2.setDataPattern("HH:mm");
+ timebarTick2.setStandardViewLength(((long) ((double) mWidth * TOTOAL_TIME / (double) timebarTick2.getTotalSecondsInOneScreen())));
+
+ TimebarTick timebarTick3 = new TimebarTick();
+ timebarTick3.setTotalSecondsInOneScreen(8 * 60 * 60);
+ timebarTick3.setMaxTickInSecond(60 * 60);
+ timebarTick3.setMinTickInSecond(12 * 60);
+ timebarTick3.setDataPattern("HH:mm");
+ timebarTick3.setStandardViewLength(((long) ((double) mWidth * TOTOAL_TIME / (double) timebarTick3.getTotalSecondsInOneScreen())));
+
+ TimebarTick timebarTick4 = new TimebarTick();
+ timebarTick4.setTotalSecondsInOneScreen(3 * 30 * 60);
+ timebarTick4.setMaxTickInSecond(10 * 60);
+ timebarTick4.setMinTickInSecond(2 * 60);
+ timebarTick4.setDataPattern("HH:mm");
+ timebarTick4.setStandardViewLength(((long) ((double) mWidth * TOTOAL_TIME / (double) timebarTick4.getTotalSecondsInOneScreen())));
+
+ TimebarTick timebarTick5 = new TimebarTick();
+ timebarTick5.setTotalSecondsInOneScreen(30 * 60);
+ timebarTick5.setMaxTickInSecond(10 * 60);
+ timebarTick5.setMinTickInSecond(2 * 60);
+ timebarTick5.setDataPattern("HH:mm");
+ timebarTick5.setStandardViewLength(((long) ((double) mWidth * TOTOAL_TIME / (double) timebarTick5.getTotalSecondsInOneScreen())));
+
+ mTimebarTicks.add(timebarTick5);
+ mTimebarTicks.add(timebarTick4);
+ mTimebarTicks.add(timebarTick3);
+ mTimebarTicks.add(timebarTick2);
+ mTimebarTicks.add(timebarTick1);
+ } else {
+ for (int i = 0; i < mTimebarTicks.size(); i++) {
+ mTimebarTicks.get(i).setStandardViewLength(((long) ((double) mWidth * TOTOAL_TIME / (double) mTimebarTicks.get(i).getTotalSecondsInOneScreen())));
+ }
+ }
+ setTimebarScaleIndex(1, 0);
+
+ }
+
+ private void setTimebarScaleIndex(int position, int length) {
+ mTimebarTick = mTimebarTicks.get(position);
+ if (length <= 0) {
+ mTimebarTick.setViewLength(mTimebarTick.getStandardViewLength());
+ mLayoutController.setLayoutSize(mWidth, mHeight, (int) mTimebarTick.getViewLength());
+ } else {
+ mTimebarTick.setViewLength(length);
+ mLayoutController.setLayoutSize(mWidth, mHeight, length);
+ }
+ mPixelsPerSecond = mTimebarTick.getViewLength() / (float) TOTOAL_TIME;
+ Log.d(TAG, "pixelsPerSecond = " + mPixelsPerSecond);
+ mLayoutController.setPosition((int) (mCurrentSecond * mPixelsPerSecond));
+ invalidate();
+ }
+
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ Log.d(TAG, "onSizeChanged");
+ mWidth = w;
+ mHeight = h;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (mWidth == 0) {
+ mWidth = MeasureSpec.getSize(widthMeasureSpec);
+ mHeight = MeasureSpec.getSize(widthMeasureSpec);
+ initTimebarTicks();
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ private void init() {
+ initCalendar();
+ mMaxScaleHeight = dip2px(mContext, 12);
+ mMidScaleHeight = dip2px(mContext, 7);
+ mMinScaleHeight = dip2px(mContext, 5);
+
+ //编辑起始时间绘制
+ mTextPaint.setColor(mTextColor);
+ mTextPaint.setTextSize(dip2px(mContext, mScaleTextSize));
+ mFontMetrics = mTextPaint.getFontMetrics();// 得到系统默认字体属性
+ mScaleTextHeight = (int) (mFontMetrics.bottom - mFontMetrics.top);
+
+ //编辑当前时间绘制
+ mCurrentTimePaint.setColor(mTextColor);
+ mCurrentTimePaint.setTextSize(dip2px(mContext, mCurrentScaleTextSize));
+ mFontMetrics = mTextPaint.getFontMetrics();// 得到系统默认字体属性
+ mCurrentTimeTextHeight = (int) (mFontMetrics.bottom - mFontMetrics.top);
+ mTop = mCurrentTimeTextHeight + dip2px(mContext, 10);
+ mBackParint.setColor(mBackColor);
+ mCurrentTimeLinePaint = new Paint();
+ mCurrentTimeLinePaint.setColor(mCurrentTimeLineColor);
+ mLayoutController = new LayoutController(mContext);
+ mScaleGestureDetector = new ScaleGestureDetector(mContext, new ScaleGestureDetector.OnScaleGestureListener() {
+ @Override
+ public boolean onScale(ScaleGestureDetector detector) {
+ Log.d(TAG, "onScale detector = " + detector.getScaleFactor());
+ scaleTimebar(detector.getScaleFactor() * (1 + (detector.getScaleFactor() - 1) * 1.2f));
+ return true;
+ }
+
+ @Override
+ public boolean onScaleBegin(ScaleGestureDetector detector) {
+ Log.d(TAG, "onScaleBegin detector = " + detector.getScaleFactor());
+ return true;
+ }
+
+ @Override
+ public void onScaleEnd(ScaleGestureDetector detector) {
+ Log.d(TAG, "onScaleEnd = " + detector.getScaleFactor());
+ }
+ });
+ mGestureDetector = new GestureDetector(mContext, new GestureDetector.OnGestureListener() {
+ @Override
+ public boolean onDown(MotionEvent e) {
+ Log.d(TAG, "GestureDetector onDown ");
+ return false;
+ }
+
+ @Override
+ public void onShowPress(MotionEvent e) {
+ Log.d(TAG, "GestureDetector onShowPress ");
+ }
+
+ @Override
+ public boolean onSingleTapUp(MotionEvent e) {
+ Log.d(TAG, "GestureDetector onSingleTapUp ");
+ return true;
+ }
+
+ @Override
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+ Log.d(TAG, "GestureDetector onScroll ");
+ if (mTouchMode == TOUCH_MODE_SCROLLER) {
+ isRefereshPlayTimeWithPlayer = false;
+ mLayoutController.startScroll(Math.round(distanceX), 0, mLayoutController.getScrollLimit());
+ invalidate();
+ }
+ return true;
+ }
+
+ @Override
+ public void onLongPress(MotionEvent e) {
+ Log.d(TAG, "GestureDetector onLongPress ");
+ }
+
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+ Log.d(TAG, "GestureDetector onFling ");
+ if (mTouchMode == TOUCH_MODE_SCROLLER) {
+ int scrollLimit = mLayoutController.getScrollLimit();
+ if (scrollLimit == 0)
+ return false;
+ mLayoutController.fling((int) (-velocityX), 0, scrollLimit);
+ invalidate();
+ }
+ return true;
+ }
+ });
+ }
+
+ private void initCalendar() {
+ if (mStartCalendar == null) {
+ mStartCalendar = Calendar.getInstance();
+ mStartCalendar.set(Calendar.DATE, mStartCalendar.get(Calendar.DATE));
+ }
+ if (mEndCalendar == null) {
+ mEndCalendar = (Calendar) mStartCalendar.clone();
+ mEndCalendar.set(Calendar.DATE, mEndCalendar.get(Calendar.DATE) + 1);
+ }
+ mStartCalendar.set(Calendar.HOUR_OF_DAY, 0);
+ mStartCalendar.set(Calendar.MINUTE, 0);
+ mStartCalendar.set(Calendar.SECOND, 0);
+
+ mEndCalendar.set(Calendar.HOUR_OF_DAY, 0);
+ mEndCalendar.set(Calendar.MINUTE, 0);
+ mEndCalendar.set(Calendar.SECOND, 0);
+ mPositonCalendar = (Calendar) mStartCalendar.clone();
+ TOTOAL_TIME = (mEndCalendar.getTimeInMillis() - mStartCalendar.getTimeInMillis()) / 1000;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ long b = System.currentTimeMillis();
+ boolean ret = mLayoutController.computeScrollOffset();
+
+ mCurrentPosition = mLayoutController.getPosition();
+ //算开始时缩放时不重新获取当前播放时间
+ // mCurrentSecond = (int) ((mCurrentPosition) * TOTOAL_TIME / mTimebarTick.getViewLength());
+ if (mTouchMode == TOUCH_MODE_SCROLLER) {
+ mCurrentSecond = (int) (mCurrentPosition / mPixelsPerSecond);
+ }
+ drawBack(canvas);
+ drawScale(canvas);
+ drawRegionRect(canvas);
+ drawCurrentPositionLine(canvas);
+ drawCurrentTime(canvas);
+ Log.d(TAG, "onDraw position = " + mCurrentSecond + " computeScrollOffset = " + ret);
+ if (ret) {
+ invalidate();
+ } else {
+ if (mTouchMode == TOUCH_MODE_SCROLLER) {
+ Log.d(TAG, "isTouchScreent = " + isTouchScreent);
+ if (!isTouchScreent) {
+ mTouchMode = TOUCH_MODE_NONE;
+ }
+ mPositonCalendar.setTimeInMillis(mStartCalendar.getTimeInMillis() + mCurrentSecond * 1000);
+ if (mTimerShaftBarListener != null) {
+ mTimerShaftBarListener.onTimerShaftBarPosChanged(mPositonCalendar);
+ }
+ }
+ if (mTouchMode == TOUCH_MODE_SCALE && !isTouchScreent) {
+ mTouchMode = TOUCH_MODE_NONE;
+ }
+ }
+ Log.d(TAG, "on draw time = " + String.valueOf(System.currentTimeMillis() - b));
+ }
+
+ /**
+ * 绘制当前时间
+ *
+ * @param canvas
+ */
+ private void drawCurrentTime(Canvas canvas) {
+ if (mTouchMode == TOUCH_MODE_SCROLLER || mLayoutController.computeScrollOffset()) {
+ mPositonCalendar.setTimeInMillis(mStartCalendar.getTimeInMillis() + mCurrentSecond * 1000);
+ }
+ String text = getTime(mPositonCalendar.getTimeInMillis(), "yyyy-MM-dd HH:mm:ss");
+ canvas.drawText(text, mWidth / 2 - mCurrentTimePaint.measureText(text) / 2, mCurrentTimeTextHeight, mCurrentTimePaint);
+ }
+
+ /**
+ * 绘制当前时间
+ * k
+ *
+ * @param canvas
+ */
+ private void drawBack(Canvas canvas) {
+ canvas.drawRect(new Rect(0, mTop, mWidth, getHeight()), mBackParint);
+ }
+
+ /**
+ * 绘制标尺
+ *
+ * @param canvas
+ */
+ private void drawScale(Canvas canvas) {
+ long b = System.currentTimeMillis();
+ canvas.drawLine(0, mTop, mWidth, mTop, mTextPaint);
+ canvas.drawLine(0, getHeight() - 1, mWidth, getHeight() - 1, mTextPaint);
+
+ mStartSecondOnScreen = (long) ((mCurrentPosition - mLayoutController.getPaddingLeft()) / mPixelsPerSecond);
+ mEndSecondOnScreen = (long) (mStartSecondOnScreen + mWidth / mPixelsPerSecond);
+
+ Log.d(TAG, "onDraw startTikeStart = " + mStartSecondOnScreen);
+ Log.d(TAG, "onDraw endTikeStart = " + mEndSecondOnScreen);
+ if (mEndSecondOnScreen > TOTOAL_TIME) {
+ mEndSecondOnScreen = TOTOAL_TIME;
+ }
+ for (long i = mStartSecondOnScreen - 20; i < mEndSecondOnScreen + 20; i++) {
+ if (i < 0 || i > TOTOAL_TIME) {
+ continue;
+ }
+ long startX = (long) ((i - mStartSecondOnScreen) * mPixelsPerSecond);
+ if (i % (60 * 60) == 0) {
+ canvas.drawLine(startX, mTop, startX, mTop + mMaxScaleHeight, mTextPaint);
+ canvas.drawLine(startX, getHeight() - mMaxScaleHeight, startX, getHeight(), mTextPaint);
+ }
+ if (i % mTimebarTick.getMaxTickInSecond() == 0) {
+ if (i % (60 * 60) != 0) {
+ canvas.drawLine(startX, mTop, startX, mTop + mMidScaleHeight, mTextPaint);
+ canvas.drawLine(startX, getHeight() - mMidScaleHeight, startX, getHeight(), mTextPaint);
+ String timeText = getTime((i * 1000l + mStartCalendar.getTimeInMillis()), mTimebarTick.getDataPattern());
+ canvas.drawText(timeText, startX - mTextPaint.measureText(timeText) / 2, mTop + mMidScaleHeight + mScaleTextHeight / 2 + dip2px(mContext, 10), mTextPaint);
+ } else {
+ String timeText = getTime((i * 1000l + mStartCalendar.getTimeInMillis()), mTimebarTick.getDataPattern());
+ canvas.drawText(timeText, startX - mTextPaint.measureText(timeText) / 2, mTop + mMaxScaleHeight + mScaleTextHeight / 2 + dip2px(mContext, 10), mTextPaint);
+ }
+ } else if (i % mTimebarTick.getMinTickInSecond() == 0) {
+ canvas.drawLine(startX, mTop, startX, mTop + mMinScaleHeight, mTextPaint);
+ canvas.drawLine(startX, getHeight() - mMinScaleHeight, startX, getHeight(), mTextPaint);
+ }
+ }
+ Log.d(TAG, "drawtime drawScale time = " + (System.currentTimeMillis() - b));
+ }
+
+ /**
+ * 绘制包含时间所在区域
+ *
+ * @param canvas
+ */
+ private void drawRegionRect(Canvas canvas) {
+ if (mTimeShaftItems != null) {
+ long b = System.currentTimeMillis();
+ for (int y = 0; y < mTimeShaftItems.size(); y++) {
+ TimerShaftRegionItem timeShaftItem = mTimeShaftItems.get(y);
+ if (timeShaftItem.getEndCalendar().getTimeInMillis() - mStartCalendar.getTimeInMillis() - mStartSecondOnScreen * 1000l < -10000) {
+ continue;
+ }
+ if (timeShaftItem.getStartCalendar().getTimeInMillis() - mStartCalendar.getTimeInMillis() - mEndSecondOnScreen * 1000l > 10000) {
+ continue;
+ }
+ int startTime = (int) ((timeShaftItem.getStartCalendar().getTimeInMillis() - mStartCalendar.getTimeInMillis()) / 1000);
+ int endTime = (int) ((timeShaftItem.getEndCalendar().getTimeInMillis() - mStartCalendar.getTimeInMillis()) / 1000);
+ int startX = (int) ((startTime - mStartSecondOnScreen) * mPixelsPerSecond);
+ int endX = (int) ((endTime - mStartSecondOnScreen) * mPixelsPerSecond);
+ mTimeRegionPaint.setColor(mRegionCloudBackColor);
+ /*if (timeShaftItem.getRecType() == 1) {
+ //云存储
+ mTimeRegionPaint.setColor(mRegionCloudBackColor);
+ } else if (timeShaftItem.getRecType() == 2) {
+ //本地录像
+ mTimeRegionPaint.setColor(mRegionLocalBackColor);
+
+ }*/
+ canvas.drawRect(new Rect(startX, mTop, endX, getHeight()), mTimeRegionPaint);
+ }
+ Log.d(TAG, "drawtime drawRegionRect time = " + (System.currentTimeMillis() - b));
+ }
+ }
+
+ /**
+ * 绘制标示当前位置的线
+ *
+ * @param canvas
+ */
+ private void drawCurrentPositionLine(Canvas canvas) {
+ long b = System.currentTimeMillis();
+ //绘制中心线
+ canvas.drawRect(new Rect(mWidth / 2 - dip2px(mContext, 0.5f), mTop, mWidth / 2 + dip2px(mContext, 0.5f), getHeight()), mCurrentTimeLinePaint);
+ Path path = new Path();
+ path.moveTo(mWidth / 2 - dip2px(mContext, 4), mTop);// 此点为多边形的起点
+ path.lineTo(mWidth / 2 + dip2px(mContext, 4), mTop);
+ path.lineTo(mWidth / 2, dip2px(mContext, 5) + mTop);
+ path.close(); // 使这些点构成封闭的多边形
+ canvas.drawPath(path, mCurrentTimeLinePaint);
+ Log.d(TAG, "drawtime drawCurrentPositionLine time = " + (System.currentTimeMillis() - b));
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ int actionType = event.getActionMasked();
+ switch (actionType) {
+ case MotionEvent.ACTION_DOWN:
+ mTouchMode = TOUCH_MODE_SCROLLER;
+ isTouchScreent = true;
+ // 第一个点被按下
+ // Toast.makeText(getContext(), "第一个点被按下", Toast.LENGTH_SHORT);
+ break;
+ case MotionEvent.ACTION_POINTER_DOWN:
+ // Toast.makeText(getContext(), "第一个点被按下", Toast.LENGTH_SHORT);
+ mTouchMode = TOUCH_MODE_SCALE;
+ isRefereshPlayTimeWithPlayer = true;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ Log.d(TAG, "ACTION_MOVE ");
+ break;
+ case MotionEvent.ACTION_UP:
+ Log.d(TAG, "ACTION_UP + " + !mLayoutController.computeScrollOffset());
+ isTouchScreent = false;
+ if (mTouchMode == TOUCH_MODE_SCALE) {
+ isRefereshPlayTimeWithPlayer = true;
+ mTouchMode = TOUCH_MODE_NONE;
+ }
+ break;
+ }
+ mGestureDetector.onTouchEvent(event);
+ mScaleGestureDetector.onTouchEvent(event);
+ return true;
+ }
+
+ private void scaleTimebar(float scaleFactor) {
+ int newWidth = (int) (mTimebarTick.getViewLength() * scaleFactor);
+ Log.d(TAG, "scaleTimebarByFactor mTimebarTick.getViewLength() = " + mTimebarTick.getViewLength() + " newWidth = " + newWidth);
+ if (newWidth >= mTimebarTicks.get(0).getStandardViewLength()) {
+ setTimebarScaleIndex(0, 0);
+ } else if (newWidth < mTimebarTicks.get(0).getStandardViewLength() && newWidth >= mTimebarTicks.get(1).getStandardViewLength()) {
+ setTimebarScaleIndex(1, newWidth);
+ } else if (newWidth < mTimebarTicks.get(1).getStandardViewLength() && newWidth >= mTimebarTicks.get(2).getStandardViewLength()) {
+ setTimebarScaleIndex(2, newWidth);
+ } else if (newWidth < mTimebarTicks.get(2).getStandardViewLength() && newWidth >= mTimebarTicks.get(3).getStandardViewLength()) {
+ setTimebarScaleIndex(3, newWidth);
+ } else if (newWidth < mTimebarTicks.get(3).getStandardViewLength() && newWidth >= mTimebarTicks.get(4).getStandardViewLength()) {
+ setTimebarScaleIndex(4, newWidth);
+ } else if (newWidth <= mTimebarTicks.get(4).getStandardViewLength()) {
+ setTimebarScaleIndex(4, 0);
+ }
+ }
+
+ private String getTime(long duration, String formate) {
+ Date mDate = new Date();
+ mDate.setTime(duration);
+ SimpleDateFormat mDateFormat = new SimpleDateFormat(formate, Locale.getDefault());
+ return mDateFormat.format(mDate);
+ }
+
+ /**
+ * 时间轴事件监听
+ */
+ public interface TimerShaftBarListener {
+ /**
+ * 当TimerShaftBar滑动时的通知
+ *
+ * @param calendar 当前calendar
+ */
+ void onTimerShaftBarPosChanged(Calendar calendar);
+
+ /**
+ * 时间轴手指按下时触发
+ */
+ void onTimerShaftBarDown();
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftInterface.java b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftInterface.java
new file mode 100644
index 0000000..b32fb8c
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftInterface.java
@@ -0,0 +1,39 @@
+package com.lechange.demo.localvideo.timeshaftbar;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+
+/**
+ * 项目名称:EZUIKitDemo
+ * 类描述:
+ * 创建人:dingwei3
+ * 创建时间:2017/5/2 15:15
+ * 修改人:dingwei3
+ * 修改时间:2017/5/2 15:15
+ * 修改备注:
+ */
+public interface TimerShaftInterface {
+
+ /**
+ * 设置时间轴事件监听
+ * @param timerShaftBarListener
+ */
+ void setTimerShaftLayoutListener(TimerShaftBar.TimerShaftBarListener timerShaftBarListener);
+
+ /**
+ * 设置绘制区域
+ * @param timeShaftItems 绘制区域item
+ */
+ void setTimeShaftItems(ArrayList timeShaftItems);
+
+ /**
+ * 设置时间轴是否根据接受外部播放进度,当播放成功时需要调用此方法,用来刷新播放时间进度
+ */
+ void setRefereshPlayTimeWithPlayer();
+
+ /**
+ * 设置播放当前时间
+ * @param calendar
+ */
+ void setPlayCalendar(Calendar calendar);
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftRegionItem.java b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftRegionItem.java
new file mode 100644
index 0000000..3966da6
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/timeshaftbar/TimerShaftRegionItem.java
@@ -0,0 +1,80 @@
+package com.lechange.demo.localvideo.timeshaftbar;
+
+import java.util.Calendar;
+
+/**
+ * 项目名称:EZUIKitDemo
+ * 类描述:时间轴显示的区域对象
+ * 创建人:dingwei3
+ * 创建时间:2017/4/20 14:28
+ * 修改人:dingwei3
+ * 修改时间:2017/4/20 14:28
+ * 修改备注:
+ */
+public class TimerShaftRegionItem {
+
+ /**
+ * 开始时间
+ */
+ private long mStartTime;
+ /**
+ * 结束时间
+ */
+ private long mEndTime;
+
+ private Calendar mStartCalendar;
+
+ private Calendar mEndCalendar;
+
+ private int recType = 0;
+
+ public TimerShaftRegionItem(long startTime, long endTime, int recType) {
+ mStartTime = startTime;
+ mEndTime = endTime;
+ mStartCalendar = Calendar.getInstance();
+ mStartCalendar.setTimeInMillis(mStartTime);
+ mEndCalendar = Calendar.getInstance();
+ mEndCalendar.setTimeInMillis(mEndTime);
+ this.recType = recType;
+ }
+
+ public int getRecType() {
+ return recType;
+ }
+
+ public void setRecType(int recType) {
+ this.recType = recType;
+ }
+
+ public long getStartTime() {
+ return mStartTime;
+ }
+
+ public void setStartTime(long startTime) {
+ mStartTime = startTime;
+ }
+
+ public long getEndTime() {
+ return mEndTime;
+ }
+
+ public void setEndTime(long endTime) {
+ mEndTime = endTime;
+ }
+
+ public Calendar getStartCalendar() {
+ return mStartCalendar;
+ }
+
+ public void setStartCalendar(Calendar startCalendar) {
+ mStartCalendar = startCalendar;
+ }
+
+ public Calendar getEndCalendar() {
+ return mEndCalendar;
+ }
+
+ public void setEndCalendar(Calendar endCalendar) {
+ mEndCalendar = endCalendar;
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/turnview/AXLog.java b/app/src/main/java/com/lechange/demo/localvideo/turnview/AXLog.java
new file mode 100644
index 0000000..1770391
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/turnview/AXLog.java
@@ -0,0 +1,249 @@
+package com.lechange.demo.localvideo.turnview;
+
+
+import android.content.Context;
+import android.os.Environment;
+import android.util.Log;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Created by wzy on 15/11/27.
+ * 模仿logger,创建自己的日志操作类
+ */
+public class AXLog {
+ public static final String TAG = AXLog.class.getSimpleName();
+ /**
+ * 控制变量,是否显示log日志
+ */
+ public static boolean isShowLog = true;
+ public static String defaultMsg = "";
+ public static final int V = 1;
+ public static final int D = 2;
+ public static final int I = 3;
+ public static final int W = 4;
+ public static final int E = 5;
+
+ private static String logPath = null;//log日志存放路径
+
+ private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.US);//日期格式;
+
+ private static Date date = new Date();//因为log日志是使用日期命名的,使用静态成员变量主要是为了在整个程序运行期间只存在一个.log文件中;
+
+// /**
+// * 初始化,须在使用之前设置,最好在Application创建时调用
+// *
+// * @param context
+// */
+// public static void init(Context context) {
+// logPath = getFilePath(context) + "/Logs";//获得文件储存路径,在后面加"/Logs"建立子文件夹
+// }
+
+ /**
+ * 获得文件存储路径
+ *
+ * @return
+ */
+ private static String getFilePath(Context context) {
+
+ if (Environment.MEDIA_MOUNTED.equals(Environment.MEDIA_MOUNTED) || !Environment.isExternalStorageRemovable()) {//如果外部储存可用
+ return context.getExternalFilesDir(null).getPath();//获得外部存储路径,默认路径为 /storage/emulated/0/Android/data/com.waka.workspace.logtofile/files/Logs/log_2016-03-14_16-15-09.log
+ } else {
+ return context.getFilesDir().getPath();//直接存在/data/data里,非root手机是看不到的
+ }
+ }
+
+ /**
+ * 初始化控制变量
+ *
+ * @param isShowLog
+ */
+ public static void init(boolean isShowLog) {
+ AXLog.isShowLog = isShowLog;
+ }
+
+ /**
+ * 初始化控制变量和默认日志
+ *
+ * @param isShowLog
+ * @param defaultMsg
+ */
+ public static void init(boolean isShowLog, String defaultMsg) {
+ AXLog.isShowLog = isShowLog;
+ AXLog.defaultMsg = defaultMsg;
+ }
+
+ public static void v() {
+ llog(V, null, defaultMsg);
+ }
+
+ public static void v(Object obj) {
+ llog(V, null, obj);
+ }
+
+ public static void v(String tag, Object obj) {
+ llog(V, tag, obj);
+ }
+
+ public static void d() {
+ llog(D, null, defaultMsg);
+ }
+
+ public static void d(Object obj) {
+ llog(D, null, obj);
+ }
+
+ public static void d(String tag, Object obj) {
+ llog(D, tag, obj);
+ }
+
+ public static void i() {
+ llog(I, null, defaultMsg);
+ }
+
+ public static void i(Object obj) {
+ llog(I, null, obj);
+ }
+
+ public static void i(String tag, String obj) {
+ llog(I, tag, obj);
+ }
+
+ public static void w() {
+ llog(W, null, defaultMsg);
+ }
+
+ public static void w(Object obj) {
+ llog(W, null, obj);
+ }
+
+ public static void w(String tag, Object obj) {
+ llog(W, tag, obj);
+ }
+
+ public static void e() {
+ llog(E, null, defaultMsg);
+ }
+
+ public static void e(Object obj) {
+ llog(E, null, obj);
+ }
+
+ public static void e(String tag, Object obj) {
+ llog(E, tag, obj);
+ }
+
+
+ /**
+ * 执行打印方法
+ *
+ * @param type
+ * @param tagStr
+ * @param obj
+ */
+ public static void llog(int type, String tagStr, Object obj) {
+ String msg;
+ if (!isShowLog) {
+ return;
+ }
+
+ StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
+
+ int index = 4;
+ String className = stackTrace[index].getFileName();
+ String methodName = stackTrace[index].getMethodName();
+ int lineNumber = stackTrace[index].getLineNumber();
+
+ String tag = (tagStr == null ? className : tagStr);
+ methodName = methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
+
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append("[ (").append(className).append(":").append(lineNumber).append(")#").append(methodName).append(" ] ");
+
+ if (obj == null) {
+ msg = "Log with null Object";
+ } else {
+ msg = obj.toString();
+ }
+ if (msg != null) {
+ stringBuilder.append(msg);
+ }
+
+ String logStr = stringBuilder.toString();
+
+ switch (type) {
+ case V:
+ Log.v(tag, logStr);
+ break;
+ case D:
+ Log.d(tag, logStr);
+ break;
+ case I:
+ Log.i(tag, logStr);
+ break;
+ case W:
+ Log.w(tag, logStr);
+ break;
+ case E:
+ Log.e(tag, logStr);
+ break;
+ }
+ }
+
+ /**
+ * 将log信息写入文件中
+ *
+ * @param type
+ * @param tag
+ * @param msg
+ */
+ private static void writeToFile(char type, String tag, String msg) {
+
+ if (null == logPath) {
+ Log.e(TAG, "logPath == null ,未初始化MLog");
+ return;
+ }
+
+ String fileName = logPath + "/log_" + dateFormat.format(new Date()) + ".log";//log日志名,使用时间命名,保证不重复
+ String log = dateFormat.format(date) + " " + type + " " + tag + " " + msg + "\n";//log日志内容,可以自行定制
+
+ //如果父路径不存在
+ File file = new File(logPath);
+ if (!file.exists()) {
+ file.mkdirs();//创建父路径
+ }
+
+ FileOutputStream fos = null;//FileOutputStream会自动调用底层的close()方法,不用关闭
+ BufferedWriter bw = null;
+ try {
+
+ fos = new FileOutputStream(fileName, true);//这里的第二个参数代表追加还是覆盖,true为追加,flase为覆盖
+ bw = new BufferedWriter(new OutputStreamWriter(fos));
+ bw.write(log);
+
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (bw != null) {
+ bw.close();//关闭缓冲流
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lechange/demo/localvideo/turnview/OnValueChangeListener.java b/app/src/main/java/com/lechange/demo/localvideo/turnview/OnValueChangeListener.java
new file mode 100644
index 0000000..6f52de6
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/turnview/OnValueChangeListener.java
@@ -0,0 +1,10 @@
+package com.lechange.demo.localvideo.turnview;
+
+/**
+ * Created by Administrator on 2017/10/19.
+ */
+
+public interface OnValueChangeListener {
+ public void onValueChange(float value);
+
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/turnview/RecordInfo.java b/app/src/main/java/com/lechange/demo/localvideo/turnview/RecordInfo.java
new file mode 100644
index 0000000..0d35e6f
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/turnview/RecordInfo.java
@@ -0,0 +1,54 @@
+package com.lechange.demo.localvideo.turnview;
+
+public class RecordInfo {
+
+ private long startTime;
+ private long endTime;
+
+ private int startValue;
+ private int endValue;
+
+ public int getStartValue() {
+ return startValue;
+ }
+
+ public void setStartValue(int startValue) {
+ this.startValue = startValue;
+ }
+
+ public int getEndValue() {
+ return endValue;
+ }
+
+ public void setEndValue(int endValue) {
+ this.endValue = endValue;
+ }
+
+ public RecordInfo() {
+ super();
+ }
+
+ public long getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(long startTime) {
+ this.startTime = startTime;
+ }
+
+ public long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(long endTime) {
+ this.endTime = endTime;
+ }
+
+ @Override
+ public String toString() {
+ // TODO Auto-generated method stub
+ return " startTime:" + startTime + " endTime:" + endTime + " startValue:" + startValue + " endValue:" + endValue;
+ }
+
+
+}
diff --git a/app/src/main/java/com/lechange/demo/localvideo/turnview/TunlView.java b/app/src/main/java/com/lechange/demo/localvideo/turnview/TunlView.java
new file mode 100644
index 0000000..ee92526
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/localvideo/turnview/TunlView.java
@@ -0,0 +1,646 @@
+package com.lechange.demo.localvideo.turnview;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.text.Layout;
+import android.text.TextPaint;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import com.yonsz.z1.R;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2017/10/19.
+ */
+
+public class TunlView extends View {
+
+ /**
+ * 图片放大状态常量
+ */
+ public static final int STATUS_ZOOM_OUT = 1;
+
+ /**
+ * 图片缩小状态常量
+ */
+ public static final int STATUS_ZOOM_IN = 2;
+
+ /**
+ * 记录两指同时放在屏幕上时,中心点的横坐标值
+ */
+ private float centerPointX;
+
+ /**
+ * 记录两指同时放在屏幕上时,中心点的纵坐标值
+ */
+ private float centerPointY;
+
+ /**
+ * 记录按下两指之间的距离
+ */
+ private double lastFingerDis;
+
+ /**
+ * 记录当前操作的状态,可选值为STATUS_ZOOM_OUT、STATUS_ZOOM_IN
+ */
+ private int currentStatus;
+
+
+ private static final float TEXT_SIZE = 12;
+
+ public int mWidth,mHeight,mlastX,mMove;
+
+ int mValue; //当前时间轴中点所在得刻度尺value
+
+ public static final float LINE_DIVIDER = 2.0f; //初始化每个刻度间距为2
+
+ float mLineDivider = LINE_DIVIDER ;//记录一刻度屏幕上得距离
+
+ static float lastItemDivider = LINE_DIVIDER;//缩放后一刻度得屏幕距离
+
+ private float mDensity;
+ private float ITEM_MAX_HEIGHT = 30;
+ private float ITEM_MIN_HEIGHT = 15;
+ private float textWidth;
+
+ Calendar calendar1 = Calendar.getInstance();
+
+ List list = new ArrayList<>();
+ private String[] timeString0 = {"00:00", "00:30", "01:00", "01:30", "02:00", "02:30", "03:00", "03:30", "04:00", "04:30",
+ "05:00", "05:30", "06:00", "06:30", "07:00", "07:30", "08:00", "08:30", "09:00", "09:30", "10:00", "10:30",
+ "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "14:30", "15:00", "15:30", "16:00", "16:30",
+ "17:00", "17:30", "18:00", "18:30", "19:00", "19:30", "20:00", "20:30", "21:00", "21:30", "22:00", "22:30",
+ "23:00", "23:30"};
+
+ private String[] timeString1 = {"00:00", "01:00", "02:00", "03:00", "04:00",
+ "05:00", "06:00", "07:00", "08:00", "09:00", "10:00",
+ "11:00", "12:00", "13:00", "14:00", "15:00", "16:00",
+ "17:00", "18:00", "19:00", "20:00", "21:00", "22:00",
+ "23:00"};
+
+ private String[] timeString2 = {"00:00", "03:00", "06:00", "9:00", "12:00", "15:00","18:00","21:00"};
+
+ private String[] timeString3 = {"00:00", "12:00"};
+
+ private String[] timeString4 = {"00:00"};
+
+ public int Mode = Mode_1 ; // 当前的刻度尺缩放模式,默认模式一
+ public static final int Mode_0 = 0; //模式一,当前刻度尺显示timeString0
+ public static final int Mode_1 = 1; //模式一,当前刻度尺显示timeString1
+ public static final int Mode_2 = 2; //模式一,当前刻度尺显示timeString2
+ public static final int Mode_3 = 3; //模式一,当前刻度尺显示timeString3
+ public static final int Mode_4 = 4; //模式一,当前刻度尺显示timeString4
+
+ /**
+ * 代表value值增加60,刻度尺对应多少(一个大刻度对应多少value)
+ * Mode_0代表半个小时
+ * Mode_1代表1个小时
+ * Mode_2代表3个小时
+ * Mode_3代表12个小时
+ * Mode_4代表24个小时
+ */
+ int largeScaleValue = 60;
+
+ /**
+ * 代表value值增加10,刻度尺对应多少(一个小刻度对应多少value)
+ * Mode_0代表5分钟
+ * Mode_1代表10分钟
+ * Mode_2代表15分钟
+ * Mode_3代表60分钟
+ * Mode_4代表120分钟
+ */
+ int smallScaleValue = 10;
+
+ public static int valueToSencond ; // 代表mvalue加1,刻度尺增加多少秒
+
+ private int REFRESH_TIME = valueToSencond*1000;
+
+ public String[] useString;
+
+ private float scaledRatio;
+
+ private OnValueChangeListener mListener;
+
+ public OnValueChangeListener getmListener() {
+ return mListener;
+ }
+
+ public void setmListener(OnValueChangeListener mListener) {
+ this.mListener = mListener;
+ }
+
+ Paint linePaint = new Paint();
+ Paint shadowPaint = new Paint();
+
+ TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
+
+ public TunlView(Context context) {
+ super(context);
+ }
+
+ public TunlView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ useString = timeString1;
+ valueToSencond = 60 ; //当选择timeString1时,mvlaue加一,刻度尺增加60秒
+
+ mDensity = getContext().getResources().getDisplayMetrics().density;
+ setBackgroundResource(R.drawable.bg_wheel);
+
+ //过二十五秒让mValue自增一次,模拟在录像状态
+ postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ postDelayed(this, valueToSencond*1000);
+ mValue++;
+ postInvalidate();
+ }
+ }, valueToSencond*1000);
+
+
+ initData();
+ shadowPaint.setStyle(Paint.Style.FILL);
+ shadowPaint.setColor(Color.parseColor("#83D7DD"));
+ shadowPaint.setAlpha(101);
+
+ }
+
+
+ public void initData() {
+ list.clear();
+ mValue = getNowValue();
+
+ Date d = new Date();
+ RecordInfo info1 = new RecordInfo();
+
+
+ RecordInfo info2 = new RecordInfo();
+ info2.setStartTime(d.getTime() - 60 * 60 * 1000 * 8);
+ info2.setEndTime(d.getTime() - 60 * 60 * 1000 * 7);
+ info2.setStartValue(getmValue(info2.getStartTime()));
+ info2.setEndValue(getmValue(info2.getEndTime()));
+
+ info1.setStartTime(d.getTime() - 60 * 60 * 1000);
+ info1.setEndTime(d.getTime());
+ // info1.setCurrentDate("2017-10-23");
+ info1.setStartValue(getmValue(info1.getStartTime()));
+ info1.setEndValue(getmValue(info1.getEndTime()));
+
+ list.add(info2);
+ list.add(info1);
+
+ postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ postDelayed(this, 60 * 1000);
+ RecordInfo info = new RecordInfo();
+ info.setStartTime(System.currentTimeMillis() - 60 * 1000);
+ info.setEndTime(System.currentTimeMillis());
+ info.setStartValue(getmValue(info.getStartTime()));
+ info.setEndValue(getmValue(info.getEndTime()));
+ AXLog.e("wzytest", "info.StartTime:" + info.getStartTime() + " info.getEndTime():" + info.getEndTime());
+ addNoRepeatList(info);
+ postInvalidate();
+ }
+
+ }, 60 * 1000);
+
+ }
+
+ /**
+ * 时间轴在跑动,不能每秒都往录像list 增加一条录像,
+ * 判断如果前后录像文件时间戳相差不大于一秒,则代表录像时间相连,
+ * 并不往录像列表增加一条记录(为何不判断相等?)
+ * @param info
+ */
+ private void addNoRepeatList(RecordInfo info) {
+ RecordInfo lastInfo = list.get(list.size() - 1);
+ if (info.getStartTime() - lastInfo.getEndTime() < 1000) {
+ AXLog.e("wzytest", "前一个数据的最后时间小于当前的开始时间不超过一秒");
+ lastInfo.setEndTime(info.getEndTime());
+ lastInfo.setEndValue(info.getEndValue());
+ } else {
+ list.add(info);
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ drawScaleLine(canvas);
+ drawMiddleLine(canvas);
+ drawShadow(canvas);
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ mWidth = getWidth();
+ mHeight = getHeight();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+ //划线
+ public void drawScaleLine(Canvas canvas) {
+ linePaint.setStrokeWidth(2);
+ linePaint.setColor(Color.BLACK);
+
+ textPaint.setTextSize(TEXT_SIZE * mDensity);
+ textPaint.setTextSize(16);
+ textWidth = Layout.getDesiredWidth("0", textPaint);
+
+ int width = mWidth, drawCount = 0;
+
+ float xPosition;
+
+ for (int i = 0; drawCount < width * 2; i++) {
+ xPosition = (mWidth / 2 + mMove) + i * mDensity * (mLineDivider);
+ if (((mValue + i)) % largeScaleValue == 0) {
+ canvas.drawLine(xPosition, 0, xPosition, mDensity * ITEM_MAX_HEIGHT, linePaint);
+ if ((((mValue + i)) / largeScaleValue % useString.length) < 0) {
+ canvas.drawText(useString[useString.length + (((mValue + i)) / largeScaleValue % useString.length)], countLeftStart(mValue + i, xPosition, textWidth), getHeight() - textWidth, textPaint);
+ } else {
+ canvas.drawText(useString[((mValue + i)) / largeScaleValue % useString.length], countLeftStart(mValue + i, xPosition, textWidth), getHeight() - textWidth, textPaint);
+ }
+
+ } else {
+ if ((mValue + i) % smallScaleValue == 0) {
+ canvas.drawLine(xPosition, 0, xPosition, mDensity * ITEM_MIN_HEIGHT, linePaint);
+ }
+ }
+
+ xPosition = (mWidth / 2 + mMove) - i * mDensity * (mLineDivider);
+ if (( (mValue - i)) % largeScaleValue == 0) {
+ canvas.drawLine(xPosition, 0, xPosition, mDensity * ITEM_MAX_HEIGHT, linePaint);
+ if ((( (mValue - i)) / largeScaleValue % useString.length) < 0) {
+ canvas.drawText(useString[useString.length + (((mValue - i)) / largeScaleValue % useString.length)], countLeftStart(mValue - i, xPosition, textWidth), getHeight() - textWidth, textPaint);
+ } else {
+ canvas.drawText(useString[( (mValue - i)) / largeScaleValue % useString.length], countLeftStart(mValue - i, xPosition, textWidth), getHeight() - textWidth, textPaint);
+ }
+ } else {
+ if ( (mValue - i) % smallScaleValue == 0) {
+ canvas.drawLine(xPosition, 0, xPosition, mDensity * ITEM_MIN_HEIGHT, linePaint);
+ }
+ }
+ drawCount += mDensity * (mLineDivider);
+
+ }
+ }
+
+ public void drawShadow(Canvas canvas){
+ float startXPosition ;
+ float endXPosition ;
+ // TODO: 2017/10/24 画阴影面积
+ for (int j = 0; j < list.size(); j++) {
+ RecordInfo info = list.get(j);
+ int startvalue = info.getStartValue();
+ int endvalue = info.getEndValue();
+
+ //获取当前得value
+ AXLog.e("wzytest","getNowValue:"+getNowValue() +"mvalue:"+mValue);
+
+ startXPosition = mWidth/2 - (mValue-startvalue) * mDensity * (mLineDivider);
+ endXPosition = mWidth/2 + (endvalue-mValue) * mDensity * (mLineDivider);
+
+ canvas.drawRect(startXPosition,0,endXPosition,mHeight,shadowPaint);
+ }
+ }
+
+ /**
+ * 计算数字显示位置的辅助方法
+ *
+ * @param value
+ * @param xPosition
+ * @param textWidth
+ * @return
+ */
+ private float countLeftStart(int value, float xPosition, float textWidth) {
+ float xp;
+ xp = xPosition - (textWidth * 5 / 2); //从2.5个字开始写
+ return xp;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+
+ int xPosition = (int) event.getX();
+ int xMove;
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_POINTER_DOWN:
+ if (event.getPointerCount() == 2) {
+ // 当有两个手指按在屏幕上时,计算两指之间的距离
+ lastFingerDis = distanceBetweenFingers(event);
+ }
+ break;
+ case MotionEvent.ACTION_DOWN:
+ mlastX = xPosition;
+ mMove = 0;
+ break;
+ case MotionEvent.ACTION_UP:
+ //当滑动到停止,改变当前刻度值
+ xMove = (int) (mMove / (mLineDivider * mDensity));
+ mValue -= xMove;
+ notifyValueChange();
+ mMove = 0;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (event.getPointerCount() == 1) {
+ mMove = xPosition - mlastX;
+ xMove = (int) (mMove / (mLineDivider * mDensity));
+ mValue -= xMove;
+ notifyValueChange();
+ invalidate();
+ } else if (event.getPointerCount() == 2) {
+ // 有两个手指按在屏幕上移动时,为缩放状态
+ centerPointBetweenFingers(event);
+ double fingerDis = distanceBetweenFingers(event);
+
+ if (fingerDis > lastFingerDis) {
+ currentStatus = STATUS_ZOOM_OUT;
+ } else {
+ currentStatus = STATUS_ZOOM_IN;
+ }
+
+ if(Mode==Mode_0&¤tStatus==STATUS_ZOOM_OUT||Mode==Mode_4&¤tStatus==STATUS_ZOOM_IN){
+ AXLog.e("wzytest","Mode_0 时放大 和 Mode_4 时候缩小不做任何处理");
+ }else{
+ scaledRatio = (float) (fingerDis / lastFingerDis );
+ shadowPaint.setStrokeWidth(6*scaledRatio);
+ mLineDivider = lastItemDivider * scaledRatio; //缩放后一刻度在屏幕上的距离
+ }
+
+ if(currentStatus==STATUS_ZOOM_IN&&Mode==Mode_0){
+ if(2*mLineDividerLINE_DIVIDER){
+ mLineDivider = 2;
+ lastItemDivider = 2;
+ useString = timeString3;
+ Mode = Mode_3;
+ valueToSencond = valueToSencond/2;
+ //重新获取当前value
+ mValue = getNowValue();
+ //重新计算蓝色录像时间轴
+ initData();
+ }
+ }else if(currentStatus==STATUS_ZOOM_OUT&&Mode==Mode_3){
+ if(mLineDivider/4>LINE_DIVIDER){
+ mLineDivider = 2;
+ lastItemDivider = 2;
+ useString = timeString2;
+ Mode = Mode_2;
+ valueToSencond = valueToSencond/4;
+ AXLog.e("wzytest","mvalue:"+mValue);
+ //重新获取当前value
+ mValue = getNowValue();
+ AXLog.e("wzytest","重新获取的value:"+mValue);
+ //重新计算蓝色录像时间轴
+ initData();
+ }
+ }else if(currentStatus==STATUS_ZOOM_OUT&&Mode==Mode_2){
+ if(mLineDivider/3>LINE_DIVIDER){
+ mLineDivider = 2;
+ lastItemDivider = 2;
+ useString = timeString1;
+ Mode = Mode_1;
+ valueToSencond = valueToSencond/3;
+ mValue = getNowValue();
+ //重新计算蓝色录像时间轴
+ initData();
+ }
+ }else if(currentStatus==STATUS_ZOOM_OUT&&Mode==Mode_1){
+ if(mLineDivider/2>LINE_DIVIDER){
+ mLineDivider = 2;
+ lastItemDivider = 2;
+ useString = timeString0;
+ Mode = Mode_0;
+ valueToSencond = valueToSencond/2;
+ //重新获取当前value
+ mValue = getNowValue();
+ //重新计算蓝色录像时间轴
+ initData();
+ }
+ }
+
+ AXLog.e("wzytest","itemDivider:"+mLineDivider+" lastItemDivider:"+lastItemDivider);
+ postInvalidate();
+ }
+ break;
+ case MotionEvent.ACTION_POINTER_UP:
+ if (event.getPointerCount() == 2) {
+ //lastValueTosecond = valueToSencond;
+ lastItemDivider = mLineDivider;
+ }
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ AXLog.e("wzytest", "ACTION_CANCEL.......");
+ break;
+ default:
+ break;
+ }
+ return true;
+// return super.onTouchEvent(event);
+ }
+
+ private void notifyValueChange() {
+
+ if (null != mListener) {
+ mListener.onValueChange(mValue);
+ }
+ }
+
+
+ /**
+ * 获取当前刻度值
+ *
+ * @return
+ */
+ public float getValue() {
+ return mValue;
+ }
+
+ /**
+ * 设置当前刻度值
+ *
+ * @param mValue
+ */
+ public void setmValue(int mValue) {
+ this.mValue = mValue;
+ }
+
+ /**
+ * 画中间的红色指示线
+ *
+ * @param canvas
+ */
+ private void drawMiddleLine(Canvas canvas) {
+ int indexWidth = 5;
+ String color = "#66999999";
+ Paint redPaint = new Paint();
+ redPaint.setStrokeWidth(indexWidth);
+ redPaint.setColor(Color.RED);
+ // canvas.drawLine(mWidth / 2, 0, mWidth / 2 , mHeight, shadowPaint);
+ canvas.drawLine(mWidth / 2, 0, mWidth / 2, mHeight, redPaint);
+
+ }
+
+ public static int getNowValue() {
+ Calendar c = Calendar.getInstance();//可以对每个时间域单独修改
+
+ int hour = c.get(Calendar.HOUR_OF_DAY);
+ int minute = c.get(Calendar.MINUTE);
+ int second = c.get(Calendar.SECOND);
+ Log.e("wzytest", "hour:" + hour + " minute:" + minute + " second:" + second);
+
+ //一个mvalue代表25 秒,两个刻度中间间隔了(60/5)个mvalue
+ return ((hour * 60 + minute) * 60 + second) / valueToSencond ;
+ // return 360;
+ }
+
+ /**
+ * 获取mValue 所对应的时间
+ * @param mValue
+ * @return
+ */
+ public static String getTime(float mValue) {
+ // TODO: 2017/10/23 超过24小时 和 少于0小时的处理
+
+ int day = (int) (mValue * valueToSencond / (3600 * 24)); // 天数
+ int hour = (int) ((mValue * valueToSencond - (60 * 60 * 24) * day) / 3600);
+ int minute = (int) (mValue * valueToSencond - 3600 * hour - (60 * 60 * 24) * day) / 60;
+ int second = (int) mValue * valueToSencond - hour * 3600 - minute * 60 - (60 * 60 * 24) * day;
+
+ AXLog.e("wzytest", "hour:" + hour + " minute:" + minute + " second:" + second + " day:" + day);
+ Calendar calendar1 = Calendar.getInstance();
+ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ /**
+ * 从00:00:00开始设置时间
+ */
+ calendar1.add(Calendar.DATE, day);
+ calendar1.set(Calendar.HOUR_OF_DAY, hour);
+ calendar1.set(Calendar.MINUTE, minute);
+ calendar1.set(Calendar.SECOND, second);
+
+ String moveDate = sdf1.format(calendar1.getTime());
+ return moveDate;
+ }
+
+
+ /**
+ * 获取时间戳所对应的mvalue
+ * @param time 录像时间段time
+ * @return
+ */
+ private int getmValue(long time) {
+ /**
+ * 从00:00:00开始设置时间
+ */
+ calendar1.set(Calendar.HOUR_OF_DAY, 0);
+ calendar1.set(Calendar.MINUTE, 0);
+ calendar1.set(Calendar.SECOND, 0);
+ long l1 = calendar1.getTimeInMillis();
+ return (int) (time - l1) / (1000 * valueToSencond);
+ }
+
+ /**
+ * 计算两个手指之间的距离。
+ *
+ * @param event
+ * @return 两个手指之间的距离
+ */
+ private double distanceBetweenFingers(MotionEvent event) {
+ float disX = Math.abs(event.getX(0) - event.getX(1));
+ float disY = Math.abs(event.getY(0) - event.getY(1));
+ return Math.sqrt(disX * disX + disY * disY);
+ }
+
+ /**
+ * 计算两个手指之间中心点的坐标。
+ *
+ * @param event
+ */
+ private void centerPointBetweenFingers(MotionEvent event) {
+ float xPoint0 = event.getX(0);
+ float yPoint0 = event.getY(0);
+ float xPoint1 = event.getX(1);
+ float yPoint1 = event.getY(1);
+ centerPointX = (xPoint0 + xPoint1) / 2;
+ centerPointY = (yPoint0 + yPoint1) / 2;
+ }
+
+
+}
diff --git a/app/src/main/java/com/lechange/demo/login/BindUserActivity.java b/app/src/main/java/com/lechange/demo/login/BindUserActivity.java
new file mode 100644
index 0000000..3fff5b2
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/login/BindUserActivity.java
@@ -0,0 +1,193 @@
+package com.lechange.demo.login;
+
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.common.CommonTitle;
+import com.lechange.demo.common.CommonTitle.OnTitleClickListener;
+import com.yonsz.z1.R;
+
+public class BindUserActivity extends Activity{
+
+ private CommonTitle mCommonTitle;
+
+ private EditText mAuthCodeEdit ;
+ private Button mGetAuthCodeBtn;
+ private Button mBindBtn;
+ private TextView mNoticeText;
+ private String mPhoneNumber;
+ private int mTime = 0;
+ private final Handler handler = new Handler(){
+ @Override
+ public void handleMessage(Message msg) {
+ if(msg.what > 1)
+ {
+ sendEmptyMessageDelayed(mTime--, 1000);
+ mGetAuthCodeBtn.setText("重新获取(" + mTime +")");
+ }
+ else if(msg.what <= 1)
+ {
+ mGetAuthCodeBtn.setText("重新获取");
+ mGetAuthCodeBtn.setTextColor(Color.BLUE);
+ }
+
+ }
+
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ this.setContentView(R.layout.activity_user_bind);
+ mPhoneNumber = getIntent().getStringExtra("phoneNumber");
+ initView();
+ initTitle();
+ setListener();
+ }
+
+ public void initView()
+ {
+ mAuthCodeEdit = (EditText) findViewById(R.id.authCodeEdit);
+ mGetAuthCodeBtn = (Button) findViewById(R.id.getAuthCode);
+ mBindBtn = (Button) findViewById(R.id.bind);
+ mNoticeText = (TextView) findViewById(R.id.authCodeNotice);
+ mNoticeText.setText(this.getString(R.string.bind_user_notice) + mPhoneNumber);
+ }
+
+ public void initTitle()
+ {
+ //绘制标题
+ mCommonTitle = (CommonTitle) findViewById(R.id.title);
+ mCommonTitle.initView(R.drawable.title_btn_back, 0, R.string.user_bind);
+
+ mCommonTitle.setOnTitleClickListener(new OnTitleClickListener() {
+ @Override
+ public void onCommonTitleClick(int id) {
+ // TODO Auto-generated method stub
+ switch (id) {
+ case CommonTitle.ID_LEFT:
+ finish();
+ }
+ }
+ });
+ }
+
+ public void setListener()
+ {
+ mBindBtn.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ checkSms();
+ }
+ });
+ mGetAuthCodeBtn.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ //还在倒计时
+ if(mTime > 0)
+ return;
+ getUserSms();
+ }
+ });
+
+ mAuthCodeEdit.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int arg2, int arg3) {
+ if(s.length() != 0){
+ mBindBtn.setBackgroundColor(Color.rgb(0x4e, 0xa7, 0xf2));
+ }
+ else{
+ mBindBtn.setBackgroundColor(Color.rgb(0x8a, 0xb9, 0xe1));
+ }
+
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
+ int arg3) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable arg0) {
+
+ }
+ });
+ }
+
+ @Override
+ protected void onDestroy() {
+ // TODO Auto-generated method stub
+ super.onDestroy();
+ }
+
+
+ public void checkSms(){
+ mNoticeText.setVisibility(View.INVISIBLE);
+ mBindBtn.setClickable(false);
+ String smsCode = mAuthCodeEdit.getText().toString().trim();
+ if(smsCode.length() == 0)
+ {
+ Toast.makeText(getApplicationContext(), R.string.toast_userbind_no_idcode, Toast.LENGTH_LONG).show();
+ mBindBtn.setClickable(true);
+ return;
+ }
+
+ Business.getInstance().checkUserSms(mPhoneNumber, smsCode, new Handler(){
+ @Override
+ public void handleMessage(Message msg) {
+ if(0 == msg.what)
+ {
+ finish();
+ }
+ else
+ {
+ mNoticeText.setText((String)msg.obj);
+ mNoticeText.setVisibility(View.VISIBLE);
+ }
+ mBindBtn.setClickable(true);
+ }
+
+ });
+ }
+
+ /**
+ * 获取短信验证码
+ */
+ public void getUserSms(){
+ mNoticeText.setVisibility(View.INVISIBLE);
+ Business.getInstance().getUserSms(mPhoneNumber, new Handler(){
+ @Override
+ public void handleMessage(Message msg) {
+ if(0 == msg.what)
+ {
+ mGetAuthCodeBtn.setTextColor(Color.rgb(195, 195, 200));
+ mTime = 60;
+ handler.obtainMessage(60).sendToTarget();
+
+ mNoticeText.setText(getApplication().getResources().getString(R.string.bind_user_notice) + mPhoneNumber);
+ mNoticeText.setVisibility(View.VISIBLE);
+ }
+ else
+ {
+ String result = (String)msg.obj;
+ mNoticeText.setText(result);
+ mNoticeText.setVisibility(View.VISIBLE);
+ }
+ }
+
+ });
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/login/SplashActivity.java b/app/src/main/java/com/lechange/demo/login/SplashActivity.java
new file mode 100644
index 0000000..1bcdb79
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/login/SplashActivity.java
@@ -0,0 +1,65 @@
+/*
+ * 项目名: YYS
+ * 文件名: YysApp.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.login;
+
+
+import android.app.Activity;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.os.Bundle;
+import com.lechange.demo.login.fragment.SplashErrFragment;
+import com.lechange.demo.login.fragment.SplashNormalFragment;
+import com.yonsz.z1.R;
+
+/**
+ *
+ * 描述:启动界面
+ *
+ * @author:fuwl
+ */
+
+public class SplashActivity extends Activity {
+ public static final String tag = "LoginActivity";
+ public SplashNormalFragment mFragemnt;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ this.setContentView(R.layout.activity_splash);
+ FragmentManager fragementManager = getFragmentManager();
+ FragmentTransaction fragmentTansaction = fragementManager.beginTransaction();
+ mFragemnt = new SplashNormalFragment();
+
+ fragmentTansaction.add(R.id.frame_content, mFragemnt);
+ fragmentTansaction.commit();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ }
+
+ public void changeFragment()
+ {
+ FragmentManager fragementManager = getFragmentManager();
+ FragmentTransaction fragmentTansaction = fragementManager.beginTransaction();
+ SplashErrFragment errorFragment = new SplashErrFragment();
+ Bundle bundle = new Bundle();
+ bundle.putString("appId", mFragemnt.getAppId());
+ bundle.putString("appSecret", mFragemnt.getAppSecret());
+ errorFragment.setArguments(bundle);
+ fragmentTansaction.replace(R.id.frame_content, errorFragment);
+ fragmentTansaction.addToBackStack(null);
+ fragmentTansaction.commit();
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/login/UserLoginActivity.java b/app/src/main/java/com/lechange/demo/login/UserLoginActivity.java
new file mode 100644
index 0000000..fb97c2e
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/login/UserLoginActivity.java
@@ -0,0 +1,191 @@
+package com.lechange.demo.login;
+
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.lechange.demo.business.Business;
+import com.lechange.demo.common.CommonTitle;
+import com.lechange.demo.common.CommonTitle.OnTitleClickListener;
+import com.lechange.demo.listview.DevicelistActivity;
+import com.yonsz.z1.R;
+
+public class UserLoginActivity extends Activity {
+
+ private String tag = "UserLoginActivity";
+ private EditText mZoomEdit;
+ private EditText mPhoneEdit;
+ private Button mBindUserBtn;
+ private Button mDeviceListBtn;
+ private TextView notice;
+ private CommonTitle mCommonTitle;
+ private SharedPreferences sp; //固化数据
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // TODO Auto-generated method stub
+ super.onCreate(savedInstanceState);
+ this.setContentView(R.layout.activity_user_login);
+ sp = this.getSharedPreferences("OpenSDK", MODE_PRIVATE);
+ initView();
+ initTitle();
+ setListener();
+ }
+
+ public void initView() {
+ mZoomEdit = (EditText) findViewById(R.id.zoneView);
+ mZoomEdit.setText(sp.getString("zone", "+86"));
+ mPhoneEdit = (EditText) findViewById(R.id.phoneEdit);
+ mPhoneEdit.setText(sp.getString("userphonenumber", ""));
+
+ mBindUserBtn = (Button) findViewById(R.id.bindUser);
+ mDeviceListBtn = (Button) findViewById(R.id.deviceList);
+ notice = (TextView) findViewById(R.id.notice);
+ }
+
+ public void initTitle() {
+ //绘制标题
+ mCommonTitle = (CommonTitle) findViewById(R.id.title);
+ mCommonTitle.initView(R.drawable.title_btn_back, 0, R.string.user_login_name);
+
+ mCommonTitle.setOnTitleClickListener(new OnTitleClickListener() {
+ @Override
+ public void onCommonTitleClick(int id) {
+ // TODO Auto-generated method stub
+ switch (id) {
+ case CommonTitle.ID_LEFT:
+ finish();
+ }
+ }
+ });
+ }
+
+ public void setListener() {
+ mBindUserBtn.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ userLogin(mBindUserBtn.getId());
+ }
+ });
+
+ mDeviceListBtn.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ userLogin(mDeviceListBtn.getId());
+ }
+ });
+
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ // TODO Auto-generated method stub
+ super.onDestroy();
+ }
+
+
+ /**
+ * 获取usertoken
+ */
+ public void userLogin(final int id) {
+ notice.setVisibility(View.INVISIBLE);
+ String zone = mZoomEdit.getText().toString().trim();
+ String phoneNumber = mPhoneEdit.getText().toString().trim();
+
+ if (phoneNumber.length() != 11) {
+ notice.setText(R.string.user_no_input);
+ notice.setVisibility(View.VISIBLE);
+ return;
+ }
+
+
+ mBindUserBtn.setClickable(false);
+ mDeviceListBtn.setClickable(false);
+
+ Editor editor = sp.edit();
+ editor.putString("userphonenumber", phoneNumber);
+ editor.putString("zone", zone);
+ editor.commit();
+
+ if (!zone.endsWith("86") && !zone.equals("")) {
+ phoneNumber = zone + phoneNumber;
+ }
+
+
+ Business.getInstance().userlogin(phoneNumber, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ switch (id) {
+ case R.id.bindUser:
+ notice.setText(R.string.user_bind_err);
+ notice.setVisibility(View.VISIBLE);
+ break;
+ case R.id.deviceList:
+ String userToken = (String) msg.obj;
+ Log.d(tag, "userToken" + userToken);
+ Business.getInstance().setToken(userToken);
+ startActivity();
+ break;
+ }
+ } else {
+ switch (id) {
+ case R.id.bindUser:
+ if (1 == msg.what)
+ startBindUserActivity();
+ else {
+ String result = (String) msg.obj;
+ notice.setText(result);
+ notice.setVisibility(View.VISIBLE);
+ }
+ break;
+ case R.id.deviceList:
+ if (1 != msg.what) {
+ String result = (String) msg.obj;
+ notice.setText(result);
+ } else {
+ notice.setText(R.string.user_nobind_err);
+ }
+
+ notice.setVisibility(View.VISIBLE);
+ break;
+ }
+ }
+ mBindUserBtn.setClickable(true);
+ mDeviceListBtn.setClickable(true);
+ }
+
+ });
+ }
+
+ public void startBindUserActivity() {
+ Intent intent = new Intent(UserLoginActivity.this, BindUserActivity.class);
+ intent.putExtra("phoneNumber", mPhoneEdit.getText().toString());
+ startActivity(intent);
+ }
+
+ /**
+ * 跳转到主页
+ */
+ public void startActivity() {
+ Intent mIntent = new Intent(this, DevicelistActivity.class);
+ Bundle b = getIntent().getExtras();
+ if (b != null) {
+ mIntent.putExtras(getIntent().getExtras());
+ }
+ startActivity(mIntent);
+ finish();
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/login/fragment/SplashErrFragment.java b/app/src/main/java/com/lechange/demo/login/fragment/SplashErrFragment.java
new file mode 100644
index 0000000..3f4c545
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/login/fragment/SplashErrFragment.java
@@ -0,0 +1,54 @@
+package com.lechange.demo.login.fragment;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+
+import com.yonsz.z1.R;
+
+public class SplashErrFragment extends Fragment {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+
+ return inflater.inflate(R.layout.fragment_splash_err, container, false);
+
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ // TODO Auto-generated method stub
+ super.onActivityCreated(savedInstanceState);
+ EditText appId = (EditText) getView().findViewById(R.id.editAppId);
+ EditText appSecret = (EditText) getView().findViewById(
+ R.id.editAppSectet);
+ appId.setText(getArguments().getString("appId"));
+ appSecret.setText(getArguments().getString("appSecret"));
+ LinearLayout layout = (LinearLayout) getView().findViewById(
+ R.id.container);
+ layout.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+ getFragmentManager().popBackStack();
+
+ }
+
+ });
+ }
+
+ @Override
+ public void onDestroy() {
+ // TODO Auto-generated method stub
+ super.onDestroy();
+ }
+
+
+
+}
diff --git a/app/src/main/java/com/lechange/demo/login/fragment/SplashNormalFragment.java b/app/src/main/java/com/lechange/demo/login/fragment/SplashNormalFragment.java
new file mode 100644
index 0000000..49c5c7e
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/login/fragment/SplashNormalFragment.java
@@ -0,0 +1,192 @@
+package com.lechange.demo.login.fragment;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.Toast;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.listview.DevicelistActivity;
+import com.lechange.demo.login.SplashActivity;
+import com.lechange.demo.login.UserLoginActivity;
+import com.yonsz.z1.R;
+
+public class SplashNormalFragment extends Fragment{
+
+ private EditText appId = null;
+ private EditText appSecret = null;
+ private EditText appUrl = null;
+ private ImageView adminBtn = null;
+ private ImageView userBtn = null;
+ private SharedPreferences sp; //固化数据
+ private Activity mActivity;
+
+
+ public String getAppId() {
+ return appId.getText().toString();
+ }
+
+
+
+ public String getAppSecret() {
+ return appSecret.getText().toString();
+ }
+
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ sp = getActivity().getSharedPreferences("OpenSDK", SplashActivity.MODE_PRIVATE);
+ return inflater.inflate(R.layout.fragment_splash_normal, container,false);
+
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ initView();
+ setListener();
+
+// inner online
+ appId.setText(sp.getString("appid", ""));
+ appSecret.setText(sp.getString("appsecret", ""));
+ appUrl.setText(sp.getString("appurl", Business.getInstance().isOversea ? "openapi.easy4ip.com:443" : "openapi.lechange.cn:443"));
+ appUrl.setVisibility(View.INVISIBLE);
+
+ }
+
+ @Override
+ public void onDestroy() {
+ // TODO Auto-generated method stub
+ super.onDestroy();
+ }
+
+ private void initView()
+ {
+ mActivity = getActivity();
+
+ appId = (EditText) getView().findViewById(R.id.editAppId);
+ appSecret = (EditText) getView().findViewById(R.id.editAppSectet);
+ appUrl = (EditText) getView().findViewById(R.id.editappurl);
+ adminBtn = (ImageView) getView().findViewById(R.id.adminButton);
+ userBtn = (ImageView) getView().findViewById(R.id.userButton);
+
+ if(!getResources().getConfiguration().locale.getLanguage().endsWith("zh")){
+ userBtn.setVisibility(View.GONE);
+ }
+ }
+
+ private void setListener()
+ {
+ adminBtn.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if(!validCheck())
+ {
+ SplashActivity splashActivity = (SplashActivity) getActivity();
+ splashActivity.changeFragment();
+ return;
+ }
+ //按钮不能点击,防止连击开启多个activity;也可以修改启动模式
+ adminBtn.setClickable(false);
+
+ //初始化需要的数据
+ Business.getInstance().init(appId.getText().toString(), appSecret.getText().toString(), appUrl.getText().toString());
+
+ Editor editor=sp.edit();
+ editor.putString("appid", appId.getText().toString());
+ editor.putString("appsecret", appSecret.getText().toString());
+ editor.putString("appurl", appUrl.getText().toString());
+ editor.commit();
+
+ adminLogin();
+ }
+
+ });
+
+ userBtn.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+ if(!validCheck())
+ {
+ SplashActivity splashActivity = (SplashActivity) getActivity();
+ splashActivity.changeFragment();
+ return;
+ }
+
+ //初始化需要的数据
+ Business.getInstance().init(appId.getText().toString(), appSecret.getText().toString(), appUrl.getText().toString());
+
+ Editor editor=sp.edit();
+ editor.putString("appid", appId.getText().toString());
+ editor.putString("appsecret", appSecret.getText().toString());
+ editor.putString("appurl", appUrl.getText().toString());
+ editor.commit();
+
+ Intent intent = new Intent(getActivity(),UserLoginActivity.class );
+ getActivity().startActivity(intent);
+
+ }
+
+ });
+ }
+
+ private void adminLogin() {
+ Business.getInstance().adminlogin(new Handler(){
+ @Override
+ public void handleMessage(Message msg) {
+ if(0 == msg.what)
+ {
+ String accessToken = (String) msg.obj;
+ Business.getInstance().setToken(accessToken);
+
+ //恢复可点击
+ adminBtn.setClickable(true);
+ startActivity();
+ }
+ else{
+ if(1 == msg.what){
+ Toast.makeText(mActivity, "getToken failed", Toast.LENGTH_SHORT).show();
+ }else{
+ String result = (String)msg.obj;
+ Toast.makeText(mActivity, result, Toast.LENGTH_SHORT).show();
+ }
+ //恢复可点击
+ adminBtn.setClickable(true);
+ }
+ }
+
+ });
+ }
+
+ private void startActivity() {
+ Intent mIntent = new Intent(this.getActivity(), DevicelistActivity.class);
+ Bundle b = mActivity.getIntent().getExtras();
+ if (b != null) {
+ mIntent.putExtras(mActivity.getIntent().getExtras());
+ }
+ startActivity(mIntent);
+ }
+
+ private boolean validCheck()
+ {
+
+ if(appId.getText().length()==0 || appSecret.getText().length() == 0)
+ {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/manager/DeviceAddActivity.java b/app/src/main/java/com/lechange/demo/manager/DeviceAddActivity.java
new file mode 100644
index 0000000..2b6c4d7
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/manager/DeviceAddActivity.java
@@ -0,0 +1,895 @@
+package com.lechange.demo.manager;
+
+import android.Manifest;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.EditText;
+
+import com.alibaba.fastjson.JSON;
+import com.lechange.common.configwifi.LCSmartConfig;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.Business.RetObject;
+import com.lechange.demo.business.util.TaskPoolHelper;
+import com.lechange.demo.business.util.TaskPoolHelper.RunnableTask;
+import com.lechange.demo.common.ProgressDialog;
+import com.lechange.demo.yonsz.AddCompleteAndRenameActivity;
+import com.lechange.demo.yonsz.TimeOutActivity;
+import com.lechange.opensdk.api.bean.DeviceOnline;
+import com.lechange.opensdk.configwifi.LCOpenSDK_ConfigWifi;
+import com.lechange.opensdk.media.DeviceInitInfo;
+import com.yonsz.z1.R;
+import com.yonsz.z1.activity.BaseActivity;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.gateway.AddLCSafeCompleteActivity;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.mine.aboutversion.customview.ConfirmDialog;
+import com.yonsz.z1.mine.aboutversion.feature.Callback;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.net.NetWorkUtil;
+import com.yonsz.z1.utils.AppIdUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.view.StateButton;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.HashMap;
+import java.util.List;
+
+import de.greenrobot.event.EventBus;
+
+import static com.yonsz.z1.UniKongApp.getActivity;
+import static com.yonsz.z1.difference.DifferConstans.LECHENG_KEY;
+import static com.yonsz.z1.net.Constans.GATE_WAY;
+import static com.yonsz.z1.net.Constans.UPDATE_SEC;
+import static com.yonsz.z1.net.Constans.deviceNumListPosition;
+import static com.yonsz.z1.net.Constans.homeListEntity;
+import static com.yonsz.z1.net.Constans.localAddAddressId;
+import static com.yonsz.z1.net.NetWorkUrl.BIND_DEVICE;
+import static com.yonsz.z1.version5.MainFragment5.isRefreshCamera;
+
+public class DeviceAddActivity extends BaseActivity implements
+ ActivityCompat.OnRequestPermissionsResultCallback {
+ public final static String tag = "AddDeviceActivity";
+ // 无线配置参数
+ private static final int PROGRESS_TIMEOUT_TIME = 120 * 1000;
+ private static final int PROGRESS_DELAY_TIME = 10 * 1000;
+ private final int startPolling = 0x10;
+ private final int successOnline = 0x11;
+ private final int asynWaitOnlineTimeOut = 0x12;
+ private final int successAddDevice = 0x13;
+ // private final int successOffline = 0x14;
+ // private final int addDeviceTimeOut = 0x15;
+ // private final int failedAddDevice = 0x16;
+ // private final int successOnlineEx = 0x17;
+ private final int deviceInitSuccess = 0x18;
+ private final int deviceInitFailed = 0x19;
+ private final int deviceInitByIPFailed = 0x1A;
+ private final int deviceSearchSuccess = 0x1B;
+ private final int deviceSearchFailed = 0x1C;
+ private final int INITMODE_UNICAST = 0;
+ private final int INITMODE_MULTICAST = 1;
+ private TitleView mTitleView;
+ private int curInitMode = INITMODE_MULTICAST;
+ private ProgressDialog mProgressDialog; // 播放加载使用
+ private String key = "";
+ private Handler mHandler;
+ private boolean mIsOffline = true;
+ private boolean mIsDeviceSearched = false; //设备初始化标志,保证设备初始化接口只调用一次
+
+ // 配对方式
+ private boolean mIsDeviceInitSuccess = false;
+ private ConfigStatus mConfigStatus = ConfigStatus.query; // 默认为轮询状态
+ private int time = 25;
+
+ private String deviceSN, deviceCode = "";
+ private StateButton mStateButton;
+ private int sec = 100;
+
+ /**
+ * 无线配对超时任务
+ */
+ private Runnable progressRun = new Runnable() {
+ @Override
+ public void run() {
+ // TODO Auto-generated method stub
+ toast("超时配置失败");
+ stopConfig();
+ gotoTimeOutActivity();
+ }
+ };
+ /**
+ * 轮询定时启动任务
+ */
+ private Runnable progressPoll = new Runnable() {
+ @Override
+ public void run() {
+ // TODO Auto-generated method stub
+ mHandler.obtainMessage(startPolling).sendToTarget();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_device_lcadd);
+
+ initView();
+ }
+
+ private void initView() {
+ deviceSN = getIntent().getExtras().get("deviceSN").toString();
+ deviceCode = getIntent().getExtras().get("deviceCode").toString();
+ // load组件
+ mStateButton = (StateButton) findViewById(R.id.bt_sec);
+ mProgressDialog = (ProgressDialog) this.findViewById(R.id.query_load);
+ mTitleView = (TitleView) findViewById(R.id.title_lecheng_add);
+ mTitleView.setHead(R.string.add_device);
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ if (sec > 0) {
+ showIsFinishThis();
+ } else {
+ finish();
+ }
+ }
+
+ @Override
+ public void onFunction() {
+
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+
+ mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ // TODO Auto-generated method stub
+ super.handleMessage(msg);
+ Log.d(tag, "msg.what" + msg.what);
+ switch (msg.what) {
+ // 无线配对消息回调
+ /*case LCOpenSDK_ConfigWifi.ConfigWifi_Event_Success:
+ Log.d(tag, "smartConfig success");
+ mConfigStatus = ConfigStatus.wifipair;
+ toast("smartConfig success");
+ stopConfig();
+ mHandler.removeCallbacks(progressPoll);
+ if (!mIsDeviceSearched) {
+ mIsDeviceSearched = true;
+// searchDevice();
+ }
+ break;*/
+ case deviceSearchSuccess:
+ Log.d(tag, "deviceSearchSuccess");
+ initDevice((DeviceInitInfo) msg.obj, curInitMode);
+ break;
+ case deviceSearchFailed:
+ Log.d(tag, "deviceSearchFailed:" + (String) msg.obj);
+ toast("deviceSearchFailed:" + (String) msg.obj);
+ gotoTimeOutActivity();
+ break;
+ case deviceInitSuccess:
+ Log.d(tag, "deviceInitSuccess");
+ toast("deviceInitSuccess!");
+ mIsDeviceInitSuccess = true;
+ if (mIsOffline)
+ checkOnline();
+ else
+ mHandler.obtainMessage(successOnline).sendToTarget();
+ break;
+ case deviceInitFailed:
+ toast("deviceInitFailed: " + (String) msg.obj);
+ //组播失败后走单播
+ curInitMode = INITMODE_UNICAST;
+ // searchDevice();
+ break;
+ case deviceInitByIPFailed:
+ toast("deviceInitByIPFailed: " + (String) msg.obj);
+ curInitMode = INITMODE_MULTICAST;
+ time = 0;
+ mProgressDialog.setStop();
+ break;
+ case startPolling:
+ checkOnline();
+ break;
+ // 校验消息回调
+ case asynWaitOnlineTimeOut:
+ Log.d(tag, "checkIsOnlineTimeOut");
+ break;
+ case successOnline:
+ Log.d(tag, "successOnline");
+ stopConfig();
+ if (deviceCode.equals("123456")) {
+ bindDevice();
+ } else {
+ if (!mIsDeviceSearched) {
+ mIsDeviceSearched = true;
+ searchDevice(PROGRESS_TIMEOUT_TIME);
+ } else if (mIsDeviceInitSuccess) {//设备初始化成功且在线,则绑定
+ unBindDeviceInfo();
+ }
+ }
+ // unBindDeviceInfo();
+ break;
+ case successAddDevice:
+ // DeviceInfo device = (DeviceInfo) msg.obj;
+ // success(device.getUuid());
+ isRefreshCamera = true;
+ Log.d(tag, "SuccessAddDevice");
+ toast("SuccessAddDevice");
+ // 只有这么一种情况
+ setResult(RESULT_OK);
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("5"));
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ sec = 101;
+ Intent intent;
+ if (getIntent().getExtras().get("deviceType").toString().equals(GATE_WAY)) {
+ intent = new Intent(DeviceAddActivity.this, AddLCSafeCompleteActivity.class);
+ intent.putExtra("deviceType", getIntent().getExtras().get("deviceType").toString());
+ } else {
+ intent = new Intent(DeviceAddActivity.this, AddCompleteAndRenameActivity.class);
+ }
+ intent.putExtra("deviceSN", deviceSN);
+ intent.putExtra("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ startActivity(intent);
+ finish();
+ break;
+ case UPDATE_SEC:
+ if (sec > 1 && sec < 101) {
+ sec--;
+ mHandler.sendEmptyMessageDelayed(UPDATE_SEC, 1000);
+ mStateButton.setText(getResources().getString(R.string.sec_30, sec));
+ } else if (sec <= 1) {
+ gotoTimeOutActivity();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ //开始匹配
+ mIsDeviceSearched = false;
+ mIsOffline = true;
+ mIsDeviceInitSuccess = false;
+ showWifiConfig();
+ mHandler.sendEmptyMessageDelayed(UPDATE_SEC, 1000);
+ }
+
+ private void gotoTimeOutActivity() {
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ Intent intent1 = new Intent(DeviceAddActivity.this, TimeOutActivity.class);
+ intent1.putExtra("ssid", getIntent().getExtras().get("ssid").toString());
+ intent1.putExtra("password", getIntent().getExtras().get("password").toString());
+ intent1.putExtra("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ intent1.putExtra("deviceType", getIntent().getExtras().get("deviceType").toString());
+ intent1.putExtra("deviceSN", deviceSN);
+ intent1.putExtra("deviceCode", deviceCode);
+ intent1.putExtra("from", "LcnDeviceAddActivity");
+ startActivity(intent1);
+ finish();
+ }
+
+ @Override
+ public void onBackPressed() {
+ // super.onBackPressed();
+ if (sec > 0) {
+ showIsFinishThis();
+ } else {
+ finish();
+ }
+ }
+
+ private void showIsFinishThis() {
+ ConfirmDialog dialog = new ConfirmDialog(getActivity(), new Callback() {
+ @Override
+ public void callback(int position) {
+ switch (position) {
+ case 0:
+ break;
+ case 1:
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ sec = 101;
+ stopConfig();
+ finish();
+ break;
+ }
+ }
+ });
+ dialog.setContent("您还未完成配置,如果退出,您将可能重新开始配置流程");
+ dialog.setCancleBtn(R.string.cancel);
+ dialog.setSureBtn(R.string.sure);
+ dialog.setCancelable(false);
+ dialog.show();
+ }
+
+ @Override
+ public void onDestroy() {
+ // TODO Auto-generated method stub
+ super.onDestroy();
+ sec = 101;
+ time = 0;
+ stopConfig();
+ }
+
+ @Override
+ public void callBackUiThread(Message msg) {
+
+ }
+
+ /**
+ * 校验在线
+ */
+
+ /*private void checkOnline() {
+ Business.getInstance().checkOnline(devId,
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ Business.RetObject retObject = (Business.RetObject) msg.obj;
+ switch (msg.what) {
+ case 0:
+ if (((DeviceOnline.Response) retObject.resp).data.onLine.equals("1")) {
+ toast("Online");
+ mHandler.obtainMessage(successOnline).sendToTarget();
+ } else {
+ if(isCheckOnline) {
+ Logger.d(TAG,"onLine : "+((DeviceOnline.Response) retObject.resp).data.onLine);
+ mHandler.obtainMessage(CHECK_DEVICE_ONLINE).sendToTarget();
+ }
+ }
+ break;
+ case -1000:
+ Logger.e(TAG,"check_online_respond : -1000");
+ mHandler.obtainMessage(ON_LINE_FAILED).sendToTarget();
+ break;
+ default:
+ Logger.e(TAG,"checkonline : "+msg.what);
+ mHandler.obtainMessage(ON_LINE_FAILED).sendToTarget();
+ break;
+ }
+ }
+ });
+
+ }*/
+ private void checkOnline() {
+ // 隔两秒轮询.....
+ Log.d(tag, "轮询" + deviceSN);
+ Business.getInstance().checkOnline(deviceSN,
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (!mIsOffline)
+ return;
+
+ RetObject retObject = (RetObject) msg.obj;
+ Log.d(tag, "轮询" + msg.what);
+ switch (msg.what) {
+ case 0:
+ if (((DeviceOnline.Response) retObject.resp).data.onLine.equals("1")) {
+ switch (mConfigStatus) {
+ case wired:
+ Log.d(tag, "有线配对....");
+ break;
+ case query:
+ Log.d(tag, "轮询....");
+ stopConfig();
+ case wifipair:
+ mProgressDialog.setStop();
+ }
+ toast("Online");
+ mIsOffline = false;
+ mHandler.obtainMessage(successOnline).sendToTarget();
+ } else {
+ if (mConfigStatus == ConfigStatus.wired) {
+ Log.d(tag, "offline..... wired");
+ toast("offline");
+ gotoTimeOutActivity();
+ } else if (time > 0) {
+ Log.d(tag, "offline..... try again checkOnline");
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ time--;
+ mHandler.obtainMessage(startPolling)
+ .sendToTarget();
+ } else {
+ Log.d(tag, "offline..... try again max");
+ mProgressDialog.setStop();
+ time = 25;
+ toast("offline");
+ }
+ }
+ break;
+ case -1000:
+ if (time > 0) {
+ Log.d(tag,
+ "code:-1000..... try again checkOnline");
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ time--;
+ mHandler.obtainMessage(startPolling)
+ .sendToTarget();
+ }
+ break;
+ default:
+ switch (mConfigStatus) {
+ case wired:
+ Log.d(tag, "有线配对失败....");
+ break;
+ case query:
+ Log.d(tag, "轮询失败....");
+ stopConfig();
+ case wifipair:
+ mProgressDialog.setStop();
+ }
+ toast(retObject.mMsg);
+ break;
+ }
+ }
+ });
+
+ }
+
+ /**
+ * 绑定
+ */
+ private void bindDevice() {
+ //调后台接口
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", deviceSN);
+ map.put("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ map.put("code", key);
+ if (AppIdUtil.isBaseZhiKong()) {
+ map.put("addressId", localAddAddressId);
+ } else {
+ if (null != getIntent().getExtras().get("deviceAddress")) {
+ map.put("addressId", getIntent().getExtras().get("deviceAddress").toString());
+ } else {
+ map.put("addressId", "1");
+ }
+ }
+ map.put("deviceModel", "0");
+ map.put("deviceType", getIntent().getExtras().get("deviceType").toString());
+ map.put("wifiName", getIntent().getExtras().get("ssid").toString());
+ if (null != homeListEntity && TextUtils.isEmpty(homeListEntity.getData().get(deviceNumListPosition).getFloorList())) {
+ if (null != getIntent().getExtras().get("floor")) {
+ map.put("floor", getIntent().getExtras().get("floor").toString());
+ }
+ }
+ netWorkUtil.requestPostByAsynewApi(BIND_DEVICE, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("bindDevice", "onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ mHandler.obtainMessage(successAddDevice).sendToTarget();
+ }
+
+ @Override
+ public void onFail(String message) {
+ toast("addDevice failed");
+ }
+ });
+ }
+
+ private void unBindDeviceInfo() {
+ if (!Business.getInstance().isOversea) {
+ Business.getInstance().unBindDeviceInfo(deviceSN, new Handler() {
+ public void handleMessage(Message msg) {
+ String message = (String) msg.obj;
+ Log.d(tag, "unBindDeviceInfo," + message);
+ if (msg.what == 0) {
+ if (message.contains("Auth")) {
+ if (sec > 99) {
+ return;
+ }
+ bindDevice();
+ } else if (message.contains("RegCode")) {
+ key = deviceCode;
+ if (sec > 99) {
+ return;
+ }
+ bindDevice();
+ } else {
+ key = "";
+ if (sec > 99) {
+ return;
+ }
+ bindDevice();
+ }
+ } else {
+ /*toast("unBindDeviceInfo failed");
+ Log.d(tag, message);*/
+
+ if (!deviceCode.equals("123456")) {
+ key = deviceCode;
+ } else {
+ key = "ysz123456";
+ }
+ bindDevice();
+ }
+ }
+ });
+ } else { //oversea
+ // unBindDeviceInfo();
+ if (!deviceCode.equals("123456")) {
+ key = deviceCode;
+ } else {
+ key = "ysz123456";
+ }
+ bindDevice();
+ }
+
+ }
+
+ /**
+ * 启动无线配对
+ */
+ private void startConfig() {
+ // 开启播放加载控件
+ mProgressDialog.setStart(getString(R.string.wifi_config_loading));
+
+ /*String ssid = mWifiInfo.getSSID().replaceAll("\"", "");
+ String ssid_pwd = mPwdText.getText().toString();
+ String code = mSnText.getText().toString().toUpperCase();*/
+
+ String ssid = getIntent().getExtras().get("ssid").toString().replaceAll("\"", "");
+ String ssid_pwd = getIntent().getExtras().get("password").toString();
+ String code = deviceSN.toUpperCase();
+
+ String mCapabilities = getWifiCapabilities(ssid);
+ // 无线超时任务
+ mHandler.postDelayed(progressRun, PROGRESS_TIMEOUT_TIME);
+ // 10s开启轮询
+ // mHandler.postDelayed(progressPoll, PROGRESS_DELAY_TIME);
+ // 调用接口,开始通过smartConfig匹配
+ // System.out.println("mLinkIPCProxy.start");
+ /*LCOpenSDK_ConfigWifi.configWifiStart(code, ssid, ssid_pwd,
+ mCapabilities, mHandler);*/
+ LCOpenSDK_ConfigWifi.configWifiStart(code, ssid, ssid_pwd, "WPA2", LCSmartConfig.ConfigType.LCConfigWifi_Type_ALL, true, 11000, 1);
+
+ //LCOpenSDK_ConfigWifi.configWifiStart(code, ssid, ssid_pwd, "WPA2", LCSmartConfig.ConfigType.LCConfigWifi_Type_ALL,true,11000,1);
+ searchDevice(PROGRESS_TIMEOUT_TIME);
+ }
+
+ /**
+ * 关闭无线配对
+ */
+ private void stopConfig() {
+ mHandler.removeCallbacks(progressRun);
+ LCOpenSDK_ConfigWifi.configWifiStop();// 调用smartConfig停止接口
+ }
+
+ /**
+ * 获取wifi加密信息
+ */
+ private String getWifiCapabilities(String ssid) {
+ String mCapabilities = null;
+ ScanResult mScanResult = null;
+ WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Activity.WIFI_SERVICE);
+ if (mWifiManager != null) {
+ WifiInfo mWifi = mWifiManager.getConnectionInfo();
+ if (mWifi != null) {
+ // 判断SSID是否�?��
+ if (mWifi.getSSID() != null
+ && mWifi.getSSID().replaceAll("\"", "").equals(ssid)) {
+ List mList = mWifiManager.getScanResults();
+ if (mList != null) {
+ for (ScanResult s : mList) {
+ if (s.SSID.replaceAll("\"", "").equals(ssid)) {
+ mScanResult = s;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ mCapabilities = mScanResult != null ? mScanResult.capabilities : null;
+ return mCapabilities;
+ }
+
+ private void toast(String content) {
+ /*Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT)
+ .show();*/
+ /*runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ToastUtil.show(LcnDeviceAddActivity.this, content);
+ }
+ });*/
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ @NonNull String[] permissions, @NonNull int[] grantResults) {
+ // TODO Auto-generated method stub
+ if (grantResults.length == 1
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ // Camera permission has been granted, preview can be displayed
+ showPairDescription();
+
+ } else {
+ toast(getString(R.string.toast_permission_location_forbidden));
+
+ }
+
+ }
+
+ /**
+ * 开启无线配网流程(权限检查,配对说明)
+ */
+ public void showWifiConfig() {
+ boolean isMinSDKM = Build.VERSION.SDK_INT < 23;
+ boolean isGranted = ActivityCompat.checkSelfPermission(this,
+ Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
+ if (isMinSDKM || isGranted) {
+
+ showPairDescription();
+ // 开启无线配对
+ return;
+ }
+
+ requestLocationPermission();
+ }
+
+ /**
+ * 显示配对说明
+ */
+ private void showPairDescription() {
+ startConfig();
+ /*DialogInterface.OnClickListener dialogOnclicListener = new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case Dialog.BUTTON_POSITIVE:
+ startConfig();
+ break;
+ case Dialog.BUTTON_NEGATIVE:
+ break;
+ case Dialog.BUTTON_NEUTRAL:
+ break;
+ }
+ }
+ };
+ // dialog参数设置
+ AlertDialog.Builder builder = new AlertDialog.Builder(
+ LcnDeviceAddActivity.this); // 先得到构造器
+ builder.setTitle(R.string.devices_config_dialog_title); // 设置标题
+ builder.setMessage(R.string.devices_config_dialog_message); // 设置内容
+ builder.setPositiveButton(R.string.dialog_positive,
+ dialogOnclicListener);
+ builder.setNegativeButton(R.string.dialog_negative,
+ dialogOnclicListener);
+ builder.create().show();*/
+ }
+
+ /**
+ * 请求相关权限
+ */
+ private void requestLocationPermission() {
+ if (ActivityCompat.shouldShowRequestPermissionRationale(this,
+ Manifest.permission.ACCESS_FINE_LOCATION)) {
+
+ Log.d("Uriah", "Uriah + shouldShowRequestPermission true");
+ ActivityCompat.requestPermissions(this,
+ new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
+ 1);
+ } else {
+ ActivityCompat.requestPermissions(this,
+ new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
+ 1);
+ }
+ }
+
+ private void searchDevice(int timeout) {
+ final String deviceId = deviceSN;
+ Business.getInstance().searchDevice(deviceId, timeout, new Handler() {
+ public void handleMessage(final Message msg) {
+ if (msg.what < 0) {
+ if (msg.what == -2)
+ mHandler.obtainMessage(deviceSearchFailed, "device not found").sendToTarget();
+ else
+ mHandler.obtainMessage(deviceSearchFailed, "StartSearchDevices failed").sendToTarget();
+ return;
+ }
+
+ mHandler.obtainMessage(deviceSearchSuccess, msg.obj).sendToTarget();
+ }
+ });
+ }
+
+ private void searchDeviceEx() {
+ final EditText et = new EditText(DeviceAddActivity.this);
+ final String deviceId = deviceSN;
+
+ //设备初始化
+ Business.getInstance().searchDevice(deviceId, 15000, new Handler() {
+ public void handleMessage(final Message msg) {
+ if (msg.what < 0) {
+ if (msg.what == -2)
+ mHandler.obtainMessage(deviceInitFailed, "device not found").sendToTarget();
+ else
+ mHandler.obtainMessage(deviceInitFailed, "StartSearchDevices failed").sendToTarget();
+ return;
+ }
+
+ final DeviceInitInfo deviceInitInfo = (DeviceInitInfo) msg.obj;
+ final int status = deviceInitInfo.mStatus;
+
+ //not support init
+ if (status == 0 && !Business.getInstance().isOversea) {
+ key = "";
+ mHandler.obtainMessage(deviceInitSuccess, "inner, go bind without key").sendToTarget();
+ } else {
+ if (status == 1) {
+ et.setHint(getString(R.string.toast_adddevice_input_device_key_to_init));
+ } else {
+ et.setHint(getString(R.string.toast_adddevice_input_device_key_after_init));
+ }
+
+ AlertDialog dialog = new AlertDialog.Builder(DeviceAddActivity.this)
+ .setTitle(R.string.alarm_message_keyinput_dialog_title)
+ .setIcon(android.R.drawable.ic_dialog_info)
+ .setView(et)
+ .setPositiveButton(R.string.dialog_positive,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ key = et.getText().toString();
+ if (status == 0 || status == 2) {
+ if (Business.getInstance().isOversea)
+ checkPwdValidity(deviceId, key, mHandler);
+ else
+ mHandler.obtainMessage(deviceInitSuccess, "Inner, go bind with key").sendToTarget();
+ } else if (status == 1) {
+ Business.getInstance().initDevice(deviceInitInfo.mMac, key, new Handler() {
+ public void handleMessage(Message msg) {
+ String message = (String) msg.obj;
+ if (msg.what == 0) {
+ mHandler.obtainMessage(deviceInitSuccess, message).sendToTarget();
+ } else {
+ mHandler.obtainMessage(deviceInitFailed, message).sendToTarget();
+ }
+ }
+
+ ;
+ });
+ }
+ }
+ })
+ .setNegativeButton(R.string.dialog_negative,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ mHandler.obtainMessage(deviceInitFailed, "Init has been cancelled").sendToTarget();
+ }
+ })
+ .create();
+ dialog.setCanceledOnTouchOutside(false);
+ dialog.show();
+ }
+ }
+ });
+
+ }
+
+ public void initDevice(final DeviceInitInfo deviceInitInfo, int initMode) {
+ //1.使用组播进行初始化(initMode=INITMODE_MULTICAST),走else流程
+ //2.组播失败后再使用单播(initMode=INITMODE_UNICAST),此时直接使用组播时输入的秘钥进行初始化
+ if (initMode == INITMODE_UNICAST) {
+ Business.getInstance().initDeviceByIP(deviceInitInfo.mMac, deviceInitInfo.mIp, key, new Handler() {
+ public void handleMessage(Message msg) {
+ String message = (String) msg.obj;
+ if (msg.what == 0) {
+ mHandler.obtainMessage(deviceInitSuccess, message).sendToTarget();
+ } else {
+ mHandler.obtainMessage(deviceInitByIPFailed, message).sendToTarget();
+ }
+ }
+ });
+ } else {
+ final EditText et = new EditText(DeviceAddActivity.this);
+ final String deviceId = deviceSN;
+ final int status = deviceInitInfo.mStatus;
+ //not support init
+ if (status == 0 && !Business.getInstance().isOversea) {
+ key = "";
+ mHandler.obtainMessage(deviceInitSuccess, "inner, go bind without key").sendToTarget();
+ } else {
+ key = LECHENG_KEY;
+ if (status == 0 || status == 2) {
+ if (Business.getInstance().isOversea)
+ checkPwdValidity(deviceId, key, mHandler);
+ else
+ mHandler.obtainMessage(deviceInitSuccess, "Inner, go bind with key").sendToTarget();
+ } else if (status == 1) {
+ Business.getInstance().initDevice(deviceInitInfo.mMac, key, new Handler() {
+ public void handleMessage(Message msg) {
+ String message = (String) msg.obj;
+ if (msg.what == 0) {
+ mHandler.obtainMessage(deviceInitSuccess, message).sendToTarget();
+ } else {
+ mHandler.obtainMessage(deviceInitFailed, message).sendToTarget();
+ }
+ }
+
+ ;
+ });
+ }
+
+ /*AlertDialog dialog = new AlertDialog.Builder(LcnDeviceAddActivity.this)
+ .setTitle(R.string.alarm_message_keyinput_dialog_title)
+ .setIcon(android.R.drawable.ic_dialog_info)
+ .setView(et)
+ .setPositiveButton(R.string.dialog_positive,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ }
+ })
+ .setNegativeButton(R.string.dialog_negative,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ mHandler.obtainMessage(deviceInitByIPFailed, "Init has been cancelled").sendToTarget();
+ }
+ })
+ .create();
+ dialog.setCanceledOnTouchOutside(false);
+ dialog.show();*/
+ }
+ }
+ }
+
+ public void checkPwdValidity(final String deviceId, final String key, final Handler handler) {
+ TaskPoolHelper.addTask(new RunnableTask("real") {
+ @Override
+ public void run() {
+ if (0 == Business.getInstance().checkPwdValidity(deviceId, key)) {
+ handler.obtainMessage(deviceInitSuccess, "checkPwdValidity success").sendToTarget();
+ } else {
+ handler.obtainMessage(deviceInitByIPFailed, "checkPwdValidity failed").sendToTarget();
+ }
+ }
+ });
+ }
+
+ private enum ConfigStatus {
+ query, wifipair, wired
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/manager/DeviceSetActivity.java b/app/src/main/java/com/lechange/demo/manager/DeviceSetActivity.java
new file mode 100644
index 0000000..cc9a73f
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/manager/DeviceSetActivity.java
@@ -0,0 +1,348 @@
+package com.lechange.demo.manager;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+import android.widget.ToggleButton;
+
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.Business.RetObject;
+import com.lechange.demo.common.CommonTitle;
+import com.lechange.demo.common.CommonTitle.OnTitleClickListener;
+import com.lechange.demo.login.SplashActivity;
+import com.yonsz.z1.R;
+
+public class DeviceSetActivity extends Activity {
+
+ private String tag = "DeviceSetActivity";
+ private SharedPreferences mSharedPreferences;
+ private CommonTitle mCommonTitle;
+ private ToggleButton mSwitch; // 报警订阅开关
+ private ToggleButton mCloudMealBtn; // 云存储套餐开关
+ private Button mModifyPwd; //修改设备密码
+ private TextView mUpgrade; // 云升级开关
+ private String mChannelUUID = null;
+ private int mCloudMealStates; // 云套餐状态
+ private int mAlarmStates; // 报警计划状态
+ private boolean mCanBeUpgrade; //设备是否可云升级
+ private boolean IsClickSwitchBtn; // 是否主动修改动检开关(手势触发)
+ private boolean IsClickCloudMealBtn; // 是否主动修改套餐状态 (手势触发)
+ private LinearLayout mCloudStorageLL;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_device_set);
+
+ mSharedPreferences = getSharedPreferences("OpenSDK",
+ SplashActivity.MODE_PRIVATE);
+
+ mChannelUUID = getIntent().getStringExtra("UUID"); // 获取通道的UUID
+
+ mSwitch = (ToggleButton) findViewById(R.id.switchPlan);
+ mCloudMealBtn = (ToggleButton) findViewById(R.id.cloudMealBtn);
+ mModifyPwd = (Button) findViewById(R.id.modify_device_pwd);
+ mUpgrade = (TextView) findViewById(R.id.device_upgrade_icon);
+ mCloudStorageLL= (LinearLayout) findViewById(R.id.cloudMeal);
+ mSwitch.setClickable(false);
+ mCloudMealBtn.setClickable(false);
+ mUpgrade.setClickable(false);
+ initTitle();
+ setListener();
+ getOriginStatus();
+
+ }
+
+ @Override
+ protected void onDestroy() {
+
+ super.onDestroy();
+ }
+
+ /**
+ * 初始化标题栏
+ */
+ public void initTitle() {
+ // 绘制标题
+ mCommonTitle = (CommonTitle) findViewById(R.id.title);
+ mCommonTitle.initView(R.drawable.title_btn_back, 0,
+ R.string.devices_operation_name);
+
+ mCommonTitle.setOnTitleClickListener(new OnTitleClickListener() {
+ @Override
+ public void onCommonTitleClick(int id) {
+ // TODO Auto-generated method stub
+ switch (id) {
+ case CommonTitle.ID_LEFT:
+
+ finish();
+ break;
+ }
+ }
+ });
+
+ if(!Business.getInstance().isOversea){
+ mCloudStorageLL.setVisibility(View.VISIBLE);
+ }
+ }
+
+ /**
+ * 获取初始状态
+ */
+ private void getOriginStatus() {
+// String status = mSharedPreferences.getString("alarmPlan", "");
+// if (status != null) {
+// mSwitch.setChecked(status.equals("open") ? true : false);
+// } else {// 默认没有打开报警订阅
+// mSwitch.setChecked(false);
+// mSharedPreferences.edit().putString("alarmPlan", "close").commit();
+// }
+// mSwitch.setVisibility(View.VISIBLE);
+// IsClickSwitchBtn = true;
+// mSwitch.setClickable(true);
+
+ // 初始化数据
+ Business.getInstance().getDeviceInfo(mChannelUUID, new Handler() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ Bundle bundle = (Bundle) msg.obj;
+ if (msg.what == 0) {
+
+ mAlarmStates = bundle.getInt("alarmStatus");
+ mCloudMealStates = bundle.getInt("cloudStatus");
+ mCanBeUpgrade = bundle.getBoolean("canBeUpgrade");
+
+ if (mCloudMealStates == 1) {
+ IsClickCloudMealBtn = false;
+ mCloudMealBtn.setChecked(true);
+ }
+ if (mAlarmStates == 1) {
+ IsClickSwitchBtn = false;
+ mSwitch.setChecked(true);
+ }
+
+ if (!mCanBeUpgrade) {
+ mUpgrade.setVisibility(View.INVISIBLE);
+ }
+
+ mSwitch.setVisibility(View.VISIBLE);
+ mCloudMealBtn.setVisibility(View.VISIBLE);
+
+ } else {
+ Toast.makeText(DeviceSetActivity.this,
+ R.string.toast_device_get_init_info_failed,
+ Toast.LENGTH_SHORT).show();
+ }
+
+ IsClickCloudMealBtn = true;
+ IsClickSwitchBtn = true;
+ mSwitch.setClickable(true);
+ mCloudMealBtn.setClickable(true);
+ mUpgrade.setClickable(true);
+ }
+ });
+ }
+
+ /**
+ * 设置监听函数
+ */
+ public void setListener() {
+ mSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+
+ @Override
+ public void onCheckedChanged(CompoundButton view, boolean state) {
+
+ // 如果是手势触发,则进行网络请求
+ if (IsClickSwitchBtn) {
+ modifyAlarmPlan(state);
+ }
+
+ }
+ });
+
+ mCloudMealBtn.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+
+ @Override
+ public void onCheckedChanged(CompoundButton view, boolean state) {
+ // 如果是手势触发,则进行网络请求
+ if (IsClickCloudMealBtn) {
+ //暂不支持此功能
+// Toast.makeText(DeviceSetActivity.this, "Not support now", Toast.LENGTH_SHORT).show();
+ setStorageStrategy(state);
+ }
+ }
+ });
+
+ mModifyPwd.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ modifyDevicePassword();
+ }
+ });
+
+ mUpgrade.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ // TODO Auto-generated method stub
+ if (!mCanBeUpgrade) {
+ Toast.makeText(DeviceSetActivity.this, "No upgrade", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ UpgradeDevice();
+ }
+ });
+ }
+
+ /**
+ * 设置云套餐状态
+ *
+ * @param states
+ * 开启关闭状态
+ */
+ public void setStorageStrategy(final boolean state) {
+
+ mCloudMealBtn.setClickable(false);
+ String states = null;
+ if (state) {
+ states = "on";
+ } else {
+ states = "off";
+ }
+ Business.getInstance().setStorageStartegy(states, mChannelUUID,
+ new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(
+ DeviceSetActivity.this,
+ R.string.toast_storagestrategy_update_success,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(
+ DeviceSetActivity.this,
+ R.string.toast_storagestrategy_update_failed,
+ Toast.LENGTH_SHORT).show();
+ IsClickCloudMealBtn = false;
+ mCloudMealBtn.setChecked(!state);
+ }
+ IsClickCloudMealBtn = true;
+ mCloudMealBtn.setClickable(true);
+ }
+ });
+ }
+
+ /**
+ * 修改动检计划状态
+ *
+ * @param enable
+ * 动检计划开启与否
+ */
+ public void modifyAlarmPlan(final boolean enable) {
+
+ mSwitch.setClickable(false);
+ Business.getInstance().modifyAlarmStatus(enable, mChannelUUID,
+ new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(DeviceSetActivity.this,
+ R.string.toast_alarmplan_modifyalarmstatus_success,
+ Toast.LENGTH_LONG).show();
+
+ mSharedPreferences
+ .edit()
+ .putString("alarmPlan", enable ? "open" : "close").commit();
+ } else {
+ Toast.makeText(DeviceSetActivity.this,
+ R.string.toast_alarmplan_modifyalarmstatus_failed,
+ Toast.LENGTH_LONG).show();
+ IsClickSwitchBtn = false;
+ mSwitch.setChecked(!enable);
+ }
+ IsClickSwitchBtn = true;
+ mSwitch.setClickable(true);
+ }
+
+ });
+ }
+
+ /**
+ * 修改设备密码
+ */
+ public void modifyDevicePassword() {
+ LinearLayout layout = (LinearLayout) LinearLayout.inflate(this, R.layout.dialog_modify_device_password, null);
+ final EditText oldPwd = (EditText) layout.findViewById(R.id.old_pwd);
+ final EditText newPwd = (EditText) layout.findViewById(R.id.new_pwd);
+ new AlertDialog.Builder(DeviceSetActivity.this)
+ .setTitle(R.string.alarm_message_keyinput_dialog_title)
+ .setIcon(android.R.drawable.ic_dialog_info)
+ .setView(layout)
+ .setPositiveButton(R.string.dialog_positive,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // TODO Auto-generated method stub
+ String oldKey = oldPwd.getText().toString();
+ String newKey = newPwd.getText().toString();
+ String deviceId = Business.getInstance().getChannel(mChannelUUID).getDeviceCode();
+
+ Business.getInstance().modifyDevicePwd(deviceId, oldKey, newKey, new Handler(){
+ @Override
+ public void handleMessage(Message msg) {
+ RetObject retObject = (RetObject) msg.obj;
+ if (msg.what == 0) {
+ Toast.makeText(DeviceSetActivity.this, "modigyDevicePwd success", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(DeviceSetActivity.this, retObject.mMsg, Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+ }
+ }).setNegativeButton(R.string.dialog_negative, null).show();
+ }
+
+ /**
+ * 设备云升级
+ */
+ public void UpgradeDevice() {
+
+ mUpgrade.setClickable(false);
+ Business.getInstance().upgradeDevice(mChannelUUID, new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(DeviceSetActivity.this,
+ R.string.toast_cloudupdate_success,
+ Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(DeviceSetActivity.this,
+ R.string.toast_cloudupdate_failed,
+ Toast.LENGTH_LONG).show();
+ }
+ mUpgrade.setClickable(true);
+ }
+
+ });
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/manager/SoftAPActivity.java b/app/src/main/java/com/lechange/demo/manager/SoftAPActivity.java
new file mode 100644
index 0000000..06afe02
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/manager/SoftAPActivity.java
@@ -0,0 +1,608 @@
+package com.lechange.demo.manager;
+
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wifi.WifiInfo;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentActivity;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSON;
+import com.lechange.common.log.Logger;
+import com.lechange.demo.dialog.PasswordDialog;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.util.WifiManagerUtil;
+import com.lechange.demo.common.ProgressDialog;
+import com.lechange.demo.listener.PasswordSetListener;
+import com.lechange.demo.yonsz.TimeOutActivity;
+import com.lechange.opensdk.api.bean.CheckDeviceBindOrNot;
+import com.lechange.opensdk.api.bean.DeviceOnline;
+import com.lechange.opensdk.softap.LCOpenSDK_SoftAPConfig;
+import com.lechange.opensdk.utils.NetWorkUtil;
+import com.yonsz.z1.R;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.gateway.AddLCSafeCompleteActivity;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.utils.AppIdUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.view.StateButton;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.HashMap;
+
+import de.greenrobot.event.EventBus;
+
+import static com.yonsz.z1.net.Constans.GATE_WAY;
+import static com.yonsz.z1.net.Constans.UPDATE_SEC;
+import static com.yonsz.z1.net.Constans.deviceNumListPosition;
+import static com.yonsz.z1.net.Constans.homeListEntity;
+import static com.yonsz.z1.net.Constans.localAddAddressId;
+import static com.yonsz.z1.net.NetWorkUrl.BIND_DEVICE;
+
+public class SoftAPActivity extends FragmentActivity implements Handler.Callback, View.OnClickListener, PasswordSetListener, Runnable {
+
+ public static final String CONNECTIVITY_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
+ private static final String TAG = "LCOpenSDK_Demo_SoftAPActivity";
+ private final int ON_LINE_SUCCESS = 0x11;
+ private final int ON_LINE_FAILED = 0x12;
+ private final int CHECK_DEVICE_ONLINE = 0X1B;
+ private final int ADD_DEVICE_SUCCESS = 0x13;
+ // MyBroadcastReceiver broadcastReceiver;
+ TextView mSSidView;
+ TitleView mTitleView;
+ private boolean isCheckOnline = true;
+ private boolean isSC = false;
+ private Handler handler;
+ Runnable checkRunnable = new Runnable() {
+ @Override
+ public void run() {
+ //30秒后移除在线检查,并且返回失败,正常情况第一次就可以查询到在线的状态
+ handler.removeCallbacksAndMessages(CHECK_DEVICE_ONLINE);
+ handler.obtainMessage(ON_LINE_FAILED).sendToTarget();
+ isCheckOnline = false;
+ Logger.d(TAG, "check online timeout");
+ }
+ };
+ private String devHotSpot = "";
+ private String ssid = "";
+ private String pwd = "";
+ private String scCode = "";
+ private String devId;
+ private String devType;
+ private WifiManagerUtil managerUtil;
+ private PasswordDialog passwordDialog;
+ private ProgressDialog mProgressDialog; // 播放加载使用
+ private String key = "";
+ private StateButton mStateButton;
+ private int sec = 120;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.soft_ap_activity);
+ // 绘制标题
+ mTitleView = (TitleView) findViewById(R.id.title_lecheng_add);
+ mTitleView.setHead("设备添加");
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ finish();
+ }
+
+ @Override
+ public void onFunction() {
+
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+ mStateButton = (StateButton) findViewById(R.id.bt_sec);
+ mProgressDialog = (ProgressDialog) this.findViewById(R.id.query_load);
+ /*findViewById(R.id.start_softAP_config).setOnClickListener(this);
+ findViewById(R.id.start_check_online).setOnClickListener(this);*/
+ managerUtil = new WifiManagerUtil(getApplicationContext());
+ devId = getIntent().getStringExtra("devId");
+ devType = getIntent().getStringExtra("devType");
+ ssid = getIntent().getStringExtra("ssid");
+ pwd = getIntent().getStringExtra("mPwd");
+ scCode = getIntent().getStringExtra("scCode");
+ if (scCode != null && scCode.length() == 8) {
+ isSC = true;
+ }
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(CONNECTIVITY_CHANGE_ACTION);
+ // broadcastReceiver=new MyBroadcastReceiver();
+ // registerReceiver(broadcastReceiver, intentFilter);
+ handler = new Handler(this);
+ passwordDialog = new PasswordDialog();
+ passwordDialog.setListener(this);
+ devHotSpot = devType + "-" + devId.substring(devId.length() - 4);
+ // mSSidView.setText(getResources().getString(R.string.connect_wifi_name) + " : " + ssid);
+
+ startApConfig();
+
+ handler.sendEmptyMessageDelayed(UPDATE_SEC, 1000);
+ }
+
+
+ @Override
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case LCOpenSDK_SoftAPConfig.MSG_WHAT:
+ mProgressDialog.setStop();
+ Toast.makeText(getApplicationContext(), String.valueOf(msg.arg1), Toast.LENGTH_SHORT).show();
+ Toast.makeText(getApplicationContext(), getResources().getString(R.string.switch_wifi_and_start_check_online), Toast.LENGTH_LONG).show();
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ checkOnlineState();
+ }
+ }, 35000);
+ break;
+ case CHECK_DEVICE_ONLINE:
+ // checkOnline();
+ // checkOnBindAndRemind();
+ bindDevice();
+ // unBindDevice();
+ break;
+ case ON_LINE_FAILED:
+ Logger.d(TAG, "check_online_failed");
+ Toast.makeText(getApplicationContext(), "check_online_failed", Toast.LENGTH_SHORT).show();
+ handler.removeCallbacksAndMessages(CHECK_DEVICE_ONLINE);
+ mProgressDialog.setStop();
+ break;
+ case ON_LINE_SUCCESS:
+ //设备在线
+ Logger.d(TAG, "check_online_success");
+ handler.removeCallbacks(checkRunnable);
+ if (scCode != null && scCode.length() == 8) {
+ key = scCode;
+ bindDevice();
+ Logger.d(TAG, "scDevice, key = " + key + ", scCode = " + scCode);
+ } else {
+ unBindDeviceInfo();
+ }
+ mProgressDialog.setStart(getResources().getString(R.string.binding_device));
+ break;
+ case ADD_DEVICE_SUCCESS:
+ mProgressDialog.setStop();
+ Logger.d(TAG, "add_device_success");
+ Toast.makeText(getApplicationContext(), "SuccessAddDevice", Toast.LENGTH_SHORT).show();
+ /*startActivity(new Intent(SoftAPActivity.this, DevicelistActivity.class));
+ finish();*/
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("5"));
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ Intent intent = new Intent(SoftAPActivity.this, AddLCSafeCompleteActivity.class);
+ intent.putExtra("deviceType", GATE_WAY);
+ intent.putExtra("deviceSN", devId);
+ intent.putExtra("deviceModel", "1");
+ intent.putExtra("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ startActivity(intent);
+ finish();
+ break;
+ case UPDATE_SEC:
+ if (sec > 1 && sec < 121) {
+ sec--;
+ handler.sendEmptyMessageDelayed(UPDATE_SEC, 1000);
+ mStateButton.setText(getResources().getString(R.string.sec_30, sec));
+ } else if (sec <= 1) {
+ gotoTimeOutActivity();
+ }
+ break;
+
+
+ }
+
+ return false;
+ }
+
+ private void gotoTimeOutActivity() {
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ Intent intent1 = new Intent(SoftAPActivity.this, TimeOutActivity.class);
+ intent1.putExtra("ssid", ssid);
+ intent1.putExtra("pwd", pwd);
+ intent1.putExtra("devId", devId);
+ intent1.putExtra("scCode", scCode);
+ intent1.putExtra("devType", devType);
+ intent1.putExtra("from", "SoftAPActivity");
+ startActivity(intent1);
+ finish();
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ /*case R.id.start_softAP_config:
+ startApConfig();
+
+ // } else {
+ // Toast.makeText(getApplicationContext(), getString(R.string.connect_device_wifi), Toast.LENGTH_SHORT).show();
+ // }
+ break;
+
+ case R.id.start_check_online:
+ checkOnlineState();
+ break;*/
+ }
+ }
+
+ private void checkOnlineState() {
+ isCheckOnline = true;
+ handler.obtainMessage(CHECK_DEVICE_ONLINE).sendToTarget();
+ handler.postDelayed(checkRunnable, 30 * 1000);
+ mProgressDialog.setStart(getResources().getString(R.string.checking_device_online));
+ }
+
+ private void startApConfig() {
+ if (!managerUtil.isWifi(getApplicationContext())) {
+ Toast.makeText(getApplicationContext(), getString(R.string.connect_device_wifi), Toast.LENGTH_SHORT).show();
+ return;
+ }
+ Logger.d(SoftAPActivity.this.getClass().getSimpleName(), " devHotSpot : " + devHotSpot);
+ // if (isConnectedDevHot()) {
+ if (null != passwordDialog && !passwordDialog.isAdded()) {
+ handler.removeCallbacks(SoftAPActivity.this);
+ mProgressDialog.setStart(getString(R.string.search_devices));
+ Business.getInstance().searchDevice(devId, 30 * 1000, new Handler() {
+ public void handleMessage(final Message msg) {
+ if (msg.what == 0 || msg.what == 1 || msg.what == 2) {
+ /*//需要初始化
+ passwordDialog.setCurrentType(1);
+ passwordDialog.show(getSupportFragmentManager(), "passwordDialog");
+ } else if (msg.what == 2) {
+ //已经初始化
+ passwordDialog.setCurrentType(2);
+ passwordDialog.show(getSupportFragmentManager(), "passwordDialog");
+ } else if (msg.what == 0) {
+ //不需要初始化
+ passwordDialog.setCurrentType(0);
+ passwordDialog.show(getSupportFragmentManager(), "passwordDialog");*/
+ mProgressDialog.setStart(getResources().getString(R.string.soft_ap_config));
+ key = scCode;
+ LCOpenSDK_SoftAPConfig.startSoftAPConfig(ssid, pwd, devId, key, isSC, handler, 30 * 1000);
+ } else {
+ Toast.makeText(getApplicationContext(), getResources().getString(R.string.search_devices_timeout), Toast.LENGTH_LONG).show();
+ mProgressDialog.setStop();
+ }
+ }
+ });
+
+ }
+ }
+
+
+ //是否已连上设备热点
+ public boolean isConnectedDevHot() {
+ // return true;
+ boolean isWifiConnected = NetWorkUtil.NetworkType.NETWORK_WIFI.equals(NetWorkUtil.getNetworkType(getApplicationContext()));
+ WifiInfo wifiInfo = managerUtil.getCurrentWifiInfo();
+ if (wifiInfo == null || !isWifiConnected) {
+ return false;
+ } else {
+ String ssid = "\"" + this.devHotSpot + "\"";
+ return wifiInfo.getSSID().equals(ssid);
+ }
+ }
+
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ // unregisterReceiver(broadcastReceiver);
+ LCOpenSDK_SoftAPConfig.cancel();
+ if (handler != null) {
+ handler.removeCallbacksAndMessages(null);
+ isCheckOnline = false;
+ handler = null;
+ }
+
+ }
+
+
+ /**
+ * 校验在线
+ */
+ private void checkOnline() {
+ Business.getInstance().checkOnline(devId,
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ Business.RetObject retObject = (Business.RetObject) msg.obj;
+ switch (msg.what) {
+ case 0:
+ if (((DeviceOnline.Response) retObject.resp).data.onLine.equals("1")) {
+ handler.obtainMessage(ON_LINE_SUCCESS).sendToTarget();
+ } else {
+ if (isCheckOnline) {
+ Logger.d(TAG, "onLine : " + ((DeviceOnline.Response) retObject.resp).data.onLine);
+ handler.obtainMessage(CHECK_DEVICE_ONLINE).sendToTarget();
+ }
+ }
+ break;
+ case -1000:
+ Logger.e(TAG, "check_online_respond : -1000 " + ((Business.RetObject) msg.obj).mMsg);
+ handler.obtainMessage(ON_LINE_FAILED).sendToTarget();
+ Toast.makeText(getApplicationContext(), ((Business.RetObject) msg.obj).mMsg, Toast.LENGTH_SHORT).show();
+ break;
+ default:
+ Logger.e(TAG, "checkonline : " + msg.what);
+ handler.obtainMessage(ON_LINE_FAILED).sendToTarget();
+ Toast.makeText(getApplicationContext(), ((Business.RetObject) msg.obj).mMsg, Toast.LENGTH_SHORT).show();
+ break;
+ }
+ }
+ });
+
+ }
+
+ private void unBindDevice() {
+ Business.getInstance().unBindDevice(devId, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ Business.RetObject retObject = (Business.RetObject) msg.obj;
+ if (msg.what == 0) {
+ Toast.makeText(getApplicationContext(), R.string.toast_device_delete_success, Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(getApplicationContext(), retObject.mMsg, Toast.LENGTH_SHORT).show();
+ }
+
+ }
+ });
+ }
+
+ private void unBindDeviceInfo() {
+ Logger.e(TAG, "------------isOversea = " + Business.getInstance().isOversea());
+ if (!Business.getInstance().isOversea()) {
+
+ Business.getInstance().unBindDeviceInfo(devId, new Handler() {
+ public void handleMessage(Message msg) {
+ String message = (String) msg.obj;
+ // Log.d(tag, "unBindDeviceInfo,"+message);
+ if (msg.what == 0) {
+ if (message.contains("Auth")) {
+ Logger.d(TAG, " Auth bindDevice(), key = :" + key + ", deviceID = " + devId);
+ bindDevice();
+ } else if (message.contains("RegCode")) {
+ /*final EditText et = new EditText(SoftAPActivity.this);
+ final AlertDialog dialog = new AlertDialog.Builder(SoftAPActivity.this)
+ .setTitle(R.string.alarm_message_keyinput_dialog_title)
+ .setIcon(android.R.drawable.ic_dialog_info)
+ .setView(et)
+ .setPositiveButton(R.string.dialog_positive, null)
+ .setNegativeButton(R.string.dialog_negative, null)
+ .create();
+ dialog.setCanceledOnTouchOutside(false);
+ dialog.show();
+
+ dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if (TextUtils.isEmpty(et.getText())) {
+ Toast.makeText(getApplicationContext(), "Input can't be empty", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ key = et.getText().toString();
+ bindDevice();
+ dialog.dismiss();
+ }
+ });*/
+ key = scCode;
+ bindDevice();
+ } else {
+ key = "";
+ bindDevice();
+ }
+ } else {
+ mProgressDialog.setStop();
+ Toast.makeText(getApplicationContext(), "unBindDeviceInfo failed", Toast.LENGTH_SHORT).show();
+ Logger.d(TAG, message);
+ }
+ }
+ });
+ } else { //oversea
+ Logger.d(TAG, " oversea bindDevice(), key = :" + key + ", deviceID = " + devId);
+ bindDevice();
+ }
+
+ }
+
+
+ /**
+ * 绑定
+ */
+ /*private void bindDevice() {
+ //设备绑定
+ Business.getInstance().bindDevice(devId, key,
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ Business.RetObject retObject = (Business.RetObject) msg.obj;
+ if (msg.what == 0) {
+ handler.obtainMessage(ADD_DEVICE_SUCCESS).sendToTarget();
+ } else {
+ Toast.makeText(getApplicationContext(), getResources().getString(R.string.addDevice_failed), Toast.LENGTH_SHORT).show();
+ Logger.d(TAG, retObject.mMsg);
+ }
+ }
+ });
+ }*/
+
+
+ /**
+ * 绑定
+ */
+ private void bindDevice() {
+ com.yonsz.z1.net.NetWorkUtil netWorkUtil = com.yonsz.z1.net.NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", devId);
+ map.put("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ map.put("code", key);
+ if (AppIdUtil.isBaseZhiKong()) {
+ map.put("addressId", localAddAddressId);
+ } else {
+ if (null != getIntent().getExtras().get("deviceAddress")) {
+ map.put("addressId", getIntent().getExtras().get("deviceAddress").toString());
+ } else {
+ map.put("addressId", "1");
+ }
+ }
+ map.put("deviceModel", "1");
+ map.put("thirdModel", "G2");
+ map.put("deviceType", GATE_WAY);
+ map.put("wifiName", ssid);
+ if (null != homeListEntity && !TextUtils.isEmpty(homeListEntity.getData().get(deviceNumListPosition).getFloorList())) {
+ if (null != getIntent().getExtras().get("floor")) {
+ map.put("floor", getIntent().getExtras().get("floor").toString());
+ }
+ }
+ netWorkUtil.requestPostByAsynewApi(BIND_DEVICE, map, new com.yonsz.z1.net.NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("bindDevice", "onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ handler.obtainMessage(ADD_DEVICE_SUCCESS).sendToTarget();
+ } else {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(getApplicationContext(), obj.getMsg(), Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+// Toast.makeText(getApplicationContext(), getResources().getString(R.string.addDevice_failed), Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+
+
+ @Override
+ public void onSaveSuccess(String psw1) {
+ mProgressDialog.setStart(getResources().getString(R.string.soft_ap_config));
+ // if(Business.getInstance().isOversea()){//海外软AP需携带code过去
+ key = psw1;
+ // }
+ LCOpenSDK_SoftAPConfig.startSoftAPConfig(ssid, pwd, devId, psw1, isSC, handler, 30 * 1000);
+ }
+
+ @Override
+ public void onWifiPassWord(String psw1) {
+
+ }
+
+ @Override
+ public void run() {
+ //超时操作
+ Toast.makeText(getApplicationContext(), getString(R.string.switch_wifi_timeout), Toast.LENGTH_SHORT).show();
+ }
+
+ /**
+ * 检查是否已被绑定
+ */
+ public void checkOnBindAndRemind() {
+ Business.getInstance().checkBindOrNot(devId,
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ // TODO Auto-generated method stub
+ super.handleMessage(msg);
+ Business.RetObject retObject = (Business.RetObject) msg.obj;
+ if (msg.what == 0) {
+ CheckDeviceBindOrNot.Response resp = (CheckDeviceBindOrNot.Response) retObject.resp;
+ if (!resp.data.isBind) {
+ checkOnline();
+ } else if (resp.data.isBind && resp.data.isMine) {
+ Toast.makeText(getApplicationContext(), getString(R.string.toast_adddevice_already_binded_by_self), Toast.LENGTH_SHORT).show();
+ handler.removeCallbacks(checkRunnable);
+ mProgressDialog.setStop();
+ } else {
+ Toast.makeText(getApplicationContext(), getString(R.string.toast_adddevice_already_binded_by_others), Toast.LENGTH_SHORT).show();
+ handler.removeCallbacks(checkRunnable);
+ mProgressDialog.setStop();
+ }
+ } else {
+ Toast.makeText(getApplicationContext(), retObject.mMsg, Toast.LENGTH_SHORT).show();
+ handler.removeCallbacks(checkRunnable);
+ mProgressDialog.setStop();
+ }
+ }
+ });
+ }
+
+ // public class MyBroadcastReceiver extends android.content.BroadcastReceiver {
+ // @Override
+ // public void onReceive(Context context, Intent intent) {
+ // if (intent.getAction().equals(CONNECTIVITY_CHANGE_ACTION)) {
+ // if (isConnectedDevHot()) {
+ // if (null != passwordDialog && !passwordDialog.isAdded()) {
+ // handler.removeCallbacks(SoftAPActivity.this);
+ // mProgressDialog.setStart(getString(R.string.switch_wifi_success));
+ // Business.getInstance().searchDevice(devId, 30 * 1000, new Handler() {
+ // public void handleMessage(final Message msg) {
+ // if (msg.what == 1) {
+ // passwordDialog.setCurrentType(1);
+ // passwordDialog.show(getSupportFragmentManager(), "passwordDialog");
+ // } else if (msg.what == 2) {
+ // Toast.makeText(getApplicationContext(), getString(R.string.please_reset_device), Toast.LENGTH_LONG).show();
+ // passwordDialog.setCurrentType(1);
+ // passwordDialog.show(getSupportFragmentManager(), "passwordDialog");
+ // } else if (msg.what == 0) {
+ // passwordDialog.setCurrentType(1);
+ // passwordDialog.show(getSupportFragmentManager(), "passwordDialog");
+ // }
+ // }
+ // });
+ //
+ // }
+ //
+ // }
+ // }
+ //
+ // }
+ // }
+
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ // if (isConnectedDevHot()) {
+ // if (null != passwordDialog && !passwordDialog.isAdded()) {
+ // handler.removeCallbacks(SoftAPActivity.this);
+ // mProgressDialog.setStart(getString(R.string.switch_wifi_success));
+ // Business.getInstance().searchDevice(devId, 30 * 1000, new Handler() {
+ // public void handleMessage(final Message msg) {
+ // if (msg.what == 1) {
+ // passwordDialog.setCurrentType(1);
+ // passwordDialog.show(getSupportFragmentManager(), "passwordDialog");
+ // } else if (msg.what == 2) {
+ // Toast.makeText(getApplicationContext(), getString(R.string.please_reset_device), Toast.LENGTH_LONG).show();
+ // mProgressDialog.setStop();
+ // } else if (msg.what == 0) {
+ // passwordDialog.setCurrentType(1);
+ // passwordDialog.show(getSupportFragmentManager(), "passwordDialog");
+ // }
+ // }
+ // });
+ // }
+ // }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/mediaplay/MediaPlayActivity.java b/app/src/main/java/com/lechange/demo/mediaplay/MediaPlayActivity.java
new file mode 100644
index 0000000..d7d0ebf
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/mediaplay/MediaPlayActivity.java
@@ -0,0 +1,218 @@
+/*
+ * 项目名: YYS
+ * 文件名: MediaPlayActivity.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.mediaplay;
+
+import android.Manifest;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.View;
+
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.entity.ChannelInfo;
+import com.lechange.demo.business.util.PermissionHelper;
+import com.lechange.demo.mediaplay.fragment.MediaPlayFragment;
+import com.lechange.demo.mediaplay.fragment.MediaPlayOnlineFragment;
+import com.lechange.demo.yonsz.CameraDetailActivity;
+import com.yonsz.z1.R;
+import com.yonsz.z1.activity.BaseActivity;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.ArrayList;
+
+import de.greenrobot.event.EventBus;
+
+/**
+ * 描述:视频播放Activity 作者: lc
+ */
+public class MediaPlayActivity extends BaseActivity implements
+ MediaPlayFragment.BackHandlerInterface,
+ OnRequestPermissionsResultCallback {
+ public static final int IS_VIDEO_ONLINE = 1;
+ public static final int IS_VIDEO_REMOTE_RECORD = 2;
+ public static final int IS_VIDEO_REMOTE_CLOUD_RECORD = 3;
+ private final static String tag = "MediaPlayActivity";
+ private TitleView mTitleView;
+ private MediaPlayFragment mMediaPlayFragment;
+ private ArrayList uuidStringList;
+ private int firstPosition;
+
+ public void onEventMainThread(EventBusEntity event) {
+ String msg = event.getMsg();
+ Log.e("nettyUtil", msg);
+ if (msg.equals("关闭")) {
+ finish();
+ }
+ }
+
+ public void onEventMainThread(ChooseHomeEvent event) {
+ String msg = event.getMsg();
+ Log.e("nettyUtil", msg);
+ if (msg.equals("1") || msg.equals("3") || msg.equals("2") || msg.equals("5")) {
+
+ } else {
+ mTitleView.setHead(msg);
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_media_video);
+ initView();
+ }
+
+ private void initView() {
+ /*uuidStringList = getIntent().getExtras().getStringArrayList("UUIDStringList");
+ firstPosition = (int) getIntent().getExtras().get("position");*/
+ ChannelInfo channel = Business.getInstance().getChannel(getIntent().getStringExtra("UUID"));
+ mTitleView = (TitleView) findViewById(R.id.title_media_play);
+ if (null != channel) {
+ mTitleView.setHead(channel.getName());
+ } else {
+ mTitleView.setHead("实时预览");
+ }
+ mTitleView.setHeadFuntion(R.drawable.icon_setup);
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ finish();
+ }
+
+ @Override
+ public void onFunction() {
+ // Intent intent = new Intent(MediaPlayActivity.this, DeviceSetActivity.class);
+ Intent intent = new Intent(MediaPlayActivity.this, CameraDetailActivity.class);
+ intent.putExtra("UUID", getIntent().getStringExtra("UUID"));
+ intent.putExtra("alarmPlanStatus", true);
+ intent.putExtra("cloudMealStatus", true);
+ startActivity(intent);
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+
+ PermissionHelper.requestPermission(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO});
+ // 嵌入使用的帧
+ MediaPlayFragment mediaPlayFragment; // 引用的布局帧
+ Bundle b = new Bundle();
+ String resId; // 资源id号
+ mediaPlayFragment = new MediaPlayOnlineFragment();
+ // VideoContainerFragment containerFragment = new VideoContainerFragment();
+ resId = getIntent().getStringExtra("UUID");
+ // resId = uuidStringList.get(firstPosition);
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ /*switch (getIntent().getIntExtra("TYPE", 0)) {
+ case IS_VIDEO_ONLINE:
+ mediaPlayFragment = new MediaPlayOnlineFragment();
+ // VideoContainerFragment containerFragment = new VideoContainerFragment();
+ resId = getIntent().getStringExtra("UUID");
+ // resId = uuidStringList.get(firstPosition);
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ *//*containerFragment.setArguments(b);
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_content, containerFragment)
+ .commitAllowingStateLoss();*//*
+ break;
+ case IS_VIDEO_REMOTE_RECORD:
+ mediaPlayFragment = new MediaPlayBackFragment();
+ resId = getIntent().getStringExtra("ID");
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ break;
+ case IS_VIDEO_REMOTE_CLOUD_RECORD:
+ mediaPlayFragment = new MediaPlayBackFragment();
+ resId = getIntent().getStringExtra("ID");
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ break;
+ default:
+ break;
+ }*/
+ }
+
+ /**
+ * boolean) 描述:切换fragment
+ */
+ public void changeFragment(Fragment targetFragment, boolean isAddToStack) {
+ if (isAddToStack) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_content, targetFragment)
+ .addToBackStack(null).commitAllowingStateLoss();
+ } else {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_content, targetFragment)
+ .commitAllowingStateLoss();
+ }
+
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (mMediaPlayFragment == null || !mMediaPlayFragment.onBackPressed()) {
+ Log.d(tag, "onBackPressed");
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("5"));
+ }
+
+ @Override
+ public void callBackUiThread(Message msg) {
+
+ }
+
+ @Override
+ public void setSelectedFragment(MediaPlayFragment backHandledFragment) {
+ // TODO Auto-generated method stub
+ this.mMediaPlayFragment = backHandledFragment;
+ }
+
+ // 横竖屏切换需要,隐藏标题栏
+ public void toggleTitle(boolean isShow) {
+ mTitleView.setVisibility(isShow ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String[] permissions, int[] grantResults) {
+
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ // if (grantResults.length == 1
+ // && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ //
+ // } else {
+ // Toast.makeText(this, R.string.no_access_write_external_storage,
+ // Toast.LENGTH_SHORT).show();
+ // }
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lechange/demo/mediaplay/MediaPlayBackActivity.java b/app/src/main/java/com/lechange/demo/mediaplay/MediaPlayBackActivity.java
new file mode 100644
index 0000000..234314c
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/mediaplay/MediaPlayBackActivity.java
@@ -0,0 +1,197 @@
+/*
+ * 项目名: YYS
+ * 文件名: MediaPlayActivity.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.mediaplay;
+
+import android.Manifest;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.View;
+
+import com.lechange.demo.business.util.PermissionHelper;
+import com.lechange.demo.mediaplay.fragment.MediaPlayBackFragment;
+import com.lechange.demo.mediaplay.fragment.MediaPlayFragment;
+import com.lechange.demo.yonsz.CameraDetailActivity;
+import com.yonsz.z1.R;
+import com.yonsz.z1.activity.BaseActivity;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.ArrayList;
+
+import de.greenrobot.event.EventBus;
+
+/**
+ * 描述:视频播放Activity 作者: lc
+ */
+public class MediaPlayBackActivity extends BaseActivity implements
+ MediaPlayFragment.BackHandlerInterface,
+ OnRequestPermissionsResultCallback {
+ public static final int IS_VIDEO_ONLINE = 1;
+ public static final int IS_VIDEO_REMOTE_RECORD = 2;
+ public static final int IS_VIDEO_REMOTE_CLOUD_RECORD = 3;
+ private final static String tag = "MediaPlayActivity";
+ private TitleView mTitleView;
+ private MediaPlayFragment mMediaPlayFragment;
+ private ArrayList uuidStringList;
+ private int firstPosition;
+
+ public void onEventMainThread(EventBusEntity event) {
+ String msg = event.getMsg();
+ Log.e("nettyUtil", msg);
+ finish();
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_media_video);
+ initView();
+ }
+
+ private void initView() {
+ /*uuidStringList = getIntent().getExtras().getStringArrayList("UUIDStringList");
+ firstPosition = (int) getIntent().getExtras().get("position");*/
+ mTitleView = (TitleView) findViewById(R.id.title_media_play);
+ mTitleView.setHead("本地录像");
+ mTitleView.setHeadFuntion(R.drawable.icon_setup);
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ finish();
+ }
+
+ @Override
+ public void onFunction() {
+ // Intent intent = new Intent(MediaPlayActivity.this, DeviceSetActivity.class);
+ Intent intent = new Intent(MediaPlayBackActivity.this, CameraDetailActivity.class);
+ intent.putExtra("UUID", getIntent().getStringExtra("UUID"));
+ intent.putExtra("alarmPlanStatus", true);
+ intent.putExtra("cloudMealStatus", true);
+ startActivity(intent);
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+
+ PermissionHelper.requestPermission(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO});
+ // 嵌入使用的帧
+ MediaPlayBackFragment mediaPlayFragment; // 引用的布局帧
+ Bundle b = new Bundle();
+ String resId; // 资源id号
+ mediaPlayFragment = new MediaPlayBackFragment();
+ resId = getIntent().getStringExtra("ID");
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ /*switch (getIntent().getIntExtra("TYPE", 0)) {
+ case IS_VIDEO_ONLINE:
+ mediaPlayFragment = new MediaPlayOnlineFragment();
+ // VideoContainerFragment containerFragment = new VideoContainerFragment();
+ resId = getIntent().getStringExtra("UUID");
+ // resId = uuidStringList.get(firstPosition);
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ *//*containerFragment.setArguments(b);
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_content, containerFragment)
+ .commitAllowingStateLoss();*//*
+ break;
+ case IS_VIDEO_REMOTE_RECORD:
+ mediaPlayFragment = new MediaPlayBackFragment();
+ resId = getIntent().getStringExtra("ID");
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ break;
+ case IS_VIDEO_REMOTE_CLOUD_RECORD:
+ mediaPlayFragment = new MediaPlayBackFragment();
+ resId = getIntent().getStringExtra("ID");
+ b.putString("RESID", resId);
+ mediaPlayFragment.setArguments(b);
+ changeFragment(mediaPlayFragment, false);
+ break;
+ default:
+ break;
+ }*/
+ }
+
+ /**
+ * boolean) 描述:切换fragment
+ */
+ public void changeFragment(Fragment targetFragment, boolean isAddToStack) {
+ if (isAddToStack) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_content, targetFragment)
+ .addToBackStack(null).commitAllowingStateLoss();
+ } else {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_content, targetFragment)
+ .commitAllowingStateLoss();
+ }
+
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (mMediaPlayFragment == null || !mMediaPlayFragment.onBackPressed()) {
+ Log.d(tag, "onBackPressed");
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("5"));
+ }
+
+ @Override
+ public void callBackUiThread(Message msg) {
+
+ }
+
+ @Override
+ public void setSelectedFragment(MediaPlayFragment backHandledFragment) {
+ // TODO Auto-generated method stub
+ this.mMediaPlayFragment = backHandledFragment;
+ }
+
+ // 横竖屏切换需要,隐藏标题栏
+ public void toggleTitle(boolean isShow) {
+ mTitleView.setVisibility(isShow ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String[] permissions, int[] grantResults) {
+
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ // if (grantResults.length == 1
+ // && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ //
+ // } else {
+ // Toast.makeText(this, R.string.no_access_write_external_storage,
+ // Toast.LENGTH_SHORT).show();
+ // }
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayBackFragment.java b/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayBackFragment.java
new file mode 100644
index 0000000..5990987
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayBackFragment.java
@@ -0,0 +1,1124 @@
+/*
+ * 项目名: YYS
+ * 文件名: MediaPlayBackFragment.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.mediaplay.fragment;
+
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.media.AudioManager;
+import android.media.MediaScannerConnection;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.RelativeLayout;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.Business.CloudStorageCode;
+import com.lechange.demo.business.Business.PlayerResultCode;
+import com.lechange.demo.business.entity.ChannelInfo;
+import com.lechange.demo.business.entity.RecordInfo;
+import com.lechange.demo.business.util.MediaPlayHelper;
+import com.lechange.demo.business.util.TimeHelper;
+import com.lechange.demo.common.ProgressDialog;
+import com.lechange.demo.common.RecoderSeekBar;
+import com.lechange.demo.localvideo.RecordListActivity;
+import com.lechange.demo.localvideo.calendar.CalendarPopipWindow;
+import com.lechange.demo.localvideo.timeshaftbar.TimerShaftBar;
+import com.lechange.demo.localvideo.timeshaftbar.TimerShaftRegionItem;
+import com.lechange.demo.mediaplay.MediaPlayActivity;
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.yonsz.z1.R;
+import com.yonsz.z1.utils.DateTimeUitl;
+import com.yonsz.z1.view.loading.LoadingDialog;
+
+import java.io.FileOutputStream;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Queue;
+
+import static com.lechange.demo.mediaplay.fragment.MediaPlayOnlineFragment.getLoacalBitmap;
+
+
+/**
+ * 描述:远程录像回放(目前包括录像回放和告警消息两个场景) 作者: lc
+ */
+public class MediaPlayBackFragment extends MediaPlayFragment implements OnClickListener {
+ static private boolean sthls = false;
+ private final String tag = "MediaPlayBackFragment";
+ private RecordInfo recordInfo;
+ private ChannelInfo channelInfo;
+ //SeekBar使用
+ private int progress;
+ private String beginTime;
+ private Queue mSeekQueue = new LinkedList(); //云录像时间记忆
+ private LinearLayout mRecordMenu;
+ private RelativeLayout mRecordMenu1;
+ private ImageView mRecordPlayPause, mRecordPlayPause1;
+ private TextView mRecordStartTime;
+ private RecoderSeekBar mRecordSeekbar;
+ private TextView mRecordEndTime;
+ private ImageView mRecordScale, mRecordScale1, record_no_voice1;
+ private PlayStatus mOpenPlay = PlayStatus.play_close; //语音对讲状态
+
+ private TextView mCalendarTv;
+ private TimerShaftBar mTimerShaftBar;
+ private ArrayList mTimeShaftItems = new ArrayList<>();
+ private LinearLayout ll_all_video;
+ private List mRecordList = new ArrayList<>();
+
+ private ImageView mLiveScreenshot;
+ private ImageView iv_screen_shot, mLiveRecord;
+ private LinearLayout ll_record_time;
+ private TextView tv_record_time;
+ private TextView netSpeedTv;
+ private Handler mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case 100:
+ netSpeedTv.setText(msg.obj.toString());
+ break;
+ }
+ super.handleMessage(msg);
+ }
+ };
+ //计时器
+ private boolean isRecord = false;
+ private Handler mhandle = new Handler();
+ private boolean isPause = false;//是否暂停
+ private long currentSecond = 0;//当前毫秒数
+ private Runnable timeRunable = new Runnable() {
+ @Override
+ public void run() {
+ currentSecond = currentSecond + 1000;
+ tv_record_time.setText(DateTimeUitl.getFormatHMS(currentSecond));
+ if (!isPause) {
+ //递归调用本runable对象,实现每隔一秒一次执行任务
+ mhandle.postDelayed(this, 1000);
+ }
+ }
+ };
+
+ private TextView tv_before_day, tv_last_day;
+ private boolean isOpenVoice = true;
+ private long lastTimeToPlay;
+ private LoadingDialog mLoadingDialog;
+
+ /**
+ * 描述:获取录像通道参数
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Bundle b = getArguments();
+ if (b != null) {
+ String id = b.getString("RESID");
+ recordInfo = Business.getInstance().getAllRecord(id);
+ channelInfo = Business.getInstance().getChannel(recordInfo.getChnlUuid());
+ }
+ if (recordInfo == null && channelInfo == null) {
+ toast(getString(R.string.toast_playback_no_records));
+ getActivity().finish();
+ }
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View mView = inflater.inflate(R.layout.fragment_media_record, container, false);
+ //必须赋值,父类需要使用到
+ mSurfaceParentView = (ViewGroup) mView.findViewById(R.id.record_window);
+ //初始化窗口大小
+ LayoutParams mLayoutParams = (LayoutParams) mSurfaceParentView.getLayoutParams();
+ DisplayMetrics metric = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ mSurfaceParentView.setLayoutParams(mLayoutParams);
+
+ mPlayWin.initPlayWindow(this.getActivity(), (ViewGroup) mView.findViewById(R.id.record_window_content),0, true);
+
+ mProgressDialog = (ProgressDialog) mView.findViewById(R.id.record_play_load);
+ mReplayTip = (TextView) mView.findViewById(R.id.record_play_pressed);
+
+ mRecordMenu = (LinearLayout) mView.findViewById(R.id.record_menu);
+ mRecordMenu1 = (RelativeLayout) mView.findViewById(R.id.record_menu1);
+ mRecordPlayPause = (ImageView) mView.findViewById(R.id.record_play_pause);
+ mRecordPlayPause1 = (ImageView) mView.findViewById(R.id.record_play_pause1);
+ mRecordStartTime = (TextView) mView.findViewById(R.id.record_startTime);
+ mRecordSeekbar = (RecoderSeekBar) mView.findViewById(R.id.record_seekbar);
+ mRecordEndTime = (TextView) mView.findViewById(R.id.record_endTime);
+ mRecordScale = (ImageView) mView.findViewById(R.id.record_scale);
+ mRecordScale1 = (ImageView) mView.findViewById(R.id.record_scale1);
+ record_no_voice1 = (ImageView) mView.findViewById(R.id.record_no_voice1);
+ iv_screen_shot = (ImageView) mView.findViewById(R.id.iv_screen_shot);
+ netSpeedTv = (TextView) mView.findViewById(R.id.tv_net_speed);
+ ll_record_time = (LinearLayout) mView.findViewById(R.id.ll_record_time);
+ tv_record_time = (TextView) mView.findViewById(R.id.tv_record_time);
+ mLiveRecord = (ImageView) mView.findViewById(R.id.live_record);
+ tv_before_day = (TextView) mView.findViewById(R.id.tv_before_day);
+ tv_last_day = (TextView) mView.findViewById(R.id.tv_last_day);
+
+
+ tv_before_day.setOnClickListener(this);
+ tv_last_day.setOnClickListener(this);
+ mLiveRecord.setOnClickListener(this);
+ mReplayTip.setOnClickListener(this);
+ mRecordPlayPause.setOnClickListener(this);
+ mRecordPlayPause1.setOnClickListener(this);
+ mRecordScale.setOnClickListener(this);
+ mRecordScale1.setOnClickListener(this);
+ record_no_voice1.setOnClickListener(this);
+
+ mCalendarTv = (TextView) mView.findViewById(R.id.tv_calendar);
+ mLiveScreenshot = (ImageView) mView.findViewById(R.id.live_screenshot);
+ mLiveScreenshot.setOnClickListener(this);
+
+ mLiveRecord.setEnabled(false);
+ mLiveScreenshot.setEnabled(false);
+
+ SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
+ final String dateStr = dateformat.format(System.currentTimeMillis());
+ mCalendarTv.setText(dateStr);
+ mCalendarTv.setOnClickListener(this);
+ mCalendarTv.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ String s1 = s.toString();
+ if (s1.equals(dateStr) || s1.compareTo(dateStr) > 0) {
+ tv_last_day.setVisibility(View.GONE);
+ } else {
+ tv_last_day.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+
+ }
+ });
+
+ ll_all_video = (LinearLayout) mView.findViewById(R.id.ll_all_video);
+ ll_all_video.setOnClickListener(this);
+ mTimerShaftBar = (TimerShaftBar) mView.findViewById(R.id.timershaft_bar);
+ mTimerShaftBar.setTimerShaftLayoutListener(new TimerShaftBar.TimerShaftBarListener() {
+ @Override
+ public void onTimerShaftBarPosChanged(Calendar calendar) {
+ Log.i("mTimerShaftBar", "onTimerShaftBarPosChanged " + calendar.getTime().toString());
+ //滑动的时间
+ if (mTimeShaftItems.size() == 0 || mRecordList.size() == 0) {
+ return;
+ }
+ long timeInMillis = calendar.getTimeInMillis();
+ if (lastTimeToPlay != timeInMillis) {
+ stop(-1);
+ }
+ long firstStartTime = mTimeShaftItems.get(mTimeShaftItems.size() - 1).getStartTime();
+ long lastEndTime = mTimeShaftItems.get(0).getEndTime();
+ if (timeInMillis <= firstStartTime) {
+ // Toast.makeText(getContext(), "我在最左边", Toast.LENGTH_SHORT).show();
+ // play(-1, 1, firstStartTime, mRecordList.get(0).getEndTime(), mRecordList.get(0).getRecordID());
+ stop(-1);
+ Toast.makeText(getContext(), "暂无视频", Toast.LENGTH_SHORT).show();
+ } else if (lastEndTime <= timeInMillis) {
+ stop(-1);
+ Toast.makeText(getContext(), "暂无视频", Toast.LENGTH_SHORT).show();
+ } else {
+ for (int i = mTimeShaftItems.size() - 1; i >= 0; i--) {
+ long startTime = mTimeShaftItems.get(i).getStartTime();
+ long endTime = mTimeShaftItems.get(i).getEndTime();
+ Log.i("mTimeShaftItems", i + "/" + mTimeShaftItems.size() + "---" + startTime + "---" + endTime + "---" + timeInMillis);
+ //如果再最左边
+ if (startTime <= timeInMillis && timeInMillis <= endTime) {
+ // Toast.makeText(getContext(), "播放第" + i + "个视频中间", Toast.LENGTH_SHORT).show();
+ play(-1, 2, timeInMillis, endTime, mRecordList.get(i).getRecordID());
+ i = -1;
+ } else if (timeInMillis <= startTime) {
+ Toast.makeText(getContext(), "暂无视频", Toast.LENGTH_SHORT).show();
+ stop(-1);
+ // Toast.makeText(getContext(), "播放第" + i + "个视频开头", Toast.LENGTH_SHORT).show();
+ /*play(-1, 1, startTime, endTime, mRecordList.get(i).getRecordID());
+ i = -1;*/
+ } else {
+ // Toast.makeText(getContext(), "还没到播放的那个", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onTimerShaftBarDown() {
+ //按下的时间
+ }
+ });
+ if (null != getActivity().getIntent().getExtras().get("dateString")) {
+ long dateString = (long) getActivity().getIntent().getExtras().get("dateString");
+ SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+ String date = String.valueOf(sdf2.format(dateString));
+ mCalendarTv.setText(date);
+ queryRecordNum(date, "0");
+
+ Calendar calendar = Calendar.getInstance(); // 默认是当前日期
+ calendar.setTimeInMillis(dateString * 1000);
+ if (calendar != null) {
+ Log.i("onPlayTime", "onPlayTime calendar = " + calendar.getTime().toString());
+ mTimerShaftBar.setPlayCalendar(calendar);
+ }
+
+ } else {
+ queryRecordNum("1", "0");
+ }
+
+ initSeekBarAndTime();
+ play(-1);
+ return mView;
+ }
+
+ private void initLoadDialog() {
+ mLoadingDialog = new LoadingDialog(getContext());
+ mLoadingDialog.setMessage("加载数据中");
+ mLoadingDialog.show();
+ }
+
+ private void queryRecordNum(final String dateString, final String type) {
+ initLoadDialog();
+ final String startTime;
+ final String endTime;
+ if (dateString.equals("1")) {
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+ startTime = df.format(new Date()) + " 00:00:00";
+ endTime = df.format(new Date()) + " 23:59:59";
+ } else {
+ stop(-1); //无效资源号
+ startTime = dateString + " 00:00:00";
+ endTime = dateString + " 23:59:59";
+ }
+ Business.getInstance().queryRecordNum(recordInfo.getChnlUuid(), startTime, endTime, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what != 0) {
+ Toast.makeText(getContext(), getString(R.string.toast_recordlist_query_failed) + msg.what, Toast.LENGTH_SHORT).show();
+ if (mLoadingDialog.isShowing()) {
+ mLoadingDialog.dismiss();
+ }
+ } else if (msg.what == 0) {
+ if (msg.arg1 > 0) {
+ Business.getInstance().queryRecordList(recordInfo.getChnlUuid(), startTime, endTime, msg.arg2, msg.arg1, new Handler() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what != 0) {
+ Toast.makeText(getContext(), getString(R.string.toast_recordlist_query_failed) + msg.obj, Toast.LENGTH_SHORT).show();
+ } else {
+ mTimeShaftItems.clear();
+ mRecordList = (List) msg.obj;
+ List obj = (List) msg.obj;
+ if (obj != null && obj.size() > 0) {
+ Log.i(tag, "loadRecrodList mRecordList.size:" + mRecordList.size());
+ for (int i = 0; i < obj.size(); i++) {
+ TimerShaftRegionItem timeShaftItem = new TimerShaftRegionItem(obj.get(i).getStartTime(), obj.get(i).getEndTime(), 0);
+ mTimeShaftItems.add(timeShaftItem);
+ }
+ mTimerShaftBar.setTimeShaftItems(mTimeShaftItems);
+ if (mLoadingDialog.isShowing()) {
+ mLoadingDialog.dismiss();
+ }
+ if (type.equals("1")) {
+ play(-1, 2, mTimeShaftItems.get(mTimeShaftItems.size() - 1).getStartTime(), mTimeShaftItems.get(mTimeShaftItems.size() - 1).getEndTime(), mRecordList.get(mTimeShaftItems.size() - 1).getRecordID());
+ }
+ } else {
+ if (mLoadingDialog.isShowing()) {
+ mLoadingDialog.dismiss();
+ }
+ Toast.makeText(getContext(), "没有录像", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ });
+ } else {
+ mTimeShaftItems.clear();
+ long currentWithFormate = 0;
+ try {
+ currentWithFormate = DateTimeUitl.dateToStamp(startTime);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ TimerShaftRegionItem timeShaftItem = new TimerShaftRegionItem(currentWithFormate, currentWithFormate, 0);
+ mTimeShaftItems.add(timeShaftItem);
+ mTimerShaftBar.setTimeShaftItems(mTimeShaftItems);
+ Toast.makeText(getContext(), "没有录像", Toast.LENGTH_SHORT).show();
+ mProgressDialog.setStop(); //关闭加载窗口
+ if (mLoadingDialog.isShowing()) {
+ mLoadingDialog.dismiss();
+ }
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ //SeekBar监听
+ setSeekBarListener();
+ //禁止拖动
+ setCanSeekChanged(false);
+
+ listener = new MyBasePlayerEventListener();
+ mPlayWin.setWindowListener(listener);
+ mPlayWin.openTouchListener();
+
+ //开启横竖屏切换
+ startListener();
+ }
+
+ @Override
+ public void onResume() {
+ // TODO Auto-generated method stub
+ super.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ stop(-1); //无效资源号
+ }
+
+ @Override
+ public void onDestroyView() {
+ // TODO Auto-generated method stub
+ super.onDestroyView();
+ mPlayWin.uninitPlayWindow();// 销毁底层资源
+ }
+
+ /**
+ * @param mConfiguration 描述:实现个性化界面
+ */
+ @Override
+ protected void resetViews(Configuration mConfiguration) {
+ super.resetViews(mConfiguration);
+ if (mConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏
+ mRecordScale.setTag("LANDSCAPE");
+ mRecordScale.setImageResource(R.drawable.record_btn_smallscreen);
+ mRecordScale1.setTag("LANDSCAPE");
+ mRecordScale1.setImageResource(R.drawable.record_btn_smallscreen);
+ mRecordMenu.setVisibility(View.VISIBLE);
+ mRecordMenu1.setVisibility(View.GONE);
+ } else if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ mRecordScale.setTag("PORTRAIT");
+ mRecordScale.setImageResource(R.drawable.record_btn_fullscreen);
+ mRecordScale1.setTag("PORTRAIT");
+ mRecordScale1.setImageResource(R.drawable.record_btn_fullscreen);
+ mRecordMenu.setVisibility(View.GONE);
+ mRecordMenu1.setVisibility(View.VISIBLE);
+ }
+
+ }
+
+ private void initSeekBarAndTime() {
+ String mStartTime = TimeHelper.getTimeHMS(recordInfo.getStartTime());
+ String mEndTime = TimeHelper.getTimeHMS(recordInfo.getEndTime());
+ mRecordSeekbar.setMax((int) ((recordInfo.getEndTime() - recordInfo.getStartTime()) / 1000));
+ mRecordSeekbar.setProgress(0);
+ mRecordStartTime.setText(mStartTime);
+ mRecordEndTime.setText(mEndTime);
+ }
+
+ private void setSeekBarListener() {
+ mRecordSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ if (mRecordSeekbar.getMax() - MediaPlayBackFragment.this.progress <= 2) {
+ toast(getString(R.string.toast_playback_no_iframe));
+ seek(mRecordSeekbar.getMax() >= 2 ? mRecordSeekbar.getMax() - 2 : 0);
+ } else {
+ seek(MediaPlayBackFragment.this.progress);
+ }
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean byUser) {
+ if (byUser) {
+ MediaPlayBackFragment.this.progress = progress;
+ }
+ }
+ });
+ }
+
+ /**
+ * 描述:继续播放
+ */
+ public void resume() {
+ mPlayWin.resumeAsync();
+ mOpenPlay = PlayStatus.play_open;
+ mRecordPlayPause.setImageResource(R.drawable.record_btn_pause);
+ mRecordPlayPause1.setImageResource(R.drawable.record_btn_pause);
+ }
+
+ /**
+ * 描述:暂停播放
+ */
+ public void pause() {
+ mPlayWin.pauseAsync();
+ mOpenPlay = PlayStatus.play_pause;
+ mRecordPlayPause.setImageResource(R.drawable.record_btn_play);
+ mRecordPlayPause1.setImageResource(R.drawable.record_btn_play);
+ }
+
+ public boolean openAudio() {
+ return mPlayWin.playAudio() == retOK;
+ }
+
+ public boolean closeAudio() {
+ return mPlayWin.stopAudio() == retOK;
+ }
+
+ public void seek(int index) {
+ System.out.println("index:" + index);
+
+ long seekTime = recordInfo.getStartTime() / 1000 + index;
+ //先暂存时间记录
+ MediaPlayBackFragment.this.beginTime = TimeHelper.getTimeHMS(seekTime * 1000);
+ MediaPlayBackFragment.this.progress = index;
+ mRecordSeekbar.setProgress(index);
+ mRecordStartTime.setText(MediaPlayBackFragment.this.beginTime);
+
+ mPlayWin.seek(index);
+
+ // if (recordInfo != null&& (recordInfo.getType() == RecordInfo.RecordType.PublicCloud)) {
+ // if (mOpenPlay == PlayStatus.play_pause) {
+ // resume();
+ // }
+ // mPlayWin.seek(index);
+ // System.out.println(tag + "tag-publicClound Seek to: " + index);
+ // }else{
+ // playSeek(seekTime * 1000, recordInfo.getEndTime());
+ // System.out.println(tag + "tag-deviceRecord Seek to: " + index);
+ // }
+ }
+
+ public void play(int strRes, int type, long startTime, long endTime, String recordID) {
+ //if (mOpenPlay == PlayStatus.play_open) {
+ stop(-1);
+ //}
+ if (strRes > 0) {
+ showLoading(strRes);
+ } else {
+ showLoading(R.string.common_loading);
+ }
+ mOpenPlay = PlayStatus.play_opening;
+ mRecordPlayPause.setImageResource(R.drawable.record_btn_pause);
+ mRecordPlayPause1.setImageResource(R.drawable.record_btn_pause);
+ // mPlayWin.setStreamCallback(1); //启用标准流回调,测试代码
+ if (recordInfo.getType() == RecordInfo.RecordType.PublicCloud) {
+ //播放起始时间默认设为0,开发者自行
+ mPlayWin.playCloud(Business.getInstance().getToken(), channelInfo.getDeviceCode(),
+ String.valueOf(channelInfo.getIndex()),
+ channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(),
+ recordInfo.getRecordID(), 1000, 0, 24 * 3600);
+ } else {
+ switch (type) {
+ case 1:
+ mPlayWin.playRtspPlayback(Business.getInstance().getToken(), channelInfo.getDeviceCode(), channelInfo.getIndex(),
+ channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(), recordID,
+ startTime, endTime, 0, 0, true);
+ break;
+ case 2:
+ //按时间回放
+ /*mPlayWin.playRtspPlaybackByUtcTime(Business.getInstance().getToken(), channelInfo.getDeviceCode(),
+ channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(),
+ channelInfo.getIndex(), startTime, endTime);*/
+
+ mPlayWin.playRtspPlayback(Business.getInstance().getToken(), channelInfo.getDeviceCode(), channelInfo.getIndex(),
+ channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(), recordID,
+ startTime, endTime, 0, 0, true);
+ break;
+ case 3:
+ //按文件名回放,播放起始时间默认设为0,开发者自行修改
+ /*mPlayWin.playRtspPlaybackByFileName(Business.getInstance().getToken(), channelInfo.getDeviceCode(),
+ channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(),
+ recordInfo.getRecordPath(), 0);*/
+ break;
+ default:
+
+ break;
+ }
+ }
+
+ //允许拖动
+ setCanSeekChanged(true);
+ }
+
+ public void play(int strRes) {
+ //if (mOpenPlay == PlayStatus.play_open) {
+ stop(-1);
+ //}
+ if (strRes > 0) {
+ showLoading(strRes);
+ } else {
+ showLoading(R.string.common_loading);
+ }
+ mOpenPlay = PlayStatus.play_opening;
+ mRecordPlayPause.setImageResource(R.drawable.record_btn_pause);
+ mRecordPlayPause1.setImageResource(R.drawable.record_btn_pause);
+ // mPlayWin.setStreamCallback(1); //启用标准流回调,测试代码
+ lastTimeToPlay = recordInfo.getStartTime();
+ if (recordInfo.getType() == RecordInfo.RecordType.PublicCloud) {
+ //播放起始时间默认设为0,开发者自行
+ mPlayWin.playCloud(Business.getInstance().getToken(), channelInfo.getDeviceCode(),
+ String.valueOf(channelInfo.getIndex()),
+ channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(),
+ recordInfo.getRecordID(), 1000, 0, 24 * 3600);
+ } else {
+ mPlayWin.playRtspPlayback(Business.getInstance().getToken(), channelInfo.getDeviceCode(), channelInfo.getIndex(),
+ channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(), recordInfo.getRecordID(),
+ recordInfo.getStartTime(), recordInfo.getEndTime(), 0, 0, true);
+ // //按时间回放
+ // mPlayWin.playRtspPlaybackByUtcTime(Business.getInstance().getToken(), channelInfo.getDeviceCode(),
+ // channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(),
+ // channelInfo.getIndex(), recordInfo.getStartTime(), recordInfo.getEndTime());
+
+ //按文件名回放,播放起始时间默认设为0,开发者自行修改
+ // mPlayWin.playRtspPlaybackByFileName(Business.getInstance().getToken(), channelInfo.getDeviceCode(),
+ // channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(),
+ // recordInfo.getRecordPath(), 0);
+
+ }
+
+ //允许拖动
+ setCanSeekChanged(true);
+ }
+
+ public void stop(final int res) {
+ //关闭播放加载控件
+ mProgressDialog.setStop();
+ stopPlayWindow();
+ mOpenPlay = PlayStatus.play_close;
+ mRecordPlayPause.setImageResource(R.drawable.record_btn_play);
+ mRecordPlayPause1.setImageResource(R.drawable.record_btn_play);
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAdded()) {
+ if (res > 0)
+ showErrorTip(res);
+ }
+ }
+ });
+ }
+ //禁止拖动
+ setCanSeekChanged(false);
+ }
+
+ // private void playSeek(long startTime, long endTime) {
+ // //打开加载进度栏
+ // showLoading(R.string.common_loading);
+ // if (mOpenPlay != PlayStatus.play_close) {
+ // stopPlayWindow();
+ // }
+ // mOpenPlay = PlayStatus.play_opening;
+ // mRecordPlayPause.setImageResource(R.drawable.record_btn_pause);
+ //
+ // mPlayWin.playRtspPlaybackByUtcTime(Business.getInstance().getToken(),
+ // channelInfo.getDeviceCode(), channelInfo.getEncryptKey() != null ? channelInfo.getEncryptKey() : channelInfo.getDeviceCode(), channelInfo.getIndex(), startTime, endTime);
+ // }
+
+ /**
+ * 描述 :单独关闭播放 ! 注意:组件要求必须要主线程调用
+ */
+ public void stopPlayWindow() {
+ closeAudio();// 关闭音频
+ if (recordInfo.getType() == RecordInfo.RecordType.PublicCloud)
+ mPlayWin.stopCloud(true);
+ else
+ mPlayWin.stopRtspPlayback(true);// 关闭视频
+ }
+
+ /**
+ * 描述:设置拖动进度条是否能使用
+ */
+ public void setCanSeekChanged(boolean canSeek) {
+ mRecordSeekbar.setCanTouchAble(canSeek);
+ }
+
+ @Override
+ public void onClick(View view) {
+ // TODO Auto-generated method stub
+ switch (view.getId()) {
+ case R.id.record_play_pause:
+ case R.id.record_play_pause1:
+ switch (mOpenPlay) {
+ case play_open:
+ pause();
+ break;
+ case play_pause:
+ resume();
+ break;
+ case play_opening:
+ stop(-1); //因为准备播放过程异步执行,这个状态里,无法精准的控制停止操作
+ break;
+ case play_close:
+ initSeekBarAndTime();
+ // play(-1);
+ if (mTimeShaftItems.size() > 0) {
+ play(-1, 2, mTimeShaftItems.get(mTimeShaftItems.size() - 1).getStartTime(), mTimeShaftItems.get(mTimeShaftItems.size() - 1).getEndTime(), mRecordList.get(mTimeShaftItems.size() - 1).getRecordID());
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case R.id.record_scale:
+ case R.id.record_scale1:
+ if ("LANDSCAPE".equals(mRecordScale.getTag())) {
+ mOrientation = ORIENTATION.isPortRait;
+ getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ } else {
+ mOrientation = ORIENTATION.isLandScape;
+ getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ }
+ break;
+ case R.id.record_play_pressed:
+ initSeekBarAndTime();
+ // play(-1);
+ if (mTimeShaftItems.size() > 0) {
+ play(-1, 2, mTimeShaftItems.get(mTimeShaftItems.size() - 1).getStartTime(), mTimeShaftItems.get(mTimeShaftItems.size() - 1).getEndTime(), mRecordList.get(mTimeShaftItems.size() - 1).getRecordID());
+ }
+ break;
+ case R.id.tv_calendar:
+ showCalendarBottom(mCalendarTv.getText().toString());
+ break;
+ case R.id.ll_all_video:
+ Intent intent1 = new Intent(getContext(), RecordListActivity.class);
+ intent1.putExtra("UUID", channelInfo.getUuid());
+ intent1.putExtra("TYPE", MediaPlayActivity.IS_VIDEO_REMOTE_RECORD);
+ intent1.putExtra("dateString", mCalendarTv.getText().toString());
+ intent1.putExtra("MEDIA_TITLE", R.string.local_records_name);
+ startActivity(intent1);
+ break;
+ case R.id.record_no_voice1:
+ if (isOpenVoice) {
+ record_no_voice1.setImageResource(R.drawable.live_btn_sound_off);
+ closeAudio();
+ isOpenVoice = false;
+ } else {
+ record_no_voice1.setImageResource(R.drawable.live_btn_sound_on);
+ openAudio();
+ isOpenVoice = true;
+ }
+ /* AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
+ if (audioManager != null) {
+ if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
+ record_no_voice1.setImageResource(R.drawable.live_btn_sound_on);
+ silentSwitchOff(audioManager);
+ openAudio();
+ } else if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) {
+ record_no_voice1.setImageResource(R.drawable.live_btn_sound_off);
+ silentSwitchOn(audioManager);
+ closeAudio();
+ }
+ }*/
+ break;
+ case R.id.live_screenshot:
+ mLiveScreenshot.setImageResource(R.drawable.icon_photograph_pre);
+ capture();
+ mLiveScreenshot.setImageResource(R.drawable.icon_photograph_nor);
+ break;
+ case R.id.live_record:
+ if (!isRecord) {
+ // boolean result = startRecord();
+ if (true) {
+ toastWithImg(getString(R.string.video_monitor_media_record), R.drawable.live_pic_record);
+ isRecord = true;
+ isPause = false;
+ mLiveRecord.setImageResource(R.drawable.icon_videotape_pre);
+ ll_record_time.setVisibility(View.VISIBLE);
+ //显示录制时间
+ timeRunable.run();
+ }
+ } else {
+ isPause = true;
+ stopRecord();
+ }
+ break;
+ case R.id.tv_before_day:
+ String beforeFromTarget = DateTimeUitl.getBeforeFromTarget(mCalendarTv.getText().toString());
+ mCalendarTv.setText(beforeFromTarget);
+ queryRecordNum(beforeFromTarget, "1");
+ break;
+ case R.id.tv_last_day:
+ String futureFromTarget = DateTimeUitl.getFutureFromTarget(mCalendarTv.getText().toString());
+ mCalendarTv.setText(futureFromTarget);
+ queryRecordNum(futureFromTarget, "1");
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * 关闭录像
+ */
+ public void stopRecord() {
+ mPlayWin.stopRecord();
+ isRecord = false;
+ toast(getString(R.string.video_monitor_video_record_success));
+ mLiveRecord.setImageResource(R.drawable.icon_videotape_nor);
+ currentSecond = 0;
+ ll_record_time.setVisibility(View.GONE);
+
+ /*MediaScannerConnection.scanFile(getActivity(), new String[]{path},
+ null, null);*/
+ }
+
+ /**
+ * 描述:抓拍图像
+ */
+ public String capture() {
+ String captureFilePath = null;
+ // 判断SD卡是否已存在
+ // SD卡容量检查
+ // FIXME 检查设备是否在线
+ // 抓图
+ String channelName = null;
+ if (channelInfo != null) {
+ channelName = channelInfo.getName();
+ } else {
+ channelName = "";
+ }
+
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+
+ captureFilePath = MediaPlayHelper.getCaptureAndVideoPath(MediaPlayHelper.DHFilesType.DHImage, channelName);
+ int ret = mPlayWin.snapShot(captureFilePath);
+ if (ret == retOK) {
+ // 扫描到相册中
+ MediaScannerConnection.scanFile(getActivity(), new String[]{captureFilePath}, null, null);
+ Bitmap loacalBitmap = getLoacalBitmap(captureFilePath);
+ iv_screen_shot.setImageBitmap(loacalBitmap);
+ iv_screen_shot.setVisibility(View.VISIBLE);
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ iv_screen_shot.setVisibility(View.GONE);
+ }
+ }, 2000);
+ Toast.makeText(getActivity(),
+ R.string.video_monitor_image_capture_success,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ captureFilePath = null;
+ Toast.makeText(getActivity(),
+ R.string.video_monitor_image_capture_failed,
+ Toast.LENGTH_SHORT).show();
+ }
+ return captureFilePath;
+ }
+
+ //获取Do not disturb权限,才可进行音量操作
+ private void getDoNotDisturb() {
+ NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !notificationManager.isNotificationPolicyAccessGranted()) {
+ Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
+ startActivity(intent);
+ }
+ }
+
+ private void showCalendarBottom(String date) {
+ View rootview = LayoutInflater.from(getContext()).inflate(R.layout.fragment_media_record, null);
+ CalendarPopipWindow popupWindow = new CalendarPopipWindow(getContext(), date.substring(0, 4) + "年" + date.substring(5, 7) + "月", new CalendarPopipWindow.OnCompleteListener() {
+ @Override
+ public void onComplete(String dayStr) {
+ /*int year = Integer.parseInt(dayStr.substring(0, 4));
+ int month = Integer.parseInt(dayStr.substring(5, 7));
+ int day = Integer.parseInt(dayStr.substring(dayStr.indexOf("月") + 1, dayStr.indexOf("日")));
+ String date = DateTimeUitl.formatDateFromInt(year, month, day);*/
+ mCalendarTv.setText(dayStr);
+ queryRecordNum(dayStr, "1");
+ }
+ });
+ popupWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0);
+ }
+
+ private void silentSwitchOn(AudioManager audioManager) {
+ if (audioManager != null) {
+ audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
+ audioManager.getStreamVolume(AudioManager.STREAM_RING);
+ Log.d("Silent:", "RINGING 已被静音");
+ }
+ }
+
+ private void silentSwitchOff(AudioManager audioManager) {
+ if (audioManager != null) {
+ audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+ audioManager.getStreamVolume(AudioManager.STREAM_RING);
+ Log.d("SilentListenerService", "RINGING 取消静音");
+ }
+ }
+
+ private enum PlayStatus {play_close, play_open, play_opening, play_pause}
+
+ class MyBasePlayerEventListener extends LCOpenSDK_EventListener {
+ @Override
+ public void onPlayerResult(int index, String code, int type) {
+ System.out.println("winIndex:" + "code:" + code + "type:" + type);
+ if (type == Business.RESULT_SOURCE_OPENAPI) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAdded()) {
+ System.out.println("save stop");
+ stop(R.string.video_monitor_play_error);
+ }
+ }
+ });
+ }
+ } else if (recordInfo != null && recordInfo.getType() == RecordInfo.RecordType.PublicCloud) {
+ if (code.equals(CloudStorageCode.HLS_DOWNLOAD_FAILD) ||
+ code.equals(CloudStorageCode.HLS_KEY_ERROR)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAdded()) {
+ System.out.println("save stop");
+ stop(R.string.video_monitor_play_error);
+ }
+ }
+ });
+ }
+ } else if (code.equals(CloudStorageCode.HLS_SEEK_FAILD)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_seek_error);
+ }
+ }
+ });
+ }
+ }
+ return;
+ } else if (code.equals(PlayerResultCode.STATE_RTSP_TEARDOWN_ERROR)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_online_fail_restart);
+ }
+ }
+ });
+ }
+ } else if (code.equals(PlayerResultCode.STATE_PACKET_FRAME_ERROR) ||
+ code.equals(PlayerResultCode.STATE_RTSP_AUTHORIZATION_FAIL) ||
+ code.equals(PlayerResultCode.STATE_RTSP_KEY_MISMATCH)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_play_error);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public void onStreamCallback(int index, byte[] data, int len) {
+ // Log.d(tag, "LCOpenSDK_EventListener::onStreamCallback-size : " + len);
+ try {
+ String path = Environment.getExternalStorageDirectory().getPath() + "/streamCallback.ts";
+ FileOutputStream fout = new FileOutputStream(path, true);
+ fout.write(data);
+ fout.close();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+ @Override
+ public void onPlayBegan(int index) {
+ // TODO Auto-generated method stub
+ if (recordInfo.getType() == RecordInfo.RecordType.PublicCloud) {
+ //if(code.equals(CloudStorageCode.HLS_DOWNLOAD_BEGIN)){
+ // 云录像播放第二步
+ System.out.println(tag + "*****+play pulic cloud video from CloudStorageCode.HLS_DOWNLOAD_BEGIN");
+ if (mSeekQueue.size() > 0) { // 从上次停止的地方播放
+ long time = mSeekQueue.poll();
+ System.out.println(tag + "*****onPlay+play pulic cloud video from time:" + time);
+ mSeekQueue.clear();
+ mPlayWin.seek(time);
+ }
+ // // 显示码率
+ // if (mHander != null) {
+ // mHander.post(MediaPlayBackFragment.this);
+ // }
+ mOpenPlay = PlayStatus.play_open;
+ openAudio();//默认打开声音
+ //关闭播放加载控件
+ mProgressDialog.setStop();
+ } else {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ mLiveRecord.setEnabled(true);
+ mLiveRecord.setAlpha(1.0f);
+ mLiveScreenshot.setAlpha(1.0f);
+ mLiveScreenshot.setEnabled(true);
+ }
+ });
+ }
+ mTimerShaftBar.setRefereshPlayTimeWithPlayer();
+ //if(code.equals(PlayerResultCode.STATE_RTSP_PLAY_READY)){
+ // // 显示码率
+ // if (mHander != null) {
+ // mHander.post(MediaPlayBackFragment.this);
+ // }
+ mOpenPlay = PlayStatus.play_open;
+
+ openAudio();//默认打开声音
+ //关闭播放加载控件
+ mProgressDialog.setStop();
+ }
+ }
+
+
+ @Override
+ public void onPlayFinished(int index) {
+ // TODO Auto-generated method stub
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_online_restart);
+ mLiveRecord.setAlpha(0.5f);
+ mLiveRecord.setEnabled(false);
+ mLiveScreenshot.setAlpha(0.5f);
+ mLiveScreenshot.setEnabled(false);
+ }
+ }
+ });
+ }
+ }
+
+ // @Override
+ // public void onReceiveData( int len) {
+ // // 流量统计
+ // mTotalFlow += len;
+ // }
+ @Override
+ public void onPlayerTime(int index, final long current) {
+ System.out.println("timetest" + current);
+ long startTime;
+ if (sthls) {
+ startTime = 0;
+ } else {
+ startTime = recordInfo.getStartTime() / 1000;
+ }
+ MediaPlayBackFragment.this.progress = (int) (current - startTime);
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (sthls) {
+ if (isAdded()) {
+ mRecordSeekbar.setProgress(MediaPlayBackFragment.this.progress);
+ MediaPlayBackFragment.this.beginTime = TimeHelper.getTimeHMS(current * 1000);
+ int bh = (int) current / 3600;
+ int bm = (int) current / 60 % 60;
+ int bs = (int) current % 60;
+ MediaPlayBackFragment.this.beginTime = String.format(Locale.US, "%02d:%02d:%02d", bh, bm, bs);
+ System.out.println("onPlayerTimetest:" + MediaPlayBackFragment.this.beginTime);
+ mRecordStartTime.setText(MediaPlayBackFragment.this.beginTime);
+ }
+ } else {
+ if (isAdded()) {
+ mRecordSeekbar.setProgress(MediaPlayBackFragment.this.progress);
+ MediaPlayBackFragment.this.beginTime = TimeHelper.getTimeHMS(current * 1000);
+ mRecordStartTime.setText(MediaPlayBackFragment.this.beginTime);
+ Calendar calendar = Calendar.getInstance(); // 默认是当前日期
+ calendar.setTimeInMillis(current * 1000);
+ if (calendar != null) {
+ // TODO: 2017/2/16 当前播放时间
+ Log.i("onPlayTime", "onPlayTime calendar = " + calendar.getTime().toString());
+ mTimerShaftBar.setPlayCalendar(calendar);
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onWindowDBClick(int index, float dx, float dy) {
+ // TODO Auto-generated method stub
+ switch (mRecordMenu.getVisibility()) {
+ case View.GONE:
+ mRecordMenu.setVisibility(View.VISIBLE);
+ break;
+ case View.VISIBLE:
+ mRecordMenu.setVisibility(View.GONE);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayFragment.java b/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayFragment.java
new file mode 100644
index 0000000..2dbbf3e
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayFragment.java
@@ -0,0 +1,266 @@
+/*
+ * 项目名: YYS
+ * 文件名: MediaPlayFragment.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.mediaplay.fragment;
+
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.support.v4.app.Fragment;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.OrientationEventListener;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.lechange.demo.business.util.MediaPlayHelper;
+import com.lechange.demo.common.ProgressDialog;
+import com.lechange.demo.mediaplay.MediaPlayActivity;
+import com.lechange.demo.mediaplay.MediaPlayBackActivity;
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.lechange.opensdk.media.LCOpenSDK_PlayWindow;
+
+
+/**
+ * 描述:视频播放组件基类 作者: lc
+ */
+public class MediaPlayFragment extends Fragment {
+ //底层返回值
+ protected static final int retOK = 0;
+ protected static final int retNG = -1;
+ protected static final String AUDIO_TALK_ERROR = "-1000"; //实时对讲初始化失败
+ private final static String tag = "MediaPlayFragment";
+ protected LCOpenSDK_EventListener listener;
+ protected LCOpenSDK_PlayWindow mPlayWin = new LCOpenSDK_PlayWindow();
+ protected Handler mHander = new Handler();
+ // 统计当前累计总流量,单位:字节
+ //protected long mTotalFlow;
+ protected ViewGroup mSurfaceParentView;
+ protected ProgressDialog mProgressDialog; //播放加载使用
+ protected TextView mReplayTip;
+ protected ORIENTATION mOrientation = ORIENTATION.isNone; //禁止横竖屏标志
+ protected boolean isCanChangeScreen = true;
+ // 屏幕方向改变监听器
+ private OrientationEventListener mOrientationListener;
+
+ //吐司类工具
+ protected void toast(int resId) {
+ if (getActivity() != null && !getActivity().isFinishing()) {
+ Toast.makeText(getActivity(), resId, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ protected void toast(String content) {
+ if (getActivity() != null && !getActivity().isFinishing()) {
+ Toast.makeText(getActivity(), content, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public void toastWithImg(String content, int imgId) {
+ if (getActivity() != null && !getActivity().isFinishing()) {
+ Toast toast = Toast.makeText(getActivity(), content, Toast.LENGTH_LONG);
+ toast.setGravity(Gravity.CENTER, 0, 0);
+ LinearLayout toastView = (LinearLayout) toast.getView();
+ ImageView imageCodeProject = new ImageView(getActivity());
+ imageCodeProject.setImageResource(imgId);
+ toastView.addView(imageCodeProject, 0);
+ toast.show();
+ }
+ }
+
+ //播放失败提示器
+ protected void showErrorTip(int resId) {
+ mReplayTip.setVisibility(View.VISIBLE);
+ mReplayTip.setText(resId);
+ }
+
+ protected void showErrorTip(String res) {
+ mReplayTip.setVisibility(View.VISIBLE);
+ mReplayTip.setText(res);
+ }
+
+ //播放缓冲提示器
+ protected void showLoading(int res) {
+ mReplayTip.setVisibility(View.GONE);
+ mProgressDialog.setStart(getString(res)); //开启播放加载控件
+ }
+
+ protected void showLoading(String res) {
+ mReplayTip.setVisibility(View.GONE);
+ mProgressDialog.setStart(res); //开启播放加载控件
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ //将自己的实例传出去
+ if (!(getActivity() instanceof BackHandlerInterface)) {
+ throw new ClassCastException("Hosting activity must implement BackHandlerInterface");
+ } else {
+ ((BackHandlerInterface) getActivity()).setSelectedFragment(this);
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ if (mOrientationListener != null) {
+ mOrientationListener.disable();
+ mOrientationListener = null;
+ }
+ }
+
+ /**
+ * 描述:开启屏幕方向监听
+ */
+ protected final void startListener() {
+ if (getActivity() == null || getActivity().isFinishing()) {
+ return;
+ }
+ mOrientationListener = new OrientationEventListener(getContext(), SensorManager.SENSOR_DELAY_NORMAL) {
+ @Override
+ public void onOrientationChanged(int rotation) {
+ // 设置竖屏
+ if (getActivity() == null || getActivity().isFinishing()) {
+ return;
+ }
+ if (!isCanChangeScreen) {
+ return;
+ }
+ requestedOrientation(rotation);
+ }
+ };
+ if (mOrientationListener.canDetectOrientation()) {
+ mOrientationListener.enable();
+ } else {
+ mOrientationListener.disable();
+ }
+
+ }
+
+ /**
+ * 描述:改变屏幕方向
+ */
+ private void requestedOrientation(int rotation) {
+ if (rotation < 10 || rotation > 350) {// 手机顶部向上
+ setPortOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ } else if (rotation < 100 && rotation > 80) {// 手机右边向上
+ setLandOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
+ } else if (rotation < 190 && rotation > 170) {// 手机低边向上
+ setPortOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
+ } else if (rotation < 280 && rotation > 260) {// 手机左边向上
+ setLandOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ }
+ }
+
+ private void setPortOrientation(int type) {
+ switch (mOrientation) {
+ case isNone:
+ getActivity().setRequestedOrientation(type);
+ break;
+ case isPortRait:
+ mOrientation = ORIENTATION.isNone;
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void setLandOrientation(int type) {
+ switch (mOrientation) {
+ case isNone:
+ getActivity().setRequestedOrientation(type);
+ break;
+ case isLandScape:
+ mOrientation = ORIENTATION.isNone;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * @see Fragment#onConfigurationChanged(Configuration)
+ * 描述:屏幕方向改变时重新绘制界面
+ */
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ initWindow(newConfig);
+ initSurFace(newConfig);
+ resetViews(newConfig);
+ }
+
+ /**
+ * 描述:初始化playWindow
+ */
+ protected void initWindow(Configuration mConfiguration) {
+ LayoutParams mLayoutParams = (LayoutParams) mSurfaceParentView.getLayoutParams();
+ if (mConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏
+ DisplayMetrics metric = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.heightPixels; // 屏幕高度(像素)
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ } else if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ DisplayMetrics metric = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ }
+ mSurfaceParentView.setLayoutParams(mLayoutParams);
+ }
+
+ /**
+ * 描述:初始化全屏或非全屏
+ */
+ private void initSurFace(Configuration mConfiguration) {
+ if (mConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏
+ if (getActivity() instanceof MediaPlayActivity) {
+ ((MediaPlayActivity) getActivity()).toggleTitle(false);
+ }
+ if (getActivity() instanceof MediaPlayBackActivity) {
+ ((MediaPlayBackActivity) getActivity()).toggleTitle(false);
+ }
+ MediaPlayHelper.setFullScreen(getActivity());
+ } else if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ if (getActivity() instanceof MediaPlayActivity) {
+ ((MediaPlayActivity) getActivity()).toggleTitle(true);
+ }
+ if (getActivity() instanceof MediaPlayBackActivity) {
+ ((MediaPlayBackActivity) getActivity()).toggleTitle(true);
+ }
+ MediaPlayHelper.quitFullScreen(getActivity());
+ }
+ }
+
+ /**
+ * 重置View,子类实现
+ */
+ protected void resetViews(Configuration mConfiguration) {
+ }
+
+ public boolean onBackPressed() {
+ return false;
+ }
+
+ public enum ORIENTATION {isPortRait, isLandScape, isNone}
+
+ public interface BackHandlerInterface {
+ public void setSelectedFragment(MediaPlayFragment backHandledFragment);
+ }
+}
+
diff --git a/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayOnlineFragment.java b/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayOnlineFragment.java
new file mode 100644
index 0000000..3e0626e
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/mediaplay/fragment/MediaPlayOnlineFragment.java
@@ -0,0 +1,1365 @@
+/*
+ * 项目名: YYS
+ * 文件名: MediaPlayOnlineFragment.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.mediaplay.fragment;
+
+import android.Manifest;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.media.MediaScannerConnection;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.ActivityCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.lechange.common.log.Logger;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.Business.PlayerResultCode;
+import com.lechange.demo.business.Business.RetObject;
+import com.lechange.demo.business.entity.ChannelInfo;
+import com.lechange.demo.business.entity.ChannelPTZInfo;
+import com.lechange.demo.business.entity.RecordInfo;
+import com.lechange.demo.business.util.MediaPlayHelper;
+import com.lechange.demo.business.util.MediaPlayHelper.DHFilesType;
+import com.lechange.demo.common.ProgressDialog;
+import com.lechange.demo.localvideo.RecordListActivity;
+import com.lechange.demo.localvideo.TodayLocalAdapter;
+import com.lechange.demo.mediaplay.MediaPlayActivity;
+import com.lechange.demo.mediaplay.MediaPlayBackActivity;
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.lechange.opensdk.listener.LCOpenSDK_TalkerListener;
+import com.lechange.opensdk.media.LCOpenSDK_Talk;
+import com.yonsz.z1.R;
+import com.yonsz.z1.listener.OnRecyclerClickListener;
+import com.yonsz.z1.mine.aboutversion.customview.ConfirmDialog;
+import com.yonsz.z1.mine.aboutversion.feature.Callback;
+import com.yonsz.z1.utils.DateTimeUitl;
+import com.yonsz.z1.utils.DensityUtil;
+import com.yonsz.z1.utils.NetWorkSpeedUtils;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.version5.weidget.RecyclerViewNoBugLinearLayoutManager;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 描述:实时视频监控 作者: lc
+ */
+public class MediaPlayOnlineFragment extends MediaPlayFragment implements
+ OnClickListener, View.OnLongClickListener {
+
+ protected static final int MediaMain = 0; // 主码流
+ protected static final int MediaAssist = 1; // 辅码流
+ protected static final int RECORDER_TYPE_DAV = 3; // 录制格式DAV
+ protected static final int RECORDER_TYPE_MP4 = 4; // 录制格式MP4
+ private static final String TAG = "MediaPlayOnlineFragment";
+ /**
+ * 描述:开始录制
+ */
+ String path = null;
+ // 状态值
+ private int bateMode = MediaAssist;
+ private AudioTalkStatus mOpenTalk = AudioTalkStatus.talk_close; // 语音对讲状态
+ private boolean isRecord = false; // 正在录制
+ private boolean isOpenSound = false; // 声音打开
+ private boolean isPlaying; // 正在播放
+ private boolean IsPTZOpen = false; // 云台打开
+ private ChannelInfo channelInfo;
+ private LinearLayout mLiveMenu;
+ private TextView mLiveMode;
+ private ImageView mLivePtz, iv_live_ptz;
+ private RelativeLayout rl_live_ptz, rl_full_ptz, rl_local_video;
+ private ImageView mLiveSound;
+ private ImageView mLiveScale;
+ private ImageView mLiveStop;
+ private LinearLayout mLiveUseLayout;
+ private LinearLayout mLiveBack;
+ private ImageView mLiveScreenshot;
+ private ImageView live_ptz1, live_screenshot1, live_talk1, live_record1;
+ private ImageView mLiveTalk;
+ private ImageView mLiveRecord;
+ private TextView netSpeedTv;
+ private ImageView iv_top, iv_down, iv_left, iv_right, iv_top1, iv_down1, iv_left1, iv_right1;
+ private ImageView iv_screen_shot;
+ private String channelId;
+ private UIHandle mHandler;
+ private ImageView list_device_localvideo;
+ private TextView tv_device_localvideo;
+
+
+ /*private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case 100:
+ netSpeedTv.setText(msg.obj.toString());
+ break;
+ }
+ super.handleMessage(msg);
+ }
+ };*/
+ private ImageView list_device_cloudvideo;
+ private RecyclerView horizontalRecyclerView;
+ private TextView tv_no_sdcard;
+ private TodayLocalAdapter mHorizontalAdapter;
+ private List mOnLineRecordList = new ArrayList<>();
+ private LinearLayout ll_record_time;
+ private TextView tv_record_time;
+ private CheckBox iv_lock_screen;
+ //计时器
+ private Handler mhandle = new Handler();
+ private boolean isPause = false;//是否暂停
+ private long currentSecond = 0;//当前毫秒数
+ private Runnable timeRunable = new Runnable() {
+ @Override
+ public void run() {
+ currentSecond = currentSecond + 1000;
+ tv_record_time.setText(DateTimeUitl.getFormatHMS(currentSecond));
+ if (!isPause) {
+ //递归调用本runable对象,实现每隔一秒一次执行任务
+ mhandle.postDelayed(this, 1000);
+ }
+ }
+ };
+ private boolean isCanRefrash = true;
+
+ public static Bitmap getLoacalBitmap(String url) {
+ try {
+ FileInputStream fis = new FileInputStream(url);
+ return BitmapFactory.decodeStream(fis);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private void callBackUiThread(Message msg) {
+ switch (msg.what) {
+ case 100:
+ netSpeedTv.setText(msg.obj.toString());
+ break;
+ }
+ }
+
+ /**
+ * @param savedInstanceState
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mHandler = new UIHandle(this);
+ Bundle b = getArguments();
+ if (b != null) {
+ channelId = b.getString("RESID");
+ channelInfo = Business.getInstance().getChannel(channelId);
+ }
+ if (channelInfo == null) {
+ toast("设备不存在");
+ getActivity().setResult(-1);
+ getActivity().finish();
+ }
+ }
+
+ /**
+ * ViewGroup, Bundle) 描述:
+ *
+ * @return
+ */
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+
+ View mView = inflater.inflate(R.layout.fragment_media_live, container,
+ false);
+ // 必须赋值,父类需要使用到
+ mSurfaceParentView = (ViewGroup) mView.findViewById(R.id.live_window);
+ // 初始化窗口大小
+ LayoutParams mLayoutParams = (LayoutParams) mSurfaceParentView
+ .getLayoutParams();
+ DisplayMetrics metric = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ mSurfaceParentView.setLayoutParams(mLayoutParams);
+
+ mPlayWin.initPlayWindow(this.getActivity(),
+ (ViewGroup) mView.findViewById(R.id.live_window_content), 0, true);
+
+ mProgressDialog = (ProgressDialog) mView
+ .findViewById(R.id.live_play_load);
+ mReplayTip = (TextView) mView.findViewById(R.id.live_play_pressed);
+
+ iv_top = (ImageView) mView.findViewById(R.id.iv_top);
+ iv_down = (ImageView) mView.findViewById(R.id.iv_down);
+ iv_left = (ImageView) mView.findViewById(R.id.iv_left);
+ iv_right = (ImageView) mView.findViewById(R.id.iv_right);
+ iv_top1 = (ImageView) mView.findViewById(R.id.iv_top1);
+ iv_down1 = (ImageView) mView.findViewById(R.id.iv_down1);
+ iv_left1 = (ImageView) mView.findViewById(R.id.iv_left1);
+ iv_right1 = (ImageView) mView.findViewById(R.id.iv_right1);
+ list_device_localvideo = (ImageView) mView.findViewById(R.id.list_device_localvideo);
+ tv_device_localvideo = (TextView) mView.findViewById(R.id.tv_device_localvideo);
+ list_device_cloudvideo = (ImageView) mView.findViewById(R.id.list_device_cloudvideo);
+ netSpeedTv = (TextView) mView.findViewById(R.id.tv_net_speed);
+ mLiveMenu = (LinearLayout) mView.findViewById(R.id.live_menu);
+ mLiveMode = (TextView) mView.findViewById(R.id.live_mode);
+ mLivePtz = (ImageView) mView.findViewById(R.id.live_ptz);
+ iv_live_ptz = (ImageView) mView.findViewById(R.id.iv_live_ptz);
+ rl_live_ptz = (RelativeLayout) mView.findViewById(R.id.rl_live_ptz);
+ rl_full_ptz = (RelativeLayout) mView.findViewById(R.id.rl_full_ptz);
+ rl_local_video = (RelativeLayout) mView.findViewById(R.id.rl_local_video);
+ mLiveSound = (ImageView) mView.findViewById(R.id.live_sound);
+ mLiveUseLayout = (LinearLayout) mView.findViewById(R.id.live_use_layout);
+ mLiveBack = (LinearLayout) mView.findViewById(R.id.live_video_back_layout);
+ mLiveScale = (ImageView) mView.findViewById(R.id.live_scale);
+ mLiveStop = (ImageView) mView.findViewById(R.id.live_stop);
+ mLiveScreenshot = (ImageView) mView.findViewById(R.id.live_screenshot);
+ live_ptz1 = (ImageView) mView.findViewById(R.id.live_ptz1);
+ live_screenshot1 = (ImageView) mView.findViewById(R.id.live_screenshot1);
+ live_talk1 = (ImageView) mView.findViewById(R.id.live_talk1);
+ live_record1 = (ImageView) mView.findViewById(R.id.live_record1);
+ mLiveTalk = (ImageView) mView.findViewById(R.id.live_talk);
+ mLiveRecord = (ImageView) mView.findViewById(R.id.live_record);
+ ll_record_time = (LinearLayout) mView.findViewById(R.id.ll_record_time);
+ tv_record_time = (TextView) mView.findViewById(R.id.tv_record_time);
+ iv_screen_shot = (ImageView) mView.findViewById(R.id.iv_screen_shot);
+ iv_lock_screen = (CheckBox) mView.findViewById(R.id.iv_lock_screen);
+
+ horizontalRecyclerView = (RecyclerView) mView.findViewById(R.id.horizontal_RecyclerView);
+ tv_no_sdcard = (TextView) mView.findViewById(R.id.tv_no_sdcard);
+
+ initListener();
+
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+ String startTime = df.format(new Date()) + " 00:00:00";
+ String endTime = df.format(new Date()) + " 23:59:59";
+ //初始化数据
+ loadRecrodList(startTime, endTime);
+
+ new NetWorkSpeedUtils(getContext(), mHandler).startShowNetSpeed();
+ return mView;
+
+ }
+
+ private void loadRecrodList(final String startTime, final String endTime) {
+ Business.getInstance().queryRecordNum(channelId, startTime,
+ endTime, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what != 0) {
+ tv_no_sdcard.setVisibility(View.VISIBLE);
+// Toast.makeText(getContext(), getString(R.string.toast_recordlist_query_failed) + msg.what, Toast.LENGTH_SHORT).show();
+ } else if (msg.what == 0) {
+ if (msg.arg1 > 0) {
+ int firstNumber = 1;
+ int lastNumber = msg.arg1;
+ if (msg.arg1 > 5) {
+ lastNumber = 5;
+ firstNumber = msg.arg1 - 4;
+ }
+ Business.getInstance().queryRecordList(channelId, startTime,
+ endTime, firstNumber, msg.arg1, new Handler() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what != 0) {
+ Toast.makeText(getContext(), getString(R.string.toast_recordlist_query_failed) + msg.obj, Toast.LENGTH_SHORT).show();
+ } else {
+ if (isCanRefrash) {
+ mOnLineRecordList.addAll((List) msg.obj);
+ } else {
+ return;
+ }
+ if (mOnLineRecordList != null && mOnLineRecordList.size() > 0) {
+ Log.d("loadRecrodList", "loadRecrodList mRecordList.size:" + mOnLineRecordList.size());
+ tv_no_sdcard.setVisibility(View.GONE);
+ mHorizontalAdapter = new TodayLocalAdapter(getActivity(), mOnLineRecordList, channelId);
+ RecyclerViewNoBugLinearLayoutManager manage = new RecyclerViewNoBugLinearLayoutManager(getActivity());
+ manage.setOrientation(LinearLayoutManager.HORIZONTAL);
+ horizontalRecyclerView.setLayoutManager(manage);
+ horizontalRecyclerView.setAdapter(mHorizontalAdapter);
+ mHorizontalAdapter.setmOnItemClickListener(new OnRecyclerClickListener() {
+ @Override
+ public void onClick(View view, int position) {
+ Intent intent = new Intent(getActivity(), MediaPlayBackActivity.class);
+ if (TextUtils.isEmpty(mOnLineRecordList.get(position).getId())) {
+ return;
+ }
+ intent.putExtra("TYPE", MediaPlayBackActivity.IS_VIDEO_REMOTE_RECORD);
+ intent.putExtra("ID", mOnLineRecordList.get(position).getId());
+ intent.putExtra("dateString", mOnLineRecordList.get(position).getStartTime());
+ startActivity(intent);
+ }
+ });
+ isCanRefrash = false;
+ } else {
+ tv_no_sdcard.setVisibility(View.VISIBLE);
+ // RecordListActivity.this.findViewById(R.id.list_records_novideo).setVisibility(View.VISIBLE);
+ Toast.makeText(getContext(), "没有录像", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ });
+ } else {
+ tv_no_sdcard.setVisibility(View.VISIBLE);
+ // RecordListActivity.this.findViewById(R.id.list_records_novideo).setVisibility(View.VISIBLE);
+ }
+ }
+ }
+ });
+ }
+
+ private void initListener() {
+ mReplayTip.setOnClickListener(this);
+ mLiveMode.setOnClickListener(this);
+ mLivePtz.setOnClickListener(this);
+ iv_live_ptz.setOnClickListener(this);
+ mLiveSound.setOnClickListener(this);
+ mLiveScale.setOnClickListener(this);
+ mLiveScale.setTag("PORTRAIT");
+ mLiveStop.setOnClickListener(this);
+ mLiveScreenshot.setOnClickListener(this);
+ mLiveTalk.setOnClickListener(this);
+ mLiveRecord.setOnClickListener(this);
+ list_device_localvideo.setOnClickListener(this);
+ tv_device_localvideo.setOnClickListener(this);
+ list_device_cloudvideo.setOnClickListener(this);
+ iv_top.setOnClickListener(this);
+ iv_down.setOnClickListener(this);
+ iv_left.setOnClickListener(this);
+ iv_right.setOnClickListener(this);
+ iv_top1.setOnClickListener(this);
+ iv_down1.setOnClickListener(this);
+ iv_left1.setOnClickListener(this);
+ iv_right1.setOnClickListener(this);
+ iv_top.setOnLongClickListener(this);
+ iv_down.setOnLongClickListener(this);
+ iv_left.setOnLongClickListener(this);
+ iv_right.setOnLongClickListener(this);
+ live_ptz1.setOnClickListener(this);
+ live_screenshot1.setOnClickListener(this);
+ live_talk1.setOnClickListener(this);
+ live_record1.setOnClickListener(this);
+ iv_lock_screen.setOnClickListener(this);
+ }
+
+ /**
+ * 描述:MediaPlayActivity创建完毕
+ *
+ * @param savedInstanceState
+ */
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ listener = new MyBaseWindowListener();
+ mPlayWin.setWindowListener(listener);
+ mPlayWin.openTouchListener();
+
+ // 开启横竖屏切换
+ startListener();
+
+
+ // int ability = channelInfo.getAbility();
+ // if ((ability & ChannelInfo.Ability.AudioTalk) == 0) {
+ // if (getActivity().getResources().getConfiguration().orientation ==
+ // Configuration.ORIENTATION_LANDSCAPE) {
+ // mLiveTalk.setOnClickListener(new OnClickListener() {
+ // @Override
+ // public void onClick(View v) {
+ // toast(R.string.video_monitor_unsupport_audio_talk);
+ // }
+ // });
+ // } else if
+ // (getActivity().getResources().getConfiguration().orientation ==
+ // Configuration.ORIENTATION_PORTRAIT) {
+ // mLiveTalk.setOnClickListener(new OnClickListener() {
+ // @Override
+ // public void onClick(View v) {
+ // toast(R.string.video_monitor_unsupport_audio_talk);
+ // }
+ // });
+ // }
+ // }
+ }
+
+ @Override
+ public void onResume() {
+ // TODO Auto-generated method stub
+ super.onResume();
+ play(0);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ // 停止实时视频,无效资源号
+ stop(-1);
+ // 关闭语音对讲
+ if (mOpenTalk == AudioTalkStatus.talk_opening) {
+ stopTalk();
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ // TODO Auto-generated method stub
+ super.onDestroyView();
+ mPlayWin.uninitPlayWindow();// 销毁底层资源
+ }
+
+ /**
+ * 描述:实现个性化界面
+ *
+ * @param mConfiguration
+ */
+ @Override
+ protected void resetViews(Configuration mConfiguration) {
+ super.resetViews(mConfiguration);
+ if (mConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏
+ mLiveUseLayout.setVisibility(View.GONE);
+ mLiveBack.setVisibility(View.GONE);
+ mLiveScale.setTag("LANDSCAPE");
+ mLiveScale.setImageResource(R.drawable.live_btn_smallscreen);
+ live_ptz1.setVisibility(View.VISIBLE);
+ live_screenshot1.setVisibility(View.VISIBLE);
+ live_talk1.setVisibility(View.VISIBLE);
+ live_record1.setVisibility(View.VISIBLE);
+ if (IsPTZOpen) {
+ rl_full_ptz.setVisibility(View.VISIBLE);
+ }
+ iv_lock_screen.setVisibility(View.VISIBLE);
+ } else if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ mLiveUseLayout.setVisibility(View.VISIBLE);
+ mLiveBack.setVisibility(View.VISIBLE);
+ mLiveScale.setTag("PORTRAIT");
+ mLiveScale.setImageResource(R.drawable.live_btn_fullscreen);
+ rl_full_ptz.setVisibility(View.GONE);
+ live_ptz1.setVisibility(View.GONE);
+ live_screenshot1.setVisibility(View.GONE);
+ live_talk1.setVisibility(View.GONE);
+ live_record1.setVisibility(View.GONE);
+ iv_lock_screen.setVisibility(View.GONE);
+ isCanChangeScreen = true;
+ }
+ }
+
+ private void sendCloudOrder(final Cloud mCloud, final boolean longclick) {
+ if (IsPTZOpen && isPlaying) {
+ // super.sendCloudOrder(mCloud, longclick);
+ Log.d(TAG, "-----is longclick:" + longclick);
+ ChannelPTZInfo.Operation operation = ChannelPTZInfo.Operation.Move;
+ ChannelPTZInfo.Direction direction = null;
+ switch (mCloud) {
+ case up:
+ direction = ChannelPTZInfo.Direction.Up;
+ Log.d(TAG, "-----Up");
+ break;
+ case down:
+ direction = ChannelPTZInfo.Direction.Down;
+ Log.d(TAG, "-----Down");
+ break;
+ case left:// 手势向左, 摄像头向右转
+ direction = ChannelPTZInfo.Direction.Left;
+ Log.d(TAG, "-----case left");
+ break;
+ case right:
+ direction = ChannelPTZInfo.Direction.Right;
+ Log.d(TAG, "-----case right");
+ break;
+ case zoomin:
+ direction = ChannelPTZInfo.Direction.ZoomIn;
+ Log.d(TAG, "-----ZoomIn");
+ break;
+ case zoomout:
+ direction = ChannelPTZInfo.Direction.ZoomOut;
+ Log.d(TAG, "-----ZoomOut");
+ break;
+ case stop:
+ Log.d(TAG, "-----stop");
+ operation = ChannelPTZInfo.Operation.Stop;
+ // direction = ChannelPTZInfo.Direction.Down;
+ break;
+ default:
+ break;
+ }
+ ChannelPTZInfo ptzInfo = new ChannelPTZInfo(operation, direction);
+ ptzInfo.setDuration(ChannelPTZInfo.Duration.Short);
+ if (longclick) {
+ ptzInfo.setDuration(ChannelPTZInfo.Duration.Long);
+ }
+
+ Business.getInstance().AsynControlPtz(channelId,
+ ptzInfo, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (!isAdded() || getActivity() == null) {
+ Log.d(TAG, "*******page not exits");
+ return;
+ }
+ // Log.d(TAG,
+ // "-----control callback what:"+msg.what);
+ RetObject retObject = (RetObject) msg.obj;
+ if (msg.what == 0) {
+ Log.d(TAG, "-----control result: true");
+ } else
+ toast(retObject.mMsg);
+ }
+ });
+ }
+ }
+
+ /**
+ * 描述:开始播放
+ */
+ public void play(final int strRes) {
+ if (DensityUtil.checkNetworkConnection(getContext())) {
+ playOnline(strRes);
+ } else {
+ if (SharedpreferencesUtil.get("isShowMobilePlay", "").toString().equals("1")) {
+ playOnline(strRes);
+ } else {
+ ConfirmDialog dialog = new ConfirmDialog(getActivity(), new Callback() {
+ @Override
+ public void callback(int position) {
+ switch (position) {
+ case 0:
+ break;
+ case 1:
+ SharedpreferencesUtil.save("isShowMobilePlay", "1");
+ playOnline(strRes);
+ break;
+ }
+ }
+ });
+ dialog.setContent("你正在使用非WIFI网络继续播放将产生流量费用");
+ dialog.setCancleBtn("暂停播放");
+ dialog.setSureBtn("继续播放");
+ dialog.setCancelable(false);
+ dialog.show();
+ }
+ }
+ }
+
+ private void playOnline(int strRes) {
+ stop(-1);
+ // }
+ if (strRes > 0) {
+ showLoading(strRes);
+ } else {
+ showLoading(R.string.common_loading);
+ }
+ mPlayWin.playRtspReal(
+ Business.getInstance().getToken(),
+ channelInfo.getDeviceCode(),
+ channelInfo.getEncryptKey() != null ? channelInfo
+ .getEncryptKey() : channelInfo.getDeviceCode(),
+ channelInfo.getIndex(), bateMode, true);//最后一个参数为true,表示使用长连接
+ }
+
+ /**
+ * 描述:停止播放
+ */
+ public void stop(final int res) {
+ // 关闭播放加载控件
+ mProgressDialog.setStop();
+
+ if (isRecord) {
+ stopRecord();// 关闭录像
+ }
+
+ if (isOpenSound) {
+ closeAudio();// 关闭音频
+ isOpenSound = false;
+ mLiveSound.setImageResource(R.drawable.live_btn_sound_off);
+ }
+ mPlayWin.stopRtspReal(false);// 关闭视频
+ isPlaying = false;
+
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ if (res > 0)
+ showErrorTip(res);
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * 描述:抓拍图像
+ */
+ public String capture() {
+ String captureFilePath = null;
+ // 判断SD卡是否已存在
+ // SD卡容量检查
+ // FIXME 检查设备是否在线
+ // 抓图
+ String channelName = null;
+ if (channelInfo != null) {
+ channelName = channelInfo.getName();
+ } else {
+ channelName = "";
+ }
+
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+
+ captureFilePath = MediaPlayHelper.getCaptureAndVideoPath(DHFilesType.DHImage, channelName);
+ int ret = mPlayWin.snapShot(captureFilePath);
+ if (ret == retOK) {
+ // 扫描到相册中
+ MediaScannerConnection.scanFile(getActivity(), new String[]{captureFilePath}, null, null);
+ Bitmap loacalBitmap = getLoacalBitmap(captureFilePath);
+ iv_screen_shot.setImageBitmap(loacalBitmap);
+ iv_screen_shot.setVisibility(View.VISIBLE);
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ iv_screen_shot.setVisibility(View.GONE);
+ }
+ }, 2000);
+ Toast.makeText(getActivity(),
+ R.string.video_monitor_image_capture_success,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ captureFilePath = null;
+ Toast.makeText(getActivity(),
+ R.string.video_monitor_image_capture_failed,
+ Toast.LENGTH_SHORT).show();
+ }
+ return captureFilePath;
+ }
+
+ public boolean startRecord() {
+ if (!isPlaying) {
+ toast(R.string.video_monitor_video_record_failed);
+ return false;
+ }
+ // 判断SD卡是否已存在
+ // SD卡容量检查
+
+ // FIXME 要做 ~~~~检查设备是否在线
+
+ // 录像的路径
+ String channelName = null;
+ if (channelInfo != null) {
+ channelName = channelInfo.getName();
+ } else {
+ channelName = "";
+ }
+
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+
+ path = MediaPlayHelper.getCaptureAndVideoPath(DHFilesType.DHVideo,
+ channelName);
+ int recordType = 1;
+ long spaceRemain = 0x7FFFFFFF; //保留字段
+ // 开始录制 1
+ int ret = mPlayWin.startRecord(path, recordType, spaceRemain);
+ if (ret != retOK) {
+ toast(R.string.video_monitor_video_record_failed);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * 关闭录像
+ */
+ public void stopRecord() {
+ mPlayWin.stopRecord();
+ isRecord = false;
+ toast(getString(R.string.video_monitor_video_record_success));
+ live_record1.setImageResource(R.drawable.icon_column_videotape);
+ mLiveRecord.setImageResource(R.drawable.icon_videotape_nor);
+ currentSecond = 0;
+ ll_record_time.setVisibility(View.GONE);
+
+ MediaScannerConnection.scanFile(getActivity(), new String[]{path},
+ null, null);
+ }
+
+ /**
+ * 打开声音
+ */
+ public boolean openAudio() {
+ return mPlayWin.playAudio() == retOK;
+ }
+
+ /**
+ * 关闭声音
+ */
+ public boolean closeAudio() {
+ return mPlayWin.stopAudio() == retOK;
+ }
+
+ /**
+ * 描述:开始对讲
+ */
+ public void startTalk() {
+ if (!isPlaying) {
+ toast(R.string.video_monitor_talk_open_error);
+ return;
+ }
+
+ toastWithImg(getString(R.string.video_monitor_media_talk), R.drawable.live_pic_talkback);
+
+ // 替换图片
+ live_talk1.setImageResource(R.drawable.icon_column_suspend_per);
+ mLiveTalk.setImageResource(R.drawable.icon_dialogue_pre);
+ mOpenTalk = AudioTalkStatus.talk_opening;
+ // 关闭扬声器 默认为关
+ if (isOpenSound) {
+ closeAudio();
+ mLiveSound.setImageResource(R.drawable.live_btn_sound_off);
+ }
+ mLiveSound.setClickable(false);
+ LCOpenSDK_Talk.setListener(new AudioTalkerListener());
+ LCOpenSDK_Talk.playTalk(
+ Business.getInstance().getToken(),
+ channelInfo.getDeviceCode(),
+ channelInfo.getEncryptKey() != null ? channelInfo
+ .getEncryptKey() : channelInfo.getDeviceCode(), true);//对讲使用长连接
+
+
+
+ /*LCOpenSDK_ParamTalk paramTalk = new LCOpenSDK_ParamTalk(
+ LCDeviceEngine.newInstance().accessToken,
+ deviceListBean.deviceId,
+ deviceListBean.channels.size() > 1 ? Integer.parseInt(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId) : -1,
+ TextUtils.isEmpty(encryptKey) ? deviceListBean.deviceId : encryptKey,
+ deviceListBean.playToken,
+ true
+ );
+ LCOpenSDK_Talk.playTalk(paramTalk);*/
+ }
+
+ /**
+ * 描述:停止对讲
+ */
+ public void stopTalk() {
+ Log.d("playAudio", "stopTalk press");
+ toast(R.string.video_monitor_media_talk_close);
+ // 替换图片
+ live_talk1.setImageResource(R.drawable.icon_column_suspend1);
+ mLiveTalk.setImageResource(R.drawable.icon_dialogue_nor);
+ LCOpenSDK_Talk.stopTalk();
+ // 解决gc回收问题
+ LCOpenSDK_Talk.setListener(null);
+ mOpenTalk = AudioTalkStatus.talk_close;
+ // 开启扬声器
+ if (isOpenSound && isPlaying) {
+ openAudio();
+ mLiveSound.setImageResource(R.drawable.live_btn_sound_on);
+ }
+ mLiveSound.setClickable(true);
+ }
+
+ @Override
+ public void onClick(View view) {
+ // TODO Auto-generated method stub
+ switch (view.getId()) {
+ case R.id.live_ptz:
+ case R.id.live_ptz1:
+ if (!isPlaying) {
+ return;
+ }
+ if ((channelInfo.getAbility() & ChannelInfo.Ability.PTZ) != 0) {
+ if (1 == 1) {
+ Log.i("393", "MediaPlayOnlineFragment onClick()" + (393 & 64));
+ Log.i("457", "MediaPlayOnlineFragment onClick()" + (457 & 64));
+ if ((channelInfo.getAbility() & ChannelInfo.Ability.PTZ) != 0) {
+ if (IsPTZOpen) {
+ // 测试专用
+ // mPlayWin.setStreamCallback(0);
+ IsPTZOpen = false;
+ rl_live_ptz.setVisibility(View.GONE);
+ rl_full_ptz.setVisibility(View.GONE);
+ rl_local_video.setVisibility(View.VISIBLE);
+ mLivePtz.setImageResource(R.drawable.icon_control_nor);
+ live_ptz1.setImageResource(R.drawable.icon_column_control_nor);
+ } else {
+ // 测试专用
+ // mPlayWin.setStreamCallback(1);
+ IsPTZOpen = true;
+ rl_local_video.setVisibility(View.GONE);
+ rl_live_ptz.setVisibility(View.VISIBLE);
+ mLivePtz.setImageResource(R.drawable.icon_control_pre);
+ live_ptz1.setImageResource(R.drawable.icon_column_control_pre);
+ if (mLiveScale.getTag().toString().equals("LANDSCAPE")) {
+ rl_full_ptz.setVisibility(View.VISIBLE);
+ }
+ }
+ } else {
+ toast(R.string.toast_device_ability_no_ptz);
+ }
+ }
+ }
+ break;
+ case R.id.iv_live_ptz:
+ if (IsPTZOpen) {
+ // 测试专用
+ // mPlayWin.setStreamCallback(0);
+ IsPTZOpen = false;
+ mLivePtz.setImageResource(R.drawable.icon_control_nor);
+ rl_live_ptz.setVisibility(View.GONE);
+ rl_local_video.setVisibility(View.VISIBLE);
+ }
+ break;
+ case R.id.live_scale:
+ if ("LANDSCAPE".equals(mLiveScale.getTag())) {
+ mOrientation = ORIENTATION.isPortRait;
+ getActivity().setRequestedOrientation(
+ ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ } else {
+ mOrientation = ORIENTATION.isLandScape;
+ getActivity().setRequestedOrientation(
+ ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ }
+ break;
+ case R.id.live_stop:
+ if (isPlaying) {
+ mReplayTip.setVisibility(View.VISIBLE);
+ setButtonAlpha(0.5f);
+ // 停止实时视频,无效资源号
+ stop(-1);
+ mLiveStop.setImageResource(R.drawable.icon_column_play);
+ // 关闭语音对讲
+ if (mOpenTalk == AudioTalkStatus.talk_opening) {
+ stopTalk();
+ }
+ } else {
+ mReplayTip.setVisibility(View.GONE);
+ setButtonAlpha(1.0f);
+ mLiveStop.setImageResource(R.drawable.icon_column_suspend);
+ play(0);
+ }
+ break;
+ case R.id.live_mode:
+ // if(isPlaying) //播放是个异步的,多次点击会使停止播放顺序乱掉
+ if (mOpenTalk == AudioTalkStatus.talk_opening) {
+ stopTalk();
+ }
+ // 高清切换到流畅
+ if (bateMode == MediaMain) {
+ bateMode = MediaAssist;
+ mLiveMode.setText("流畅");
+ play(R.string.video_monitor_change_stream_normal);
+ }// 流畅切换到高清
+ else if (bateMode == MediaAssist) {
+ bateMode = MediaMain;
+ mLiveMode.setText("高清");
+ play(R.string.video_monitor_change_stream_hd);
+ }
+ break;
+ case R.id.live_talk:
+ case R.id.live_talk1:
+ switch (mOpenTalk) {
+ case talk_open:
+ case talk_opening:
+ stopTalk();
+ break;
+ case talk_close:
+ openTalk();
+ // startTalk();
+ break;
+ default:
+ break;
+ }
+ break;
+ case R.id.live_sound:
+ if (mOpenTalk != AudioTalkStatus.talk_close || !isPlaying) {
+ toast(R.string.video_monitor_load_talk_sound_error);
+ } else {
+ if (isOpenSound) {
+ boolean result = closeAudio();
+ if (result) {
+ mLiveSound
+ .setImageResource(R.drawable.live_btn_sound_off);
+ toast(R.string.video_monitor_sound_close);
+ isOpenSound = false;
+ }
+ } else {
+ boolean result = openAudio();
+ if (result) {
+ mLiveSound
+ .setImageResource(R.drawable.live_btn_sound_on);
+ toast(R.string.video_monitor_sound_open);
+ isOpenSound = true;
+ }
+ }
+ }
+ break;
+ case R.id.live_screenshot:
+ case R.id.live_screenshot1:
+ live_screenshot1.setImageResource(R.drawable.icon_column_photograph);
+ mLiveScreenshot.setImageResource(R.drawable.icon_photograph_pre);
+ capture();
+ mLiveScreenshot.setImageResource(R.drawable.icon_photograph_nor);
+ break;
+ case R.id.live_record:
+ case R.id.live_record1:
+ if (!isRecord) {
+ boolean result = startRecord();
+ if (result) {
+ toastWithImg(getString(R.string.video_monitor_media_record), R.drawable.live_pic_record);
+ isRecord = true;
+ isPause = false;
+ live_record1.setImageResource(R.drawable.icon_column_videotape_per);
+ mLiveRecord.setImageResource(R.drawable.icon_videotape_pre);
+ ll_record_time.setVisibility(View.VISIBLE);
+ //显示录制时间
+ timeRunable.run();
+ }
+ } else {
+ isPause = true;
+ stopRecord();
+ }
+ break;
+ case R.id.live_play_pressed:
+ mLiveStop.setImageResource(R.drawable.icon_column_suspend);
+ setButtonAlpha(1.0f);
+ play(-1);
+ break;
+ case R.id.list_device_cloudvideo:
+ Intent intent = new Intent(getContext(), RecordListActivity.class);
+ intent.putExtra("UUID", channelId);
+ intent.putExtra("MEDIA_TITLE", R.string.cloud_records_name);
+ intent.putExtra("TYPE", MediaPlayActivity.IS_VIDEO_REMOTE_CLOUD_RECORD);
+ startActivity(intent);
+ break;
+ case R.id.list_device_localvideo:
+ case R.id.tv_device_localvideo:
+ Intent intent1 = new Intent(getContext(), RecordListActivity.class);
+ intent1.putExtra("UUID", channelId);
+ intent1.putExtra("TYPE", MediaPlayActivity.IS_VIDEO_REMOTE_RECORD);
+ intent1.putExtra("MEDIA_TITLE", R.string.local_records_name);
+ startActivity(intent1);
+ break;
+ case R.id.iv_top:
+ case R.id.iv_top1:
+ sendCloudOrder(Cloud.up, false);
+ break;
+ case R.id.iv_down:
+ case R.id.iv_down1:
+ sendCloudOrder(Cloud.down, false);
+ break;
+ case R.id.iv_left:
+ case R.id.iv_left1:
+ sendCloudOrder(Cloud.left, false);
+ break;
+ case R.id.iv_right:
+ case R.id.iv_right1:
+ sendCloudOrder(Cloud.right, false);
+ break;
+ case R.id.iv_lock_screen:
+ if (iv_lock_screen.isChecked()) {
+ Toast.makeText(getContext(), "横屏已锁定", Toast.LENGTH_SHORT).show();
+ isCanChangeScreen = false;
+ } else {
+ Toast.makeText(getContext(), "解除横屏锁定", Toast.LENGTH_SHORT).show();
+ isCanChangeScreen = true;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void setButtonAlpha(float alpha) {
+ live_ptz1.setAlpha(alpha);
+ live_screenshot1.setAlpha(alpha);
+ live_talk1.setAlpha(alpha);
+ live_record1.setAlpha(alpha);
+ mLiveMode.setAlpha(alpha);
+ mLiveSound.setAlpha(alpha);
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ switch (v.getId()) {
+ case R.id.iv_top:
+ sendCloudOrder(Cloud.up, false);
+ break;
+ case R.id.iv_down:
+ sendCloudOrder(Cloud.down, false);
+ break;
+ case R.id.iv_left:
+ sendCloudOrder(Cloud.left, false);
+ break;
+ case R.id.iv_right:
+ sendCloudOrder(Cloud.right, false);
+ break;
+ }
+ return false;
+ }
+
+ /**
+ * 权限检查)
+ */
+ public void openTalk() {
+ boolean isMinSDKM = Build.VERSION.SDK_INT < 23;
+ boolean isGranted = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
+ if (isMinSDKM || isGranted) {
+ startTalk();
+ // 对讲权限
+ return;
+ }
+ requestRecordAudioPermission();
+ }
+
+ private void requestRecordAudioPermission() {
+
+ if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
+ Manifest.permission.RECORD_AUDIO)) {
+
+ Logger.d("Uriah", "Uriah + shouldShowRequestPermission true");
+ ActivityCompat.requestPermissions(getActivity(),
+ new String[]{Manifest.permission.RECORD_AUDIO},
+ 1);
+ } else {
+ ActivityCompat.requestPermissions(getActivity(),
+ new String[]{Manifest.permission.RECORD_AUDIO},
+ 1);
+ }
+ }
+
+ public enum Cloud {
+ up, down, left, right, leftUp, rightUp, leftDown, RightDown, zoomin, zoomout, stop
+ }
+
+ private enum AudioTalkStatus {
+ talk_close, talk_opening, talk_open
+ }
+
+ //handler
+ static class UIHandle extends Handler {
+ WeakReference weakReference;
+
+ public UIHandle(MediaPlayOnlineFragment activity) {
+ weakReference = new WeakReference(activity);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ MediaPlayOnlineFragment activity = weakReference.get();
+ activity.callBackUiThread(msg);
+ }
+ }
+
+ class MyBaseWindowListener extends LCOpenSDK_EventListener {
+ @Override
+ public void onPlayerResult(int index, String code, int type) {
+ if (type == Business.RESULT_SOURCE_OPENAPI) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_play_error);
+ }
+ }
+ });
+ }
+ } else {
+ if (code.equals(PlayerResultCode.STATE_PACKET_FRAME_ERROR)
+ || code.equals(PlayerResultCode.STATE_RTSP_TEARDOWN_ERROR)
+ || code.equals(PlayerResultCode.STATE_RTSP_AUTHORIZATION_FAIL)
+ || code.equals(PlayerResultCode.STATE_RTSP_KEY_MISMATCH)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_play_error);
+ }
+ }
+ });
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPlayBegan(int index) {
+ // TODO Auto-generated method stub
+ // 显示码率
+ // if (mHander != null) {
+ // mHander.post(MediaPlayOnlineFragment.this);
+ // }
+ isPlaying = true;
+ // 建立码流,自动开启音频
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAdded()) {
+ // showLoading(R.string.video_monitor_data_cache);
+ onClick(mLiveSound);
+ }
+ }
+ });
+ }
+ // 关闭播放加载控件
+ mProgressDialog.setStop();
+ }
+
+ // public void onReceiveData(int len) {
+ // // 流量统计
+ // mTotalFlow += len;
+ // }
+ @Override
+ public void onStreamCallback(int index, byte[] data, int len) {
+ // Log.d(TAG, "LCOpenSDK_EventListener::onStreamCallback-size : " +
+ // len);
+ try {
+ String path = Environment.getExternalStorageDirectory()
+ .getPath() + "/streamCallback.ts";
+ FileOutputStream fout = new FileOutputStream(path, true);
+ fout.write(data);
+ fout.close();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+ @Override
+ public void onWindowLongPressBegin(int index, Direction dir, float dx,
+ float dy) {
+ sendCloudOrder(direction2Cloud(dir), true);
+ }
+
+ @Override
+ public void onWindowLongPressEnd(int index) {
+ sendCloudOrder(Cloud.stop, false);
+ }
+
+ // 电子缩放
+ @Override
+ public void onZooming(int index, float dScale) {
+ if (IsPTZOpen == false) {
+ mPlayWin.doScale(dScale);
+ }
+
+ }
+
+ // 云台缩放
+ @Override
+ public void onZoomEnd(int index, ZoomType zoom) {
+ Log.d(TAG, "onZoomEnd" + zoom);
+ if (IsPTZOpen == false) {
+ return;
+ }
+ // TODO Auto-generated method stub
+ sendCloudOrder(zoom == ZoomType.ZOOM_IN ? Cloud.zoomin
+ : Cloud.zoomout, false);
+ }
+
+ // 滑动开始
+ @Override
+ public boolean onSlipBegin(int index, Direction dir, float dx, float dy) {
+ if (IsPTZOpen == false && mPlayWin.getScale() > 1) {
+ Log.d(TAG, "onflingBegin ");
+ }
+ sendCloudOrder(direction2Cloud(dir), false);
+ return true;
+ }
+
+ // 滑动中
+ @Override
+ public void onSlipping(int index, Direction dir, float prex,
+ float prey, float dx, float dy) {
+ if (IsPTZOpen == false && mPlayWin.getScale() > 1) {
+ Log.d(TAG, "onflingBegin onFlinging");
+ mPlayWin.doTranslate(dx, dy);
+ }
+ }
+
+ // 滑动结束
+ @Override
+ public void onSlipEnd(int index, Direction dir, float dx, float dy) {
+ if (IsPTZOpen == false && mPlayWin.getScale() > 1) {
+ Log.d(TAG, "onflingBegin onFlingEnd");
+ return;
+ }
+
+ // sendCloudOrder(Cloud.stop, false);
+ }
+
+ private Cloud direction2Cloud(Direction dir) {
+ Cloud cloud = null;
+ switch (dir) {
+ case Up:
+ cloud = Cloud.up;
+ break;
+ case Down:
+ cloud = Cloud.down;
+ break;
+ case Left:
+ cloud = Cloud.left;
+ break;
+ case Right:
+ cloud = Cloud.right;
+ break;
+ case Left_up:
+ cloud = Cloud.leftUp;
+ break;
+ case Left_down:
+ cloud = Cloud.leftDown;
+ break;
+ case Right_up:
+ cloud = Cloud.rightUp;
+ break;
+ case Right_down:
+ cloud = Cloud.RightDown;
+ break;
+ default:
+ break;
+ }
+ return cloud;
+ }
+
+ public void onWindowDBClick(int index, float dx, float dy) {
+ // TODO Auto-generated method stub
+ switch (mLiveMenu.getVisibility()) {
+ case View.GONE:
+ mLiveMenu.setVisibility(View.VISIBLE);
+ break;
+ case View.VISIBLE:
+ mLiveMenu.setVisibility(View.GONE);
+ break;
+ default:
+ break;
+ }
+ }
+
+ }
+
+ class AudioTalkerListener extends LCOpenSDK_TalkerListener {
+ /**
+ * 描述:对讲状态获取
+ */
+ @Override
+ public void onTalkResult(String error, int type) {
+ // TODO Auto-generated method stub
+ if (type == Business.RESULT_SOURCE_OPENAPI
+ || error.equals(AUDIO_TALK_ERROR)
+ || error.equals(PlayerResultCode.STATE_PACKET_FRAME_ERROR)
+ || error.equals(PlayerResultCode.STATE_RTSP_TEARDOWN_ERROR)
+ || error.equals(PlayerResultCode.STATE_RTSP_AUTHORIZATION_FAIL)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ // 提示对讲打开失败
+ toast(R.string.video_monitor_talk_open_error);
+ stopTalk();// 关闭播放
+ }
+ }
+ });
+ }
+ } else if (error.equals(PlayerResultCode.STATE_RTSP_PLAY_READY)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ // 提示对讲打开成功
+ toast(R.string.video_monitor_media_talk_ready);
+ }
+ }
+ });
+ }
+ mOpenTalk = AudioTalkStatus.talk_open;
+ }
+
+ }
+
+ @Override
+ public void onTalkPlayReady() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAudioRecord(byte[] pData, int length, int audioFormat, int sampleRate, int sampleDepth) {
+ super.onAudioRecord(pData, length, audioFormat, sampleRate, sampleDepth);
+ BufferedOutputStream bufferedOutputStream;
+ FileOutputStream fileOutputStream;
+ String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/AudioFile.pcm";
+ File file = new File(filePath);
+ if (file.exists()) {
+ try {
+ fileOutputStream = new FileOutputStream(file, true);
+ bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+ try {
+ bufferedOutputStream.write(pData);
+ bufferedOutputStream.flush();
+ bufferedOutputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } finally {
+
+ }
+ } else {
+ try {
+ file.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void onAudioReceive(byte[] pData, int length, int audioFormat, int sampleRate, int sampleDepth) {
+ super.onAudioReceive(pData, length, audioFormat, sampleRate, sampleDepth);
+ }
+
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/message/AlarmMessageActivity.java b/app/src/main/java/com/lechange/demo/message/AlarmMessageActivity.java
new file mode 100644
index 0000000..7b9b264
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/message/AlarmMessageActivity.java
@@ -0,0 +1,389 @@
+package com.lechange.demo.message;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.entity.AlarmMessageInfo;
+import com.lechange.demo.business.util.ImageHelper;
+import com.lechange.demo.business.util.TaskPoolHelper;
+import com.lechange.demo.common.CommonTitle;
+import com.lechange.demo.common.CommonTitle.OnTitleClickListener;
+import com.lechange.demo.common.DatePicker;
+import com.lechange.demo.common.DatePicker.OnTimeClickListener;
+import com.lechange.demo.common.ProgressDialog;
+import com.yonsz.z1.R;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+public class AlarmMessageActivity extends Activity {
+
+ private String tag="AlarmMessageActivity";
+ private String mChannelUUID = null;
+
+ private DatePicker mDatePicker;
+ private LinearLayout mDatePickerContainer; //放置DatePicker的容器
+ private ListView mAlarmMsgListView; //放置报警信息的listview
+ private CommonTitle mCommonTitle;
+ private ProgressDialog mProgressDialog; //播放加载使用
+ private AlarmMsgListAdapter mAlarmMsgAdapt;
+ private List mAlarmMsgInfoList; // 保存报警信息
+
+ private ImageView mNoMsgImageView; //无报警消息
+ private ImageView mShowBigImageView; //显示大图
+
+ private String mStartTime; //开始时间
+ private String mEndTime; //结束时间
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // TODO Auto-generated method stub
+ super.onCreate(savedInstanceState);
+ this.setContentView(R.layout.activity_alarm_message);
+
+ mChannelUUID = getIntent().getStringExtra("UUID"); //获取通道的UUID
+ initTitle();
+ //开启播放加载控件
+ mProgressDialog = (ProgressDialog) this.findViewById(R.id.query_load);
+ mProgressDialog.setStart(getString(R.string.common_loading));
+
+ initAlarmMsgListView();
+ initBigImageView();
+
+
+ }
+
+ /**
+ * 初始化大图,并添加点击事件
+ * @note 当大图显示中,界面只显示此控件。点击此控件,该控件隐藏,mAlarmMsgListView与mCommonTitle显示
+ */
+ public void initBigImageView(){
+ mShowBigImageView = (ImageView) findViewById(R.id.showBigPhoto);
+ mShowBigImageView.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View arg0) {
+ mProgressDialog.setStop(); //关闭加载窗口
+ mShowBigImageView.setTag(0);
+
+ mDatePickerContainer.setVisibility(View.VISIBLE);
+ mAlarmMsgListView.setVisibility(View.VISIBLE);
+ mCommonTitle.setVisibility(View.VISIBLE);
+ mShowBigImageView.setVisibility(View.GONE);
+ }
+ });
+ }
+
+ /**
+ * 初始化标题栏,管理mDatePickerContainer
+ * @note 点击右边按钮,会弹出时间选择器
+ */
+ public void initTitle() {
+ mDatePickerContainer = (LinearLayout) findViewById(R.id.timerContainer);
+ // 绘制标题
+ mCommonTitle = (CommonTitle) findViewById(R.id.title);
+ mCommonTitle.initView(R.drawable.title_btn_back,
+ R.drawable.title_btn_search, R.string.alarm_message_name);
+
+ mCommonTitle.setOnTitleClickListener(new OnTitleClickListener() {
+ @Override
+ public void onCommonTitleClick(int id) {
+ // TODO Auto-generated method stub
+ switch (id) {
+ case CommonTitle.ID_LEFT:
+ finish();
+ break;
+ case CommonTitle.ID_RIGHT:
+ // 添加时间选择控件
+ Log.d(tag,tag + mDatePickerContainer.getChildCount());
+ if (mDatePickerContainer.getChildCount() > 0) {
+ return;
+ }
+
+ // undo 添加datepicker
+ if (mDatePicker == null) {
+ mDatePicker = new DatePicker(getApplicationContext());
+ initDatePicker();
+ }
+
+ LayoutParams lp = new LayoutParams(
+ LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT);
+ mDatePickerContainer.addView(mDatePicker, lp);
+ break;
+ default:
+ break;
+ }
+ }
+ });
+ }
+
+ /**
+ * 初始化时间选择控件,主要是添加事件响应函数
+ */
+
+ public void initDatePicker() {
+ if (mDatePicker == null) {
+ return;
+ }
+
+ mDatePicker.setOnTimeClickListener(new OnTimeClickListener() {
+
+ @Override
+ public void onCommonTimeClick(int id) {
+ if (id == DatePicker.ID_LEFT) { // 点击左边
+ mDatePickerContainer.removeView(mDatePicker);
+ } else { // 点击右边
+ Date time = mDatePicker.getSelectedDate();
+
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+ String date = df.format(time);
+
+ mStartTime = date + " 00:00:00";
+ mEndTime = date + " 23:59:59";
+
+ mDatePickerContainer.removeView(mDatePicker);
+ loadAlarmMsgList(mStartTime, mEndTime);
+ //清空屏幕
+ mAlarmMsgAdapt.notifyDataSetChanged();
+ mNoMsgImageView.setVisibility(View.GONE);
+ mProgressDialog.setStart(getString(R.string.common_loading));
+ }
+
+ }
+ });
+ }
+
+ /**
+ * 初始化报警消息列表
+ */
+ public void initAlarmMsgListView(){
+
+ mAlarmMsgListView = (ListView) findViewById(R.id.messageList);
+ mNoMsgImageView = (ImageView) findViewById(R.id.noMsgImg);
+
+ mAlarmMsgAdapt = new AlarmMsgListAdapter(this);
+ mAlarmMsgListView.setAdapter(mAlarmMsgAdapt);
+
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+ mStartTime = df.format(new Date()) + " 00:00:00";
+ mEndTime = df.format(new Date()) + " 23:59:59";
+
+ loadAlarmMsgList(mStartTime,mEndTime);
+ }
+
+ /**
+ * 更新报警消息
+ * @param startTime 报警开始时间段
+ * @param endTime 报警结束时间段
+ */
+
+ public void loadAlarmMsgList(String startTime, String endTime) {
+ //查10条
+ Business.getInstance().queryAlarmMessageList(mChannelUUID, startTime, endTime, 10, new Handler() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public void handleMessage(Message msg) {
+ mProgressDialog.setStop(); //关闭加载窗口
+ if (msg.what != 0) {
+ Toast.makeText(AlarmMessageActivity.this, getString(R.string.toast_alarmmsg_query_failed) + msg.arg1, Toast.LENGTH_SHORT).show();
+ } else if (msg.what == 0) {
+ mAlarmMsgInfoList = (List) msg.obj;
+ if (mAlarmMsgInfoList != null && mAlarmMsgInfoList.size() > 0) {
+ mAlarmMsgAdapt.notifyDataSetChanged();
+ } else {
+ mNoMsgImageView.setVisibility(View.VISIBLE);
+ //Toast.makeText(AlarmMessageActivity.this, "没有报警消息", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void onDestroy() {
+ // TODO Auto-generated method stub
+ super.onDestroy();
+ TaskPoolHelper.clearTask();
+ }
+
+ class AlarmMsgListAdapter extends BaseAdapter {
+ private LayoutInflater mInflater;
+
+ public AlarmMsgListAdapter(Context context) {
+ this.mInflater = LayoutInflater.from(context);
+ }
+
+ @Override
+ public int getCount() {
+ return mAlarmMsgInfoList != null ? mAlarmMsgInfoList.size():0;
+ }
+
+ @Override
+ public AlarmMessageInfo getItem(int position) {
+ return mAlarmMsgInfoList.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ // TODO Auto-generated method stub
+ return position;
+ }
+
+ /**
+ * 删除某条报警信息
+ * @param info
+ */
+ private void deleteAlarmMsg(final AlarmMessageInfo info) {
+ Business.getInstance().deleteAlarmMessage(info, new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what != 0) {
+ Toast.makeText(AlarmMessageActivity.this, R.string.toast_alarmmsg_delete_failed,
+ Toast.LENGTH_LONG).show();
+ } else {
+ //mAlarmMsgInfoList.remove(info);
+ //mAlarmMsgAdapt.notifyDataSetChanged();
+
+ loadAlarmMsgList(mStartTime,mEndTime);
+ //清空屏幕
+ mAlarmMsgAdapt.notifyDataSetChanged();
+ mNoMsgImageView.setVisibility(View.GONE);
+ mProgressDialog.setStart(getString(R.string.common_loading));
+ }
+ }
+ });
+ }
+ @Override
+ public View getView(final int position, View convertView, ViewGroup parent) {
+ final ViewHolder holder;
+
+ if (convertView == null) {
+ holder = new ViewHolder();
+ convertView = mInflater.inflate(
+ R.layout.activity_alarm_message_item, null);
+ holder.photo = (ImageView) convertView.findViewById(R.id.photo);
+ holder.timeText = (TextView) convertView
+ .findViewById(R.id.alarmTime);
+ holder.deleteButton = (ImageView) convertView
+ .findViewById(R.id.delete);
+
+ // 删除按钮添加响应事件
+ holder.deleteButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ switch(which){
+ case Dialog.BUTTON_POSITIVE:
+ deleteAlarmMsg(holder.info);
+ break;
+ case Dialog.BUTTON_NEGATIVE:
+ break;
+ case Dialog.BUTTON_NEUTRAL:
+ break;
+ }
+ }
+ };
+ //dialog参数设置
+ AlertDialog.Builder builder=new AlertDialog.Builder(AlarmMessageActivity.this); //先得到构造器
+ builder.setTitle(R.string.alarm_message_delete_dialog_title); //设置标题
+ builder.setMessage(R.string.alarm_message_delete_dialog_message); //设置内容
+ builder.setPositiveButton(R.string.dialog_positive,dialogOnclicListener);
+ builder.setNegativeButton(R.string.dialog_negative,dialogOnclicListener);
+ builder.create().show();
+ }
+ });
+
+ holder.photo.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ mAlarmMsgListView.setVisibility(View.GONE);
+ mCommonTitle.setVisibility(View.GONE);
+ mDatePickerContainer.setVisibility(View.GONE);
+
+ mProgressDialog.setStart(getString(R.string.common_loading));
+ mShowBigImageView.setTag(holder.info.getPicUrl().hashCode());
+ mShowBigImageView.setImageDrawable(null);
+ mShowBigImageView.setVisibility(View.VISIBLE);
+ if(holder.info.getPicUrl() != null && holder.info.getPicUrl().length() > 0)
+ ImageHelper.loadRealImage(holder.info.getPicUrl(), holder.info.getDeviceId(),holder.info.getDeviceKey() != null ? holder.info.getDeviceKey() : holder.info.getDeviceId(), new Handler(){
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ if ((Integer)mShowBigImageView.getTag() == msg.what) {
+ mProgressDialog.setStop(); //关闭加载窗口
+ if (msg.obj != null) {
+ mShowBigImageView.setImageDrawable((Drawable)msg.obj);
+ } else {
+ Toast.makeText(AlarmMessageActivity.this, R.string.toast_alarmmsg_load_failed, Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ });
+ }
+ });
+
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ }
+
+ //修改数据信息
+ holder.info = getItem(position);
+ Log.d("", "index : " + position);
+
+ //背景\holder.photo图片清空
+ holder.photo.setBackgroundResource(R.drawable.list_bg_device);
+ if(holder.info.getThumbUrl() != null && holder.info.getThumbUrl().length() > 0)
+ ImageHelper.loadCacheImage(holder.info.getThumbUrl(),holder.info.getDeviceId(),holder.info.getDeviceKey() != null ? holder.info.getDeviceKey() : holder.info.getDeviceId(), new Handler(){
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ if(holder.info.getThumbUrl().hashCode() == msg.what && msg.obj != null){
+ //Log.d(tag, msg.obj.toString());
+ holder.photo.setBackgroundDrawable((Drawable)msg.obj);
+ }
+ }
+ });
+ // 报警时间更新
+ holder.timeText.setText(holder.info.getLocalDate());
+
+
+ return convertView;
+ }
+
+
+ }
+
+ static class ViewHolder {
+ public ImageView photo;
+ public TextView timeText;
+ public ImageView deleteButton;
+ public AlarmMessageInfo info;
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/tools/DateHelper.java b/app/src/main/java/com/lechange/demo/tools/DateHelper.java
new file mode 100644
index 0000000..acf7e7f
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/tools/DateHelper.java
@@ -0,0 +1,51 @@
+package com.lechange.demo.tools;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class DateHelper {
+ public static Date string2Date(String time) {
+ try {
+ String str = time;
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Date date = (Date) sdf.parse(str);
+ return date;
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static String dateFormat(Date date) {
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+ String dateString = formatter.format(date);
+ return dateString;
+ }
+
+ public static String dateFormatTiming(long date) {
+ SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
+ formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));
+ String dateString = formatter.format(date);
+ return dateString;
+ }
+
+ public static String getTimeHMS(long time) {
+ SimpleDateFormat format1 = new SimpleDateFormat("HH:mm:ss");
+ Date date = new Date(time);
+ String date1 = format1.format(date);
+ return date1;
+ }
+
+ public static long parseMills(String dateTime) {
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateTime));
+ return calendar.getTimeInMillis();
+ } catch (ParseException e) {
+ return 0;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/tools/DeviceAbilityHelper.java b/app/src/main/java/com/lechange/demo/tools/DeviceAbilityHelper.java
new file mode 100644
index 0000000..bc3e007
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/tools/DeviceAbilityHelper.java
@@ -0,0 +1,19 @@
+package com.lechange.demo.tools;
+
+public class DeviceAbilityHelper {
+
+
+ public static boolean isHasAbility(String deviceAbility,String channelAbility,String ability1,String ability2){
+ if (deviceAbility==null||channelAbility==null)return false;
+
+ if (deviceAbility.contains(ability1)||deviceAbility.contains(ability2)){
+ return true;
+ }else if (channelAbility.contains(ability1)||channelAbility.contains(ability2)){
+ return true;
+ }
+
+ return false;
+
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/tools/DialogUtils.java b/app/src/main/java/com/lechange/demo/tools/DialogUtils.java
new file mode 100644
index 0000000..32d82af
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/tools/DialogUtils.java
@@ -0,0 +1,47 @@
+package com.lechange.demo.tools;
+
+import android.app.Activity;
+
+import com.lechange.demo.dialog.LoadingDialog;
+
+public class DialogUtils {
+ static LoadingDialog mLoadingDialog;
+ static Activity activity;
+
+ public static void show(Activity mActivity) {
+ if (mActivity.isFinishing()) {
+ return;
+ }
+ if (activity != null) {
+ if (activity == mActivity) {
+ if (null != mLoadingDialog) {
+ if (mLoadingDialog.isShowing()) {
+ return;
+ }
+ }
+ }
+ }
+ activity = mActivity;
+ if (null != mLoadingDialog) {
+ dismiss();
+ }
+ mLoadingDialog = new LoadingDialog(mActivity);
+ mLoadingDialog.show();
+ }
+
+ public static void dismiss() {
+ if (null == mLoadingDialog) {
+ return;
+ }
+ if (mLoadingDialog.isShowing()) {
+ try {
+ mLoadingDialog.dismissLoading();
+ mLoadingDialog = null;
+ activity = null;
+ } catch (Exception e) {
+ mLoadingDialog = null;
+ activity = null;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/tools/ImageHelper.java b/app/src/main/java/com/lechange/demo/tools/ImageHelper.java
new file mode 100644
index 0000000..93a3f94
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/tools/ImageHelper.java
@@ -0,0 +1,217 @@
+package com.lechange.demo.tools;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.graphics.BitmapFactory.Options;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Message;
+import android.util.LruCache;
+
+import com.lechange.common.log.Logger;
+import com.lechange.opensdk.utils.LCOpenSDK_Utils;
+import com.mm.android.deviceaddmodule.LCDeviceEngine;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class ImageHelper {
+
+ private final static String TAG = "LCOpenSDK_Demo_ImageHelper";
+ private static Options mDefaultOption;
+ //最近最少使用算法的缓存策略
+ private static LruCache mImageCache = new LruCache(100);
+
+ static {
+ mDefaultOption = new Options();
+ //demo里面为了降低使用内存,图片缩小了一倍
+ mDefaultOption.inSampleSize = 2;
+ mDefaultOption.inPreferredConfig = Config.RGB_565;
+ }
+
+ public static void loadRealImage(final String url, final Handler handler) {
+ downloadImage(url, "real", handler);
+ }
+
+ /**
+ * 加载普通图片(缓存)
+ *
+ * @param url
+ * @param handler
+ */
+ public static void loadCacheImage(final String url, final Handler handler) {
+ String[] imageIDBuffer = url.split("[/?]");
+ final String imageID = imageIDBuffer[imageIDBuffer.length - 2];
+ Drawable drawable = mImageCache.get(imageID);
+ if (drawable != null) {
+ Message msg = new Message();
+ msg.what = url.hashCode();
+ msg.obj = drawable;
+ handler.handleMessage(msg);
+ } else {
+ downloadImage(url, imageID, handler);
+ }
+ }
+
+ /**
+ * 加载加密图片(缓存)
+ *
+ * @param url
+ * @param key
+ * @param handler
+ */
+ public static void loadCacheImage(final String url, final String deviceId, String key, int position,final Handler handler) {
+ String[] imageIDBuffer = url.split("[/?]");
+ String imageID;
+ if (imageIDBuffer.length - 2 > 0) {
+ imageID = imageIDBuffer[imageIDBuffer.length - 2];
+ } else {
+ imageID = "";
+ }
+ Drawable drawable = mImageCache.get(imageID);
+ if (drawable != null) {
+ Message msg = new Message();
+ msg.what = url.hashCode();
+ msg.obj = drawable;
+ msg.arg1=position;
+ handler.handleMessage(msg);
+ } else {
+ downloadImage(url, imageID, deviceId, key, position, handler);
+ }
+ }
+
+ /**
+ * 下载普通图片任务
+ *
+ * @param url
+ * @param imageID
+ * @param handler
+ */
+ private static void downloadImage(final String url, final String imageID, final Handler handler) {
+ TaskPoolHelper.addTask(new TaskPoolHelper.RunnableTask(imageID) {
+ @Override
+ public void run() {
+ Drawable drawable = null;
+ try {
+ //创建一个url对象
+ URL resurl = new URL(url);
+ //设置超时时间
+ HttpURLConnection urlConn = (HttpURLConnection) resurl.openConnection();
+ urlConn.setConnectTimeout(5000);
+ urlConn.setReadTimeout(5000);
+ //打开URL对应的资源输入流
+ InputStream is = urlConn.getInputStream();
+ //从InputStream流中解析出图片
+ Bitmap bitmap = BitmapFactory.decodeStream(is, null, mDefaultOption);
+ if (bitmap != null) {
+ drawable = new BitmapDrawable(bitmap);
+ }
+ //加入缓存
+ mImageCache.put(imageID, drawable);
+ //关闭输入流
+ is.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ // 解析设备列表信息
+ handler.obtainMessage(url.hashCode(), drawable).sendToTarget(); // 发送成功消息到界面
+ }
+ });
+ }
+
+ /**
+ * 下载加密图片任务
+ *
+ * @param url
+ * @param imageID
+ * @param key
+ * @param handler
+ */
+ private static void downloadImage(final String url, final String imageID, final String deviceId, final String key, final int position, final Handler handler) {
+ TaskPoolHelper.addTask(new TaskPoolHelper.RunnableTask(imageID) {
+ @Override
+ public void run() {
+ Drawable drawable = null;
+ try {
+ //创建一个url对象
+ URL resurl = new URL(url);
+ //设置超时时间
+ HttpURLConnection urlConn = (HttpURLConnection) resurl.openConnection();
+ urlConn.setConnectTimeout(5000);
+ urlConn.setReadTimeout(5000);
+ int code = urlConn.getResponseCode();
+ Logger.e(TAG, "====getResponseCode, code=" + code + ", resurl.file=" + resurl.getFile());
+ //打开URL对应的资源输入流
+ InputStream is = urlConn.getInputStream();
+ //从InputStream流中解析出图片
+ ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+ byte[] buff = new byte[500];
+ int rc = 0;
+ int length = 0;
+ while ((rc = is.read(buff, 0, 500)) > 0) {
+ length += rc;
+ swapStream.write(buff, 0, rc);
+ }
+ byte[] srcBuf = swapStream.toByteArray();
+ byte[] dstBuf = new byte[500000];
+ int[] dstLen = new int[1];
+ dstLen[0] = 500000;
+ Bitmap bitmap; //=null
+ //调用图片解密新接口:三码合一
+ int res = LCOpenSDK_Utils.decryptPic(LCDeviceEngine.newInstance().accessToken, srcBuf, length, deviceId, key, dstBuf, dstLen);
+ Logger.e(TAG, "====LCOpenSDK_Utils.decryptPic, res=" + res + ", length=" + length);
+ switch (res) {
+ case 0: //解密成功
+ bitmap = BitmapFactory.decodeByteArray(dstBuf, 0, dstLen[0], mDefaultOption);
+ if (bitmap == null) {
+ String filepath = "sdcard/temp.jpg";
+ //String sd = Environment.getExternalStorageDirectory() + "/temp.jpg";
+ File file = new File(filepath);
+ OutputStream outputStream = new FileOutputStream(file);
+ outputStream.write(dstBuf);
+ outputStream.flush();
+ outputStream.close();
+ bitmap = BitmapFactory.decodeFile(filepath);
+ Logger.e(TAG, "BitmapFactory.decodeFile");
+ }
+
+ if (bitmap != null) {
+ drawable = new BitmapDrawable(bitmap);
+ }
+ break;
+ case 1://待解密数据不完整
+ case 3: //图片非加密
+ bitmap = BitmapFactory.decodeByteArray(srcBuf, 0, length, mDefaultOption);
+ if (bitmap != null) {
+ drawable = new BitmapDrawable(bitmap);
+ }
+ break;
+ default: //解密失败
+ break;
+ }
+ //加入缓存
+ mImageCache.put(imageID, drawable);
+ //关闭输入流
+ is.close();
+ swapStream.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ // 解析设备列表信息
+ handler.obtainMessage(url.hashCode(), position,0,drawable).sendToTarget(); // 发送成功消息到界面
+ }
+ });
+ }
+
+ public static void clear() {
+ TaskPoolHelper.clearTask();
+ mImageCache.evictAll();
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/tools/MediaPlayHelper.java b/app/src/main/java/com/lechange/demo/tools/MediaPlayHelper.java
new file mode 100644
index 0000000..286e426
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/tools/MediaPlayHelper.java
@@ -0,0 +1,277 @@
+package com.lechange.demo.tools;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
+import android.media.MediaScannerConnection;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.view.WindowManager;
+
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.OutputStream;
+import java.net.FileNameMap;
+import java.net.URLConnection;
+import java.text.SimpleDateFormat;
+
+public class MediaPlayHelper {
+
+ private final static String ProjectName = "LechangeDemo";
+
+ private static Context mContext;
+
+ public static void initContext(Context context) {
+ mContext = context;
+ }
+
+ public enum DHFilesType {
+ DHImage,
+ DHVideo,
+ DHImageCache
+ }
+
+ public static void setFullScreen(Activity activity) {
+ activity.getWindow().setFlags(
+ WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ }
+
+ public static void quitFullScreen(Activity activity) {
+ final WindowManager.LayoutParams attrs = activity.getWindow().getAttributes();
+ attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ activity.getWindow().setAttributes(attrs);
+ activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
+ }
+
+
+ /**
+ * 创建文件路径
+ *
+ * @param file
+ * @param filePath
+ * @return
+ */
+ public static boolean createFilePath(File file, String filePath) {
+ LogUtil.debugLog("20210513", "filePath::" + filePath);
+ int index = filePath.indexOf("/");
+ if (index == -1) {
+ LogUtil.debugLog("20210513", "filePath---------:" + file.getAbsolutePath() + " filepath::" + filePath);
+ LogUtil.debugLog("20210513", "filePath---------::" + file.getPath() + " " + file.getName() + " " + file.getParent());
+ // scanFile(file);
+ return false;
+ }
+ if (index == 0) {
+ filePath = filePath.substring(index + 1, filePath.length());
+ index = filePath.indexOf("/");
+ }
+ String path = filePath.substring(0, index);
+ File fPath;
+ if (file == null) {
+ fPath = new File(path);
+ } else {
+ fPath = new File(file.getPath() + "/" + path);
+ }
+ if (!fPath.exists()) {
+ if (!fPath.mkdir()) // SD卡已满无法在下载文件
+ {
+ return false;
+ }
+ }
+ if (index < (filePath.length() - 1)) {
+ String exPath = filePath.substring(index + 1, filePath.length());
+ createFilePath(fPath, exPath);
+ }
+ return true;
+ }
+
+ /**
+ * 生成抓图路径或录像存放路径
+ */
+ public static String getCaptureAndVideoPath(DHFilesType type, String cameraName) {
+ String path = null;
+ String picType = null;
+ java.util.Date now = new java.util.Date();
+ SimpleDateFormat tf = new SimpleDateFormat("yyyyMMddHHmmss");
+ String sdPath = null;
+ /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ sdPath = mContext.getExternalFilesDir("demo").getAbsolutePath();
+ } else {
+ }*/
+ sdPath = Environment.getExternalStorageDirectory().getPath();
+
+
+ if (type == DHFilesType.DHImage) {
+ picType = "image";
+ path = sdPath + "/" + ProjectName + "/" + tf.format(now) + "_" + picType + "_"
+ + cameraName + ".jpg";
+ } else {
+ picType = "video";
+ path = sdPath + "/" + ProjectName + "/" + tf.format(now) + "_" + picType + "_"
+ + cameraName + ".mp4";
+ }
+ if (type == DHFilesType.DHImageCache) {
+ picType = "imageCache";
+ path = sdPath + "/" + ProjectName + "/" + picType + "/" + tf.format(now) + "_"
+ + cameraName + ".jpg";
+ }
+ createFilePath(null, path);
+ return path;
+ }
+
+
+ public static void updatePhotoAlbum(String path) {
+ if (path == null) return;
+ String[] split = path.split("/");
+ String fileName = split[split.length - 1];
+ /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
+ values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
+ values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM);
+ ContentResolver contentResolver = mContext.getContentResolver();
+ Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+
+ if (uri == null) {
+ return;
+ }
+ OutputStream out = null;
+ FileInputStream fis= null;
+ try {
+ out = contentResolver.openOutputStream(uri);
+ fis = new FileInputStream(path);
+ FileUtils.copy(fis, out);
+ fis.close();
+ out.close();
+
+ //导出相册成功后,删除App沙盒内的临时文件
+ MediaPlayHelper.delete(path);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else { }*/
+ MediaScannerConnection.scanFile(mContext.getApplicationContext(), new String[]{path}, new String[]{"image/jpeg"}, new MediaScannerConnection.OnScanCompletedListener() {
+ @Override
+ public void onScanCompleted(String path, Uri uri) {
+
+ }
+ });
+
+ }
+
+ public static void updatePhotoVideo(String path) {
+ if (path == null) return;
+ String[] split = path.split("/");
+ String fileName = split[split.length - 1];
+ /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.Video.VideoColumns.DISPLAY_NAME, fileName);
+ values.put(MediaStore.Video.VideoColumns.MIME_TYPE, "video/3gp");
+ values.put(MediaStore.Video.VideoColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM);
+ ContentResolver contentResolver = mContext.getContentResolver();
+ Uri uri = contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
+
+ if (uri == null) {
+ return;
+ }
+ OutputStream out = null;
+ FileInputStream fis = null;
+ try {
+ out = contentResolver.openOutputStream(uri);
+ fis = new FileInputStream(path);
+ FileUtils.copy(fis, out);
+ fis.close();
+ out.close();
+
+ //导出相册成功后,删除App沙盒内的临时文件
+ MediaPlayHelper.delete(path);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {}*/
+ MediaScannerConnection.scanFile(mContext.getApplicationContext(), new String[]{path}, new String[]{"video/3gp"}, new MediaScannerConnection.OnScanCompletedListener() {
+ @Override
+ public void onScanCompleted(String path, Uri uri) {
+
+ }
+ });
+
+ }
+
+
+ public static String getMimeType(File file) {
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+ String type = fileNameMap.getContentTypeFor(file.getName());
+ return type;
+ }
+
+
+ /**
+ * 生成下载录像存放路径
+ */
+ public static String getDownloadVideoPath(int type, String recordID, long startTime) {
+ String path = null;
+ String sdPath = null;
+ /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ sdPath = mContext.getExternalFilesDir("demo").getAbsolutePath();
+ } else {
+ }*/
+ sdPath = Environment.getExternalStorageDirectory().getPath();
+
+ String picType = "download";
+ picType += type == 0 ? "_cloud" : "_remote";
+ java.util.Date now = new java.util.Date(startTime);
+ SimpleDateFormat tf = new SimpleDateFormat("yyyyMMddHHmmss");
+ path = sdPath + "/" + ProjectName + "/" + tf.format(now) + "_" + picType + "_"
+ + recordID + ".mp4";
+ createFilePath(null, path);
+ return path;
+ }
+
+ /**
+ * 删除下载录像存放的录像
+ */
+ public static void deleteDownloadVideo(String recordID, long startTime) {
+ String path = null;
+ String sdPath = Environment.getExternalStorageDirectory().getPath();
+ String picType = "download";
+ java.util.Date now = new java.util.Date(startTime);
+ SimpleDateFormat tf = new SimpleDateFormat("yyyyMMddHHmmss");
+ path = sdPath + "/" + ProjectName + "/" + tf.format(now) + "_" + picType + "_"
+ + recordID + ".mp4";
+ File soFile = new File(path);
+ if (soFile.exists()) {
+ soFile.delete();
+ }
+ }
+
+ /**
+ * 删除缓存文件
+ */
+ public static void delete(String path) {
+ File file = new File(path);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+
+ public static BitmapDrawable picDrawable(String path) {
+ try {
+ FileInputStream fis = new FileInputStream(path);
+ Bitmap bitmap = BitmapFactory.decodeStream(fis);
+ BitmapDrawable bd = new BitmapDrawable(bitmap);
+ return bd;
+ } catch (Throwable e) {
+ return null;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/tools/RootUtil.java b/app/src/main/java/com/lechange/demo/tools/RootUtil.java
new file mode 100644
index 0000000..fd28fcf
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/tools/RootUtil.java
@@ -0,0 +1,47 @@
+package com.lechange.demo.tools;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+
+public class RootUtil {
+ public static boolean isDeviceRooted() {
+ return checkRootMethod1() || checkRootMethod2() || checkRootMethod3();
+ }
+
+ private static boolean checkRootMethod1() {
+ String buildTags = android.os.Build.TAGS;
+ return buildTags != null && buildTags.contains("test-keys");
+ }
+
+ private static boolean checkRootMethod2() {
+ String[] paths = {"/system/app/Superuser.apk", "/sbin/su", "/system/bin/su",
+ "/system/xbin/su", "/data/local/xbin/su",
+ "/data/local/bin/su", "/system/sd/xbin/su",
+ "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"};
+ for (String path : paths) {
+ if (new File(path).exists()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static boolean checkRootMethod3() {
+ Process process = null;
+ try {
+ process = Runtime.getRuntime().exec(new String[]{"/system/xbin/which", "su"});
+ BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ if (in.readLine() != null) {
+ return true;
+ }
+ return false;
+ } catch (Throwable t) {
+ return false;
+ } finally {
+ if (process != null) {
+ process.destroy();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/tools/TaskPoolHelper.java b/app/src/main/java/com/lechange/demo/tools/TaskPoolHelper.java
new file mode 100644
index 0000000..1fdf3c5
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/tools/TaskPoolHelper.java
@@ -0,0 +1,103 @@
+package com.lechange.demo.tools;
+
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.locks.LockSupport;
+
+public class TaskPoolHelper {
+ private final static String TAG = "lcop_TaskPoolHelper";
+
+ /**
+ * 构造具备过滤的task
+ */
+ public static abstract class RunnableTask implements Runnable {
+ public String mTaskID;
+
+ public RunnableTask(String taskID){
+ this.mTaskID = taskID;
+ }
+ }
+
+ //private static ExecutorService mPool = Executors.newFixedThreadPool(3);
+ //队列属性的task
+ private static ArrayBlockingQueue mQueueTask = new ArrayBlockingQueue(50);
+ private static List mFilteTask = new ArrayList();
+ private static Thread mQueueThread;
+
+ //实时属性的task
+ private static RunnableTask mRealTask; //=null
+ private static Thread mRealThread;
+
+ static {
+ mQueueThread = new Thread() {
+ @Override
+ public void run() {
+ // TODO Auto-generated method stub
+ super.run();
+ while (true) {
+ try {
+ //自带阻塞光环
+ RunnableTask task = mQueueTask.take();
+ task.run();
+ mFilteTask.remove(task.mTaskID);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ };
+ mQueueThread.start();
+
+ mRealThread = new Thread() {
+ @Override
+ public void run() {
+ // TODO Auto-generated method stub
+ super.run();
+ while (true) {
+ if (mRealTask == null) {
+ LockSupport.park();
+ } else {
+ RunnableTask task = mRealTask;
+ mRealTask = null;
+ task.run();
+ }
+ }
+ }
+ };
+ mRealThread.start();
+ }
+
+
+ public static void addTask(RunnableTask task) {
+ //过滤
+ if (task.mTaskID.equals("real")) {
+ mRealTask = task;
+ LockSupport.unpark(mRealThread);
+ return;
+ }
+ if (mFilteTask.contains(task.mTaskID)) {
+ return;
+ }
+
+ try {
+ mQueueTask.add(task);
+ mFilteTask.add(task.mTaskID);
+ } catch(IllegalStateException e) {
+ LogUtil.debugLog(TAG, e.getMessage());
+ mQueueTask.clear();
+ mFilteTask.clear();
+ }
+ }
+
+
+
+ public static void clearTask(){
+ mQueueTask.clear();
+ mFilteTask.clear();
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceCloudRecordListFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceCloudRecordListFragment.java
new file mode 100644
index 0000000..8bfc4ac
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceCloudRecordListFragment.java
@@ -0,0 +1,416 @@
+package com.lechange.demo.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceRecordService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.CloudRecordsData;
+import com.common.openapi.entity.DeleteCloudRecordsData;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.RecordListData;
+import com.common.openapi.entity.RecordsData;
+import com.lechange.demo.adapter.DeviceRecordListAdapter;
+import com.lechange.demo.tools.DateHelper;
+import com.lechange.demo.tools.DialogUtils;
+import com.lechange.demo.view.LcPullToRefreshRecyclerView;
+import com.lechange.pulltorefreshlistview.Mode;
+import com.lechange.pulltorefreshlistview.PullToRefreshBase;
+import com.mm.android.deviceaddmodule.mobilecommon.dialog.LCAlertDialog;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.TimeUtils;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.UIUtils;
+import com.yonsz.z1.R;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+public class DeviceCloudRecordListFragment extends Fragment implements View.OnClickListener, IGetDeviceInfoCallBack.IDeviceCloudRecordCallBack, IGetDeviceInfoCallBack.IDeviceDeleteRecordCallBack, PullToRefreshBase.OnRefreshListener2 {
+ private static final String TAG = DeviceCloudRecordListFragment.class.getSimpleName();
+ private Bundle arguments;
+ private String searchDate;
+ private long searchDate1;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private RecyclerView recyclerView;
+ private TextView tvMonthDay;
+ private DeviceRecordService deviceRecordService = ClassInstanceManager.newInstance().getDeviceRecordService();
+ private List recordListDataList = new ArrayList<>();
+ private DeviceRecordListAdapter deviceRecordListAdapter;
+ private long oneDay = 24 * 60 * 60 * 1000;
+ private static DeviceCloudRecordListFragment fragment;
+ private DeviceRecordListActivity deviceRecordListActivity;
+ private boolean editStatus = false;
+ private TextView tvDelete;
+ private List recordRegionIds = new ArrayList<>();
+ private LcPullToRefreshRecyclerView deviceList;
+ private int pageSize = 30;
+ private long nextRecordId = -1;
+ private LCAlertDialog mLCAlertDialog;
+ private TextView tvToday;
+
+ public static DeviceCloudRecordListFragment newInstance() {
+ fragment = new DeviceCloudRecordListFragment();
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ arguments = getArguments();
+ searchDate = DateHelper.dateFormat(new Date(System.currentTimeMillis()));
+ searchDate1 = DateHelper.parseMills(searchDate + " 00:00:00");
+ deviceRecordListActivity = (DeviceRecordListActivity) getActivity();
+ deviceRecordListActivity.llEdit.setOnClickListener(this);
+ deviceRecordListActivity.llAll.setOnClickListener(this);
+ deviceRecordListActivity.llEdit.setVisibility(View.GONE);
+ deviceRecordListActivity.llAll.setVisibility(View.GONE);
+ deviceRecordListActivity.llBack.setVisibility(View.VISIBLE);
+ }
+
+ public void deleteCloudRecord() {
+ if (!isAdded()) {
+ return;
+ }
+ initCloudRecord(false);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_cloud_list, container, false);
+ }
+
+ @Override
+ public void onHiddenChanged(boolean hidden) {
+ super.onHiddenChanged(hidden);
+ if (!hidden) {
+// deviceRecordListActivity.llEdit.setVisibility(View.VISIBLE);
+ deviceRecordListActivity.llAll.setVisibility(editStatus ? View.VISIBLE : View.GONE);
+ deviceRecordListActivity.llBack.setVisibility(editStatus ? View.GONE : View.VISIBLE);
+ } else {
+ deviceRecordListActivity.llEdit.setVisibility(View.GONE);
+ deviceRecordListActivity.llAll.setVisibility(View.GONE);
+ deviceRecordListActivity.llBack.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ initView(view);
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ if (deviceListBean == null) {
+ return;
+ }
+ initData();
+ }
+
+ private ImageView mNextDayTv;
+
+ private void initView(View view) {
+ view.findViewById(R.id.iv_day_pre).setOnClickListener(this);
+ mNextDayTv = view.findViewById(R.id.iv_day_next);
+ tvDelete = view.findViewById(R.id.tv_delete);
+ tvMonthDay = view.findViewById(R.id.tv_month_day);
+ deviceList = view.findViewById(R.id.record_list);
+ tvToday = view.findViewById(R.id.tv_today);
+ deviceList.setOnRefreshListener(this);
+ mNextDayTv.setOnClickListener(this);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ refreshMode(Mode.PULL_FROM_START);
+ refreshState(true);
+ }
+ }, 200);
+ recyclerView = deviceList.getRefreshableView();
+ tvDelete.setOnClickListener(this);
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
+ linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ recyclerView.setLayoutManager(linearLayoutManager);
+ }
+
+ private void refreshState(boolean refresh) {
+ if (refresh) {
+ deviceList.setRefreshing(true);
+ } else {
+ deviceList.onRefreshComplete();
+ }
+ }
+
+ private void refreshMode(Mode mode) {
+ deviceList.setMode(mode);
+ }
+
+ private void initData() {
+ tvMonthDay.setText(searchDate);
+ mCalendar.setTime(TimeUtils.stringToDate(searchDate, "yyyy-MM-dd HH:mm:ss"));
+ UIUtils.setEnabledEX(TimeUtils.isBeforeToday(mCalendar), mNextDayTv);
+ }
+
+ protected Calendar mCalendar = Calendar.getInstance();
+
+ private void initCloudRecord(boolean isLoadMore) {
+ if (isLoadMore) {
+ nextRecordId = nextRecordId;
+ } else {
+ nextRecordId = -1;
+ time = "";
+ recordListDataList.clear();
+ }
+ DialogUtils.show(getActivity());
+ getCloudData();
+ /* deviceRecordService.queryCloudUse(deviceListBean.deviceId, deviceListBean.channels.get(deviceListBean.checkedChannel).channelId, new IGetDeviceInfoCallBack.ICommon() {
+ @Override
+ public void onCommonBack(Integer response) {
+ if (response==-1||response==0){
+ DialogUtils.dismiss();
+ refreshState(false);
+ editStatus(false);
+ tvToday.setVisibility(View.VISIBLE);
+ tvToday.setText(getActivity().getResources().getString(R.string.lc_demo_device_cloud_not_open));
+ }else{
+ getCloudData();
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Toast.makeText(getActivity(),throwable.getMessage(),Toast.LENGTH_SHORT).show();
+ }
+ });*/
+ }
+
+ private void getCloudData() {
+ CloudRecordsData cloudRecordsData = new CloudRecordsData();
+ cloudRecordsData.data.deviceId = deviceListBean.deviceId;
+ cloudRecordsData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ cloudRecordsData.data.beginTime = searchDate + " 00:00:00";
+ cloudRecordsData.data.endTime = searchDate + " 23:59:59";
+ cloudRecordsData.data.nextRecordId = nextRecordId;
+ cloudRecordsData.data.count = pageSize;
+ deviceRecordService.getCloudRecords(cloudRecordsData, this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.iv_day_pre) {
+ searchDate1 = searchDate1 - oneDay;
+ searchDate = DateHelper.dateFormat(new Date(searchDate1));
+ tvMonthDay.setText(searchDate);
+ mCalendar.setTime(new Date(searchDate1));
+ UIUtils.setEnabledEX(TimeUtils.isBeforeToday(mCalendar), mNextDayTv);
+ initCloudRecord(false);
+ } else if (id == R.id.tv_delete) {
+ recordRegionIds.clear();
+ for (RecordListData recordListData : recordListDataList) {
+ for (RecordsData recordsData : recordListData.recordsData) {
+ if (recordsData.check) {
+ recordRegionIds.add(recordsData.recordRegionId);
+ }
+ }
+ }
+ if (recordRegionIds.size() == 0) {
+ return;
+ }
+ LCAlertDialog.Builder builder = new LCAlertDialog.Builder(getContext());
+ builder.setTitle(R.string.lc_demo_device_delete_sure);
+ builder.setMessage("");
+ builder.setCancelButton(com.mm.android.deviceaddmodule.R.string.common_cancel, null);
+ builder.setConfirmButton(com.mm.android.deviceaddmodule.R.string.common_confirm,
+ new LCAlertDialog.OnClickListener() {
+ @Override
+ public void onClick(LCAlertDialog dialog, int which, boolean isChecked) {
+ //删除
+ DialogUtils.show(getActivity());
+ DeleteCloudRecordsData deleteCloudRecordsData = new DeleteCloudRecordsData();
+ deleteCloudRecordsData.data.recordRegionIds = recordRegionIds;
+ deviceRecordService.deleteCloudRecords(deleteCloudRecordsData, DeviceCloudRecordListFragment.this);
+ }
+ });
+
+ mLCAlertDialog = builder.create();
+ mLCAlertDialog.show(getActivity().getSupportFragmentManager(), "delete");
+ } else if (id == R.id.iv_day_next) {
+ searchDate1 = searchDate1 + oneDay;
+ searchDate = DateHelper.dateFormat(new Date(searchDate1));
+ tvMonthDay.setText(searchDate);
+ mCalendar.setTime(new Date(searchDate1));
+ UIUtils.setEnabledEX(TimeUtils.isBeforeToday(mCalendar), mNextDayTv);
+ initCloudRecord(false);
+ } else if (id == R.id.ll_edit) {
+ editStatus(!editStatus);
+ if (editStatus && recordListDataList.size() <= 0) {
+ return;
+ }
+ for (RecordListData recordListData : recordListDataList) {
+ for (RecordsData recordsData : recordListData.recordsData) {
+ recordsData.check = false;
+ }
+ }
+ deviceRecordListAdapter.notifyDataSetChanged();
+ } else if (id == R.id.ll_all) {
+ if (recordListDataList.size() <= 0) {
+ return;
+ }
+ for (RecordListData recordListData : recordListDataList) {
+ for (RecordsData recordsData : recordListData.recordsData) {
+ recordsData.check = true;
+ }
+ }
+ deviceRecordListAdapter.notifyDataSetChanged();
+ }
+ }
+
+ @Override
+ public void deviceCloudRecord(CloudRecordsData.Response result) {
+ if (!isAdded()) {
+ return;
+ }
+ tvToday.setVisibility(View.GONE);
+ recyclerView.setVisibility(View.VISIBLE);
+ DialogUtils.dismiss();
+ refreshState(false);
+ editStatus(false);
+ if (result != null && result.data != null && result.data.records != null && result.data.records.size() > 0) {
+ if (result.data.records.size() >= pageSize) {
+ refreshMode(Mode.BOTH);
+ nextRecordId = Long.parseLong(result.data.records.get(result.data.records.size() - 1).recordId);
+ } else {
+ refreshMode(Mode.PULL_FROM_START);
+ }
+ recordListDataList = dealCloudRecord(result);
+ } else {
+ if (nextRecordId == -1) {
+ tvToday.setVisibility(View.VISIBLE);
+ recyclerView.setVisibility(View.GONE);
+ }
+ refreshMode(Mode.PULL_FROM_START);
+ }
+ showList();
+ }
+
+ private void editStatus(boolean b) {
+ editStatus = b;
+ tvDelete.setVisibility(editStatus ? View.VISIBLE : View.GONE);
+ deviceRecordListActivity.tvEdit.setText(editStatus ? getResources().getString(R.string.lc_demo_device_record_edit_finish) : getResources().getString(R.string.lc_demo_device_record_edit));
+ deviceRecordListActivity.llAll.setVisibility(editStatus ? View.VISIBLE : View.GONE);
+ deviceRecordListActivity.llBack.setVisibility(editStatus ? View.GONE : View.VISIBLE);
+ }
+
+ @Override
+ public void deleteDeviceRecord() {
+ if (!isAdded()) {
+ return;
+ }
+ DialogUtils.dismiss();
+ initCloudRecord(false);
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ if (!isAdded()) {
+ return;
+ }
+ LogUtil.errorLog(TAG, "error", throwable);
+ DialogUtils.dismiss();
+ refreshState(false);
+ refreshMode(Mode.PULL_FROM_START);
+ Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ nextRecordId = -1;
+ time = "";
+ recordListDataList.clear();
+ editStatus(false);
+ showList();
+ }
+
+ private void showList() {
+ if (deviceRecordListAdapter == null) {
+ deviceRecordListAdapter = new DeviceRecordListAdapter(getContext(), recordListDataList);
+ recyclerView.setAdapter(deviceRecordListAdapter);
+ } else {
+ deviceRecordListAdapter.notifyDataSetChanged();
+ }
+ deviceRecordListAdapter.setEditClickListener(new DeviceRecordListAdapter.EditClickListener() {
+ @Override
+ public void edit(int outPosition, int innerPosition) {
+ LogUtil.debugLog(TAG, outPosition + "..." + innerPosition);
+ if (editStatus) {
+ recordListDataList.get(outPosition).recordsData.get(innerPosition).check = !recordListDataList.get(outPosition).recordsData.get(innerPosition).check;
+ deviceRecordListAdapter.notifyDataSetChanged();
+ } else {
+ Bundle bundle = new Bundle();
+ bundle.putSerializable(MethodConst.ParamConst.deviceDetail, deviceListBean);
+ bundle.putSerializable(MethodConst.ParamConst.recordData, recordListDataList.get(outPosition).recordsData.get(innerPosition));
+ bundle.putInt(MethodConst.ParamConst.recordType, MethodConst.ParamConst.recordTypeCloud);
+ Intent intent = new Intent(getContext(), DeviceRecordPlayActivity.class);
+ intent.putExtras(bundle);
+ startActivityForResult(intent, 0);
+ }
+ }
+ });
+ }
+
+ String time = "";
+
+ private List dealCloudRecord(CloudRecordsData.Response result) {
+ for (CloudRecordsData.ResponseData.RecordsBean recordsBean : result.data.records) {
+ String innerTime = recordsBean.beginTime.substring(11, 13);
+ RecordsData a = new RecordsData();
+ a.recordType = 0;
+ a.recordId = recordsBean.recordId;
+ a.deviceId = recordsBean.deviceId;
+ a.channelID = recordsBean.channelId;
+ a.beginTime = recordsBean.beginTime;
+ a.endTime = recordsBean.endTime;
+ a.size = recordsBean.size;
+ a.thumbUrl = recordsBean.thumbUrl;
+ a.encryptMode = recordsBean.encryptMode;
+ a.recordRegionId = recordsBean.recordRegionId;
+ a.type = recordsBean.type;
+ if (!innerTime.equals(time)) {
+ RecordListData r = new RecordListData();
+ r.period = innerTime + ":00";
+ r.recordsData = new ArrayList<>();
+ r.recordsData.add(a);
+ recordListDataList.add(r);
+ time = innerTime;
+ } else {
+ RecordListData b = recordListDataList.get(recordListDataList.size() - 1);
+ b.recordsData.add(a);
+ }
+ }
+ LogUtil.debugLog(TAG, recordListDataList.size() + "");
+ return recordListDataList;
+ }
+
+ @Override
+ public void onPullDownToRefresh(PullToRefreshBase pullToRefreshBase) {
+ initCloudRecord(false);
+ }
+
+ @Override
+ public void onPullUpToRefresh(PullToRefreshBase pullToRefreshBase) {
+ initCloudRecord(true);
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceDetailDeploymentFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceDetailDeploymentFragment.java
new file mode 100644
index 0000000..09846e5
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceDetailDeploymentFragment.java
@@ -0,0 +1,138 @@
+package com.lechange.demo.ui;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceDetailService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeviceAlarmStatusData;
+import com.common.openapi.entity.DeviceChannelInfoData;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.lechange.demo.tools.DialogUtils;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.yonsz.z1.R;
+import com.yonsz.z1.mine.mydevice.DeviceDetailActivity;
+
+public class DeviceDetailDeploymentFragment extends Fragment implements IGetDeviceInfoCallBack.IDeviceChannelInfoCallBack, View.OnClickListener, IGetDeviceInfoCallBack.IDeviceAlarmStatusCallBack {
+ private static final String TAG = DeviceDetailDeploymentFragment.class.getSimpleName();
+ private Bundle arguments;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private DeviceDetailLCActivity deviceDetailActivity;
+ private ImageView ivMoveCheck;
+ private int alarmStatus;
+
+ public static DeviceDetailDeploymentFragment newInstance() {
+ DeviceDetailDeploymentFragment fragment = new DeviceDetailDeploymentFragment();
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ DeviceDetailLCActivity deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.llOperate.setVisibility(View.GONE);
+ arguments = getArguments();
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_detail_deployment, container, false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ initView(view);
+ deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.tvTitle.setText(getResources().getString(R.string.lc_demo_device_deployment_title));
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ if (deviceListBean == null) {
+ return;
+ }
+ initData();
+ }
+
+ private void initView(View view) {
+ ivMoveCheck = view.findViewById(R.id.iv_move_check);
+ ivMoveCheck.setOnClickListener(this);
+ }
+
+ private void initData() {
+ //获取动检状态/设备详情
+ DialogUtils.show(getActivity());
+ DeviceDetailService deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ DeviceChannelInfoData deviceChannelInfoData = new DeviceChannelInfoData();
+ deviceChannelInfoData.data.deviceId = deviceListBean.deviceId;
+ deviceChannelInfoData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ deviceDetailService.bindDeviceChannelInfo(deviceChannelInfoData, this);
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ @Override
+ public void deviceChannelInfo(DeviceChannelInfoData.Response result) {
+ if (!isAdded()){
+ return;
+ }
+ DialogUtils.dismiss();
+ this.alarmStatus = result.data.alarmStatus;
+ if (result.data.alarmStatus == 1) {
+ ivMoveCheck.setImageDrawable(getResources().getDrawable(R.mipmap.lc_demo_switch_on));
+ } else {
+ ivMoveCheck.setImageDrawable(getResources().getDrawable(R.mipmap.lc_demo_switch_off));
+ }
+ }
+
+ @Override
+ public void deviceAlarmStatus(boolean result) {
+ if (!isAdded()){
+ return;
+ }
+ DialogUtils.dismiss();
+ this.alarmStatus = (this.alarmStatus == 1) ? 0 : 1;
+ if (this.alarmStatus == 1) {
+ ivMoveCheck.setImageDrawable(getResources().getDrawable(R.mipmap.lc_demo_switch_on));
+ } else {
+ ivMoveCheck.setImageDrawable(getResources().getDrawable(R.mipmap.lc_demo_switch_off));
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ if (!isAdded()){
+ return;
+ }
+ DialogUtils.dismiss();
+ LogUtil.errorLog(TAG, "error", throwable);
+ Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onClick(View v) {
+ //设置动检状态
+ DialogUtils.show(getActivity());
+ DeviceDetailService deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ DeviceAlarmStatusData deviceAlarmStatusData = new DeviceAlarmStatusData();
+ deviceAlarmStatusData.data.deviceId = deviceListBean.deviceId;
+ deviceAlarmStatusData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ //现在是开启状态,则关闭,反之
+ deviceAlarmStatusData.data.enable = alarmStatus == 1 ? false : true;
+ deviceDetailService.modifyDeviceAlarmStatus(deviceAlarmStatusData, this);
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceDetailLCActivity.java b/app/src/main/java/com/lechange/demo/ui/DeviceDetailLCActivity.java
new file mode 100644
index 0000000..ce18fb3
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceDetailLCActivity.java
@@ -0,0 +1,109 @@
+package com.lechange.demo.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.mm.android.deviceaddmodule.device_wifi.DeviceConstant;
+import com.yonsz.z1.R;
+
+import static com.yonsz.z1.net.Constans.CAMERA_TAG;
+import static com.yonsz.z1.net.Constans.CAT_EYE;
+
+public class DeviceDetailLCActivity extends AppCompatActivity implements View.OnClickListener, IGetDeviceInfoCallBack.IModifyDeviceName {
+
+ public LinearLayout llOperate;
+ public LinearLayout llBack;
+ public TextView tvTitle;
+ public RelativeLayout rlTitle;
+ public FrameLayout frContent;
+ public RelativeLayout rlLoading;
+ private Bundle bundle;
+ private String name;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_device_detail_lc);
+ initView();
+ initData();
+ gotoDetailMainPage();
+ }
+
+ private void initData() {
+ bundle = getIntent().getExtras();
+ }
+
+ private void initView() {
+ llOperate = findViewById(R.id.ll_operate);
+ llBack = findViewById(R.id.ll_back);
+ tvTitle = findViewById(R.id.tv_title);
+ rlTitle = findViewById(R.id.rl_title);
+ frContent = findViewById(R.id.fr_content);
+ rlLoading = findViewById(R.id.rl_loading);
+ llOperate.setOnClickListener(this);
+ llBack.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.ll_back) {
+ goBack();
+ } else if (id == R.id.ll_operate) {
+
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ goBack();
+ }
+
+ private void goBack() {
+ if (llOperate != null) {
+ llOperate.setVisibility(View.GONE);
+ }
+ if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
+ getSupportFragmentManager().popBackStack();
+ } else {
+ if (!TextUtils.isEmpty(name)) {
+ Intent intent = new Intent();
+ intent.putExtra(DeviceConstant.IntentKey.DHDEVICE_NEW_NAME, name);
+ setResult(100, intent);
+ }
+ finish();
+ }
+ }
+
+ public void gotoDetailMainPage() {
+ if (getIntent().getExtras().get("deviceType").equals(CAMERA_TAG) || getIntent().getExtras().get("deviceType").equals(CAT_EYE)) {
+ DeviceDetailMainFragment fragment = DeviceDetailMainFragment.newInstance();
+ fragment.setArguments(bundle);
+ fragment.setModifyNameListener(this);
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+ transaction.add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ } else {
+ DeviceDetailLockFragment fragment = DeviceDetailLockFragment.newInstance();
+ fragment.setArguments(bundle);
+ fragment.setModifyNameListener(this);
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+ transaction.add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+ }
+
+ @Override
+ public void deviceName(String newName) {
+ name = newName;
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceDetailLockFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceDetailLockFragment.java
new file mode 100644
index 0000000..51cd2f3
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceDetailLockFragment.java
@@ -0,0 +1,727 @@
+package com.lechange.demo.ui;
+
+import android.content.Intent;
+import android.graphics.drawable.BitmapDrawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSON;
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceDetailService;
+import com.common.openapi.DeviceLocalCacheService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.DeviceLocalCacheData;
+import com.common.openapi.entity.DeviceUnBindData;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.tools.DialogUtils;
+import com.lechange.demo.tools.MediaPlayHelper;
+import com.lechange.demo.yonsz.RecoverSDCardActivity;
+import com.mm.android.deviceaddmodule.LCDeviceEngine;
+import com.mm.android.deviceaddmodule.device_wifi.CurWifiInfo;
+import com.mm.android.deviceaddmodule.device_wifi.DeviceConstant;
+import com.mm.android.deviceaddmodule.mobilecommon.entity.device.DHDevice;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.yonsz.z1.R;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.database.entity.entity4.DeviceSimpleEntity;
+import com.yonsz.z1.database.entity.entity5.BaseVersion5Entity;
+import com.yonsz.z1.database.entity.entitya2.SafeVoiceEntity;
+import com.yonsz.z1.gateway.AddLCSafeCompleteActivity;
+import com.yonsz.z1.gateway.UnlockRecordActivity;
+import com.yonsz.z1.mine.aboutversion.customview.ConfirmDialog;
+import com.yonsz.z1.mine.aboutversion.feature.Callback;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.net.NetWorkUrl;
+import com.yonsz.z1.net.NetWorkUtil;
+import com.yonsz.z1.utils.AddressNameUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.utils.ToastUtil;
+import com.yonsz.z1.version4.DeviceControlActivity;
+import com.yonsz.z1.version5.ChooseA1AddDeviceActivity;
+import com.yonsz.z1.version5.ChooseA1OrUnbindActivity;
+import com.yonsz.z1.version5.ModifyRoomActivity;
+import com.yonsz.z1.version5.model.ModelBindActivity;
+
+import java.io.Serializable;
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+
+import de.greenrobot.event.EventBus;
+
+import static android.app.Activity.RESULT_OK;
+import static com.mm.android.deviceaddmodule.device_wifi.DeviceConstant.IntentCode.DEVICE_SETTING_WIFI_LIST;
+import static com.yonsz.z1.net.Constans.CAMERA_TAG;
+import static com.yonsz.z1.net.Constans.CHECK_USER_BIND_FAIL;
+import static com.yonsz.z1.net.Constans.DELLIGHT_ENTITY_SUCCESS;
+import static com.yonsz.z1.net.Constans.GET_SWITCHER_CHANGE_INFO;
+import static com.yonsz.z1.net.Constans.GET_USERDEVICES4_SIMPLEINFO_FAIL;
+import static com.yonsz.z1.net.Constans.GET_USERDEVICES4_SIMPLEINFO_SUCCESS;
+import static com.yonsz.z1.net.Constans.INTELLIGENT_DOOR_LOCK;
+import static com.yonsz.z1.net.Constans.MODEL_REAPEAT;
+import static com.yonsz.z1.net.Constans.MODIFY_DEVICE_NAME;
+import static com.yonsz.z1.net.Constans.SELECT_SAFETY_DETAIL_FAIL;
+import static com.yonsz.z1.net.Constans.SELECT_SAFETY_DETAIL_SUCCESS;
+import static com.yonsz.z1.net.Constans.SEND_UPDATEVOICE_CONTROL_FAIL;
+import static com.yonsz.z1.net.Constans.SEND_UPDATEVOICE_CONTROL_SUCCESS;
+import static com.yonsz.z1.net.Constans.SWITCH_TAG;
+import static com.yonsz.z1.net.Constans.UPDATE_BLINDENTITY_NAME_FAIL;
+import static com.yonsz.z1.net.NetWorkUrl.MODIFY_ALARM_STATUS;
+import static com.yonsz.z1.net.NetWorkUrl.SUBSET_GETDETAIL;
+import static com.yonsz.z1.net.NetWorkUrl.UNBIND_DEVICE;
+
+public class DeviceDetailLockFragment extends Fragment implements View.OnClickListener, IGetDeviceInfoCallBack.IUnbindDeviceCallBack, IGetDeviceInfoCallBack.IDeviceCacheCallBack, IGetDeviceInfoCallBack.IModifyDeviceName {
+ private static final String TAG = DeviceDetailLockFragment.class.getSimpleName();
+ private RelativeLayout rlDeviceDetail;
+ private RelativeLayout rlDetailVersion;
+ private RelativeLayout rlDeployment;
+ private RelativeLayout rlDetele;
+ private TextView tvDeviceName;
+ private ImageView ivDevicePic;
+ private TextView tvDeviceVersion;
+ private Bundle arguments;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private DeviceDetailLCActivity deviceDetailActivity;
+ private DeviceDetailService deviceDetailService;
+ private CurWifiInfo wifiInfo;
+ private TextView tvCurrentWifi;
+ private RelativeLayout rlCurWifi;
+ private IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener;
+ private String fromWhere;
+
+ private TextView tv_device_address, tv_electric, tv_bind_ai, tv_safe_model, localStageTv;
+ private String devicePosition = "1";
+ private String deviceId;
+ private RelativeLayout rl_device_storage, unlockRecordRl, rl_bind_ai, safeModelRl;
+ private UIHandle mHandler;
+ private String bindZiId = "";
+ private String modelId = "", modelName = "";
+ private int modelDelay = -1;
+ private String autoCloseAfterTrigger = "true";
+ private CheckBox mCheckBox;
+
+ public static DeviceDetailLockFragment newInstance() {
+ DeviceDetailLockFragment fragment = new DeviceDetailLockFragment();
+ return fragment;
+ }
+
+ public void onEventMainThread(EventBusEntity event) {
+ subsetGetDetail();
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.llOperate.setVisibility(View.GONE);
+ EventBus.getDefault().register(this);
+ arguments = getArguments();
+ mHandler = new UIHandle(this);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_detail_lock, container, false);
+ }
+
+ public void setModifyNameListener(IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener) {
+ this.modifyNameListener = modifyNameListener;
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ rlDeviceDetail = view.findViewById(R.id.rl_device_detail);
+ rlDetailVersion = view.findViewById(R.id.rl_detail_version);
+ rlDeployment = view.findViewById(R.id.rl_deployment);
+ rlDetele = view.findViewById(R.id.rl_detele);
+ tvDeviceName = view.findViewById(R.id.tv_device_name);
+ ivDevicePic = view.findViewById(R.id.iv_device_pic);
+ tvDeviceVersion = view.findViewById(R.id.tv_device_version);
+ tvCurrentWifi = view.findViewById(R.id.tv_current_wifi);
+ rlCurWifi = view.findViewById(R.id.rl_cur_wifi);
+ localStageTv = (TextView) view.findViewById(R.id.tv_local_stage);
+ tv_device_address = (TextView) view.findViewById(R.id.tv_device_address);
+ tv_electric = (TextView) view.findViewById(R.id.tv_electric);
+ tv_bind_ai = (TextView) view.findViewById(R.id.tv_bind_ai);
+ tv_safe_model = (TextView) view.findViewById(R.id.tv_safe_model);
+ rl_device_storage = (RelativeLayout) view.findViewById(R.id.rl_device_storage);
+ unlockRecordRl = (RelativeLayout) view.findViewById(R.id.rl_unlock_record);
+ safeModelRl = (RelativeLayout) view.findViewById(R.id.rl_safe_model);
+ rl_bind_ai = (RelativeLayout) view.findViewById(R.id.rl_bind_ai);
+ mCheckBox = (CheckBox) view.findViewById(R.id.cb_device_defence);
+
+ rlDeployment.setOnClickListener(this);
+ rlDetele.setOnClickListener(this);
+ rlDeviceDetail.setOnClickListener(this);
+ rlCurWifi.setOnClickListener(this);
+ tv_device_address.setOnClickListener(this);
+ rl_device_storage.setOnClickListener(this);
+ unlockRecordRl.setOnClickListener(this);
+ rl_bind_ai.setOnClickListener(this);
+ mCheckBox.setOnClickListener(this);
+ safeModelRl.setOnClickListener(this);
+ DeviceDetailLCActivity deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.tvTitle.setText(getResources().getString(R.string.lc_demo_device_detail_title));
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ //不为空 列表页跳转
+ fromWhere = arguments.getString(MethodConst.ParamConst.fromList);
+ if (deviceListBean == null) {
+ return;
+ }
+ deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 1) {
+ //多通道
+ if (MethodConst.ParamConst.fromList.equals(fromWhere)) {
+ //设备详情
+ tvDeviceName.setText(deviceListBean.name);
+ tvDeviceVersion.setText(deviceListBean.version);
+ rlDeployment.setVisibility(View.GONE);
+ rlCurWifi.setVisibility(View.VISIBLE);
+ //设备才能获取WIFI
+ getCurrentWifiInfo();
+ } else {
+ //通道详情
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ getDeviceLocalCache();
+ rlDetailVersion.setVisibility(View.GONE);
+ rlCurWifi.setVisibility(View.GONE);
+ rlDetele.setVisibility(View.GONE);
+ }
+ } else if (deviceListBean.channels != null && deviceListBean.channels.size() == 1) {
+ //单通道
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ getDeviceLocalCache();
+ tvDeviceVersion.setText(deviceListBean.version);
+ if (deviceListBean.deviceSource == 2) {
+ rlDetele.setVisibility(View.GONE);
+ }
+ rlCurWifi.setVisibility(View.VISIBLE);
+ //设备才能获取WIFI
+ getCurrentWifiInfo();
+ } else {
+ //多通道但是没有挂载通道
+ //设备详情
+ tvDeviceName.setText(deviceListBean.name);
+ tvDeviceVersion.setText(deviceListBean.version);
+ rlDeployment.setVisibility(View.GONE);
+ if (deviceListBean.ability.contains("WLAN")) {
+ rlCurWifi.setVisibility(View.VISIBLE);
+ //设备才能获取WIFI
+ getCurrentWifiInfo();
+ } else {
+ rlCurWifi.setVisibility(View.GONE);
+ }
+
+ }
+ if (deviceListBean.channels != null && deviceListBean.channels.size() == 0) {
+ if ("offline".equals(deviceListBean.status)) {
+ rlCurWifi.setVisibility(View.GONE);
+ } else {
+ rlDetailVersion.setOnClickListener(this);
+ }
+ } else {
+ if (deviceListBean.channels != null && "offline".equals(deviceListBean.channels.get(deviceListBean.checkedChannel).status)) {
+ rlCurWifi.setVisibility(View.GONE);
+ } else {
+ rlDetailVersion.setOnClickListener(this);
+ }
+ }
+
+
+ deviceId = getActivity().getIntent().getExtras().get("deviceId").toString();
+ devicePosition = getActivity().getIntent().getExtras().get("addressId").toString();
+ tv_device_address.setText(AddressNameUtil.getAddressName(devicePosition));
+
+ subsetGetDetail();
+ }
+
+ /**
+ * 获取设备缓存信息
+ */
+ private void getDeviceLocalCache() {
+ DeviceLocalCacheData deviceLocalCacheData = new DeviceLocalCacheData();
+ deviceLocalCacheData.setDeviceId(deviceListBean.deviceId);
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ deviceLocalCacheData.setChannelId(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId);
+ }
+ DeviceLocalCacheService deviceLocalCacheService = ClassInstanceManager.newInstance().getDeviceLocalCacheService();
+ deviceLocalCacheService.findLocalCache(deviceLocalCacheData, this);
+ }
+
+ private void getCurrentWifiInfo() {
+ //设备才能获取WIFI
+ DialogUtils.show(getActivity());
+ deviceDetailService.currentDeviceWifi(deviceListBean.deviceId, new IGetDeviceInfoCallBack.IDeviceCurrentWifiInfoCallBack() {
+ @Override
+ public void deviceCurrentWifiInfo(CurWifiInfo curWifiInfo) {
+ DialogUtils.dismiss();
+ if (!isAdded() || curWifiInfo == null) {
+ return;
+ }
+ rlCurWifi.setVisibility(View.VISIBLE);
+ if (curWifiInfo.isLinkEnable()) {
+ wifiInfo = curWifiInfo;
+ tvCurrentWifi.setText(wifiInfo.getSsid());
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ DialogUtils.dismiss();
+ }
+ });
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ public void gotoModifyNamePage(FragmentActivity fragmentActivity) {
+ if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
+ return;
+ }
+ DeviceDetailNameFragment fragment = DeviceDetailNameFragment.newInstance();
+ fragment.setArguments(arguments);
+ fragment.setModifyNameListener(this);
+ FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
+ transaction.hide(this).add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+
+ public void gotoUpdatePage(FragmentActivity fragmentActivity) {
+ if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
+ return;
+ }
+ DeviceDetailVersionFragment fragment = DeviceDetailVersionFragment.newInstance();
+ fragment.setArguments(arguments);
+ FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
+ transaction.hide(this).add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+
+ public void gotoDeploymentPage(FragmentActivity fragmentActivity) {
+ if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
+ return;
+ }
+ DeviceDetailDeploymentFragment fragment = DeviceDetailDeploymentFragment.newInstance();
+ fragment.setArguments(arguments);
+ FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
+ transaction.hide(this).add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.rl_device_detail) {
+ gotoModifyNamePage(getActivity());
+ } else if (id == R.id.rl_cur_wifi) {
+ DHDevice device = new DHDevice();
+ device.setDeviceId(deviceListBean.deviceId);
+ device.setName(deviceListBean.name);
+ device.setStatus(deviceListBean.status);
+ LCDeviceEngine.newInstance().deviceOnlineChangeNet(getActivity(), device, wifiInfo);
+ } else if (id == R.id.rl_deployment) {
+ gotoDeploymentPage(getActivity());
+ } else if (id == R.id.rl_detail_version) {
+ gotoUpdatePage(getActivity());
+ } else if (id == R.id.rl_detele) {
+ //解绑设备
+ /* deviceDetailActivity.rlLoading.setVisibility(View.VISIBLE);
+ DeviceDetailService deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ *//* DeviceUnBindData deviceUnBindData = new DeviceUnBindData();
+ deviceUnBindData.data.deviceId = deviceListBean.deviceId;
+ deviceDetailService.unBindDevice(deviceUnBindData, this);*//*
+ deviceDetailService.deletePermission(deviceListBean.deviceId, null, this);*/
+ ConfirmDialog dialog = new ConfirmDialog(getContext(), new Callback() {
+ @Override
+ public void callback(int position1) {
+ switch (position1) {
+ case 0:
+ break;
+ case 1:
+ unBindDevice();
+ break;
+ }
+ }
+ });
+ dialog.setContent(R.string.sure_delete_device);
+ dialog.setCancleBtn(R.string.cancel);
+ dialog.setSureBtn(R.string.sure);
+ dialog.setCancelable(false);
+ dialog.show();
+ } else if (id == R.id.tv_device_address) {
+ Intent intent2;
+ intent2 = new Intent(getActivity(), ModifyRoomActivity.class);
+ intent2.putExtra("deviceId", deviceId);
+ intent2.putExtra("ziId", "");
+ intent2.putExtra("deviceType", CAMERA_TAG);
+ intent2.putExtra("deviceModel", "1");
+ intent2.putExtra("deviceAddress", devicePosition);
+ intent2.putExtra("addressId", devicePosition);
+ startActivityForResult(intent2, GET_SWITCHER_CHANGE_INFO);
+ } else if (id == R.id.rl_device_storage) {
+ Intent intent = new Intent(getContext(), RecoverSDCardActivity.class);
+ intent.putExtra("UUID", deviceListBean.deviceId);
+ startActivity(intent);
+ }
+ switch (id) {
+ case R.id.rl_bind_ai:
+ getAideviceList(INTELLIGENT_DOOR_LOCK);
+ break;
+ case R.id.cb_camera_reverse:
+
+ break;
+ case R.id.rl_unlock_record:
+ Intent intent = new Intent(getContext(), UnlockRecordActivity.class);
+ intent.putExtra("deviceId", deviceListBean.deviceId);
+ startActivity(intent);
+ break;
+ case R.id.rl_safe_model:
+ intent = new Intent(getContext(), ModelBindActivity.class);
+ intent.putExtra("modelId", modelId);
+ intent.putExtra("modelDelay", modelDelay);
+ intent.putExtra("modelName", modelName);
+ intent.putExtra("autoCloseAfterTrigger", autoCloseAfterTrigger);
+ intent.putExtra("deviceId", getActivity().getIntent().getExtras().get("id").toString());
+ intent.putExtra("deviceType", INTELLIGENT_DOOR_LOCK);
+ intent.putExtra("deviceModel", "1");
+ startActivityForResult(intent, MODEL_REAPEAT);
+ break;
+ case R.id.cb_device_defence:
+ if (mCheckBox.isChecked()) {
+ mCheckBox.setChecked(false);
+ subseSetVoice("1");
+ } else {
+ mCheckBox.setChecked(true);
+ subseSetVoice("0");
+ }
+ break;
+
+ }
+ }
+
+ @Override
+ public void unBindDevice(boolean result) {
+ if (!isAdded()) {
+ return;
+ }
+ DeviceUnBindData deviceUnBindData = new DeviceUnBindData();
+ deviceUnBindData.data.deviceId = deviceListBean.deviceId;
+ deviceDetailService.unBindDevice(deviceUnBindData, this);
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ Toast.makeText(getContext(), getResources().getString(R.string.lc_demo_device_unbind_success), Toast.LENGTH_SHORT).show();
+ Intent intent = new Intent();
+ intent.putExtra(DeviceConstant.IntentKey.DHDEVICE_UNBIND, true);
+ deviceDetailActivity.setResult(RESULT_OK, intent);
+ deviceDetailActivity.finish();
+ }
+
+ @Override
+ public void deviceCache(DeviceLocalCacheData deviceLocalCacheData) {
+ if (!isAdded()) {
+ return;
+ }
+ BitmapDrawable bitmapDrawable = MediaPlayHelper.picDrawable(deviceLocalCacheData.getPicPath());
+ if (bitmapDrawable != null) {
+ ivDevicePic.setImageDrawable(bitmapDrawable);
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ if (!isAdded()) {
+ return;
+ }
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ LogUtil.errorLog(TAG, "error", throwable);
+ if (!"null point".equals(throwable.getMessage()) && isAdded()) {
+ Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == DEVICE_SETTING_WIFI_LIST && resultCode == RESULT_OK && data != null) {
+ CurWifiInfo curWifiInfo = (CurWifiInfo) data.getSerializableExtra(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO);
+ if (curWifiInfo != null) {
+ wifiInfo = curWifiInfo;
+ tvCurrentWifi.setText(wifiInfo.getSsid());
+ }
+ }
+ switch (requestCode) {
+ case GET_SWITCHER_CHANGE_INFO:
+ case MODIFY_DEVICE_NAME:
+ if (data != null && data.getExtras().get("addressId") != null) {
+ String addressId = data.getExtras().get("addressId").toString();
+ tv_device_address.setText(AddressNameUtil.getAddressName(addressId));
+ }
+ break;
+ }
+ }
+
+
+ @Override
+ public void deviceName(String newName) {
+ tvDeviceName.setText(newName);
+ //多通道设备详情
+ if (deviceListBean.channels.size() == 0 || (deviceListBean.channels.size() > 1 && MethodConst.ParamConst.fromList.equals(fromWhere))) {
+ deviceListBean.name = newName;
+ } else {
+ deviceListBean.channels.get(deviceListBean.checkedChannel).channelName = newName;
+ }
+ if (modifyNameListener != null) {
+ modifyNameListener.deviceName(newName);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ EventBus.getDefault().unregister(this);
+ }
+
+ private void subsetGetDetail() {
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", getActivity().getIntent().getExtras().get("id").toString());
+ map.put("deviceModel", "1");
+ map.put("deviceType", INTELLIGENT_DOOR_LOCK);
+ map.put("ziId", "");
+ netWorkUtil.requestGetByAsy(SUBSET_GETDETAIL, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ ToastUtil.i("subsetGetDetail", "onSuccess()" + respone);
+ SafeVoiceEntity obj = JSON.parseObject(respone, SafeVoiceEntity.class);
+ if (1 == obj.getFlag()) {
+ Message msg = mHandler.obtainMessage(SELECT_SAFETY_DETAIL_SUCCESS);
+ msg.obj = obj;
+ mHandler.sendMessage(msg);
+ } else {
+ Message msg = mHandler.obtainMessage(SELECT_SAFETY_DETAIL_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ Message msg = mHandler.obtainMessage(SELECT_SAFETY_DETAIL_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ private void unBindDevice() {
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", deviceId);
+ netWorkUtil.requestPostByAsynewApi(UNBIND_DEVICE, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("unBindDevice", "onSuccess()" + respone);
+ BaseVersion5Entity obj = JSON.parseObject(respone, BaseVersion5Entity.class);
+ if (1 == obj.getFlag()) {
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("2"));
+ getActivity().finish();
+ } else {
+ Message msg = mHandler.obtainMessage(SEND_UPDATEVOICE_CONTROL_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ Message msg = mHandler.obtainMessage(SEND_UPDATEVOICE_CONTROL_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ private void getAideviceList(String deviceTypeCode) {
+ NetWorkUtil util = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ map.put("standardCodes", "A1-L,A2-L,D1-L,B1-L,B3-L,B3-L-A");
+ map.put("deviceType", deviceTypeCode);
+ util.requestGetByAsy(NetWorkUrl.DEIVCE_AIDEVICE_LIST, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ // Log.i("getZ1Info", "MainFragment4 onSuccess()" + respone);
+ ToastUtil.i("getAideviceList", respone);
+ DeviceSimpleEntity entity = JSON.parseObject(respone, DeviceSimpleEntity.class);
+ if (1 == entity.getFlag()) {
+ Message msg = mHandler.obtainMessage(GET_USERDEVICES4_SIMPLEINFO_SUCCESS);
+ msg.obj = entity;
+ msg.arg1 = 0;
+ mHandler.sendMessage(msg);
+ } else {
+ Message msg = mHandler.obtainMessage(GET_USERDEVICES4_SIMPLEINFO_FAIL);
+ msg.obj = entity.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ Message msg = mHandler.obtainMessage();
+ msg.what = GET_USERDEVICES4_SIMPLEINFO_FAIL;
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ //handler
+ private static class UIHandle extends Handler {
+ WeakReference weakReference;
+
+ public UIHandle(DeviceDetailLockFragment activity) {
+ weakReference = new WeakReference(activity);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ DeviceDetailLockFragment activity = weakReference.get();
+ activity.callBackUiThread(msg);
+ }
+ }
+
+ private void callBackUiThread(Message msg) {
+ switch (msg.what) {
+ case GET_USERDEVICES4_SIMPLEINFO_SUCCESS:
+ DeviceSimpleEntity simpleEntity = (DeviceSimpleEntity) msg.obj;
+ if (simpleEntity.getData().size() != 0) {
+ Intent intent = new Intent(getContext(), ChooseA1OrUnbindActivity.class);
+ Bundle bundle = new Bundle();
+ bundle.putSerializable("dataBeanList", (Serializable) simpleEntity.getData());
+ intent.putExtras(bundle);
+ intent.putExtra("addressId", devicePosition);
+ intent.putExtra("deviceType", INTELLIGENT_DOOR_LOCK);
+ intent.putExtra("deviceModel", "1");
+ intent.putExtra("deviceId", getActivity().getIntent().getExtras().get("id").toString());
+ intent.putExtra("subType", "0");
+ intent.putExtra("ziId", bindZiId);
+ startActivityForResult(intent, MODIFY_DEVICE_NAME);
+ } else {
+ ToastUtil.show(getContext(), "暂无可绑定的语音管家");
+ }
+ break;
+ case SELECT_SAFETY_DETAIL_SUCCESS:
+ SafeVoiceEntity voiceEntity = (SafeVoiceEntity) msg.obj;
+ SafeVoiceEntity.DataBean.ThirdInfoBean.ElectricitysBean electricitysBean = voiceEntity.getData().getThirdInfo().getElectricitys().get(0);
+ tv_electric.setText("碱性电池" + electricitysBean.getAlkElec() + "%、" + "锂电池" + electricitysBean.getLitElec() + "%");
+ bindZiId = voiceEntity.getData().getTarget().getZiId();
+ tv_bind_ai.setText(voiceEntity.getData().getThirdInfo().getGatewayName());
+ if (null != voiceEntity.getData().getModeTrigger()) {
+ if (!voiceEntity.getData().getModeTrigger().getAutoCloseAfterTrigger().isEmpty()) {
+ autoCloseAfterTrigger = voiceEntity.getData().getModeTrigger().getAutoCloseAfterTrigger();
+ }
+ modelId = voiceEntity.getData().getModeTrigger().getModeId();
+ modelDelay = voiceEntity.getData().getModeTrigger().getValidTimeAfter();
+ modelName = voiceEntity.getData().getModeTrigger().getModeName();
+ tv_safe_model.setText(modelName);
+ if (null != voiceEntity.getData().getTarget()) {
+ if (voiceEntity.getData().getTarget().isModeTriggerFlag()) {
+ mCheckBox.setChecked(true);
+ mCheckBox.setVisibility(View.VISIBLE);
+ localStageTv.setText("场景联动开");
+ } else {
+ mCheckBox.setChecked(false);
+ mCheckBox.setVisibility(View.VISIBLE);
+ localStageTv.setText("场景联动关");
+ }
+ }
+ } else {
+ modelName = "";
+ modelDelay = 0;
+ tv_safe_model.setText(" 设置您需要联动的场景模式");
+ }
+ break;
+ case SEND_UPDATEVOICE_CONTROL_SUCCESS:
+ String obj1 = (String) msg.obj;
+ if (obj1.equals("1")) {
+ mCheckBox.setChecked(true);
+ mCheckBox.setVisibility(View.VISIBLE);
+ localStageTv.setText("场景联动开");
+ } else {
+ mCheckBox.setChecked(false);
+ mCheckBox.setVisibility(View.VISIBLE);
+ localStageTv.setText("场景联动关");
+ }
+ break;
+ case SEND_UPDATEVOICE_CONTROL_FAIL:
+ case SELECT_SAFETY_DETAIL_FAIL:
+ case CHECK_USER_BIND_FAIL:
+ ToastUtil.show(getContext(), (String) msg.obj);
+ break;
+ }
+ }
+
+ private void subseSetVoice(final String flag) {
+ NetWorkUtil util = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", getActivity().getIntent().getExtras().get("id").toString());
+ map.put("deviceModel", "1");
+ map.put("deviceType", INTELLIGENT_DOOR_LOCK);
+ map.put("modeTriggerFlag", flag);
+ map.put("ziId", "");
+ util.requestPostByAsyBody(NetWorkUrl.SUBSET_SETMODETRIGGERFLAG, map, "{}", new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("subseSetVoice", "ShareDeviceActivity onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ Message msg = mHandler.obtainMessage(SEND_UPDATEVOICE_CONTROL_SUCCESS);
+ msg.obj = flag;
+ mHandler.sendMessage(msg);
+ } else {
+ Message msg = mHandler.obtainMessage(CHECK_USER_BIND_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ Message msg = mHandler.obtainMessage(CHECK_USER_BIND_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceDetailMainFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceDetailMainFragment.java
new file mode 100644
index 0000000..fa4eb43
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceDetailMainFragment.java
@@ -0,0 +1,691 @@
+package com.lechange.demo.ui;
+
+import android.content.Intent;
+import android.graphics.drawable.BitmapDrawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSON;
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceDetailService;
+import com.common.openapi.DeviceLocalCacheService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.DeviceLocalCacheData;
+import com.common.openapi.entity.DeviceUnBindData;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.tools.DialogUtils;
+import com.lechange.demo.tools.MediaPlayHelper;
+import com.lechange.demo.yonsz.CameraDetailActivity;
+import com.lechange.demo.yonsz.RecoverSDCardActivity;
+import com.mm.android.deviceaddmodule.LCDeviceEngine;
+import com.mm.android.deviceaddmodule.device_wifi.CurWifiInfo;
+import com.mm.android.deviceaddmodule.device_wifi.DeviceConstant;
+import com.mm.android.deviceaddmodule.mobilecommon.entity.device.DHDevice;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.yonsz.z1.R;
+import com.yonsz.z1.createfamily.floor.ChooseRoomInFloorActivity;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.database.entity.entity5.BaseVersion5Entity;
+import com.yonsz.z1.mine.aboutversion.customview.ConfirmDialog;
+import com.yonsz.z1.mine.aboutversion.feature.Callback;
+import com.yonsz.z1.mine.mydevice.DeviceDetailActivity;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.net.NetWorkUrl;
+import com.yonsz.z1.net.NetWorkUtil;
+import com.yonsz.z1.utils.AddressNameUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.utils.ToastUtil;
+import com.yonsz.z1.version4.fragment.FanA2Fragment;
+import com.yonsz.z1.version5.ModifyRoomActivity;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+
+import de.greenrobot.event.EventBus;
+
+import static android.app.Activity.RESULT_OK;
+import static com.mm.android.deviceaddmodule.device_wifi.DeviceConstant.IntentCode.DEVICE_SETTING_WIFI_LIST;
+import static com.yonsz.z1.net.Constans.CAMERA_TAG;
+import static com.yonsz.z1.net.Constans.CHECK_USER_BIND_FAIL;
+import static com.yonsz.z1.net.Constans.GET_SWITCHER_CHANGE_INFO;
+import static com.yonsz.z1.net.Constans.INTELLIGENT_DOOR_LOCK;
+import static com.yonsz.z1.net.Constans.MODIFY_ALARM_STATUS_SUCCESS;
+import static com.yonsz.z1.net.Constans.MODIFY_DEVICE_NAME;
+import static com.yonsz.z1.net.Constans.SEND_UPDATEVOICE_CONTROL_FAIL;
+import static com.yonsz.z1.net.Constans.deviceNumListPosition;
+import static com.yonsz.z1.net.Constans.homeListEntity;
+import static com.yonsz.z1.net.NetWorkUrl.MODIFY_ALARM_STATUS;
+import static com.yonsz.z1.net.NetWorkUrl.UNBIND_DEVICE;
+
+public class DeviceDetailMainFragment extends Fragment implements View.OnClickListener, IGetDeviceInfoCallBack.IUnbindDeviceCallBack, IGetDeviceInfoCallBack.IDeviceCacheCallBack, IGetDeviceInfoCallBack.IModifyDeviceName {
+ private static final String TAG = DeviceDetailMainFragment.class.getSimpleName();
+ private RelativeLayout rlDeviceDetail;
+ private RelativeLayout rlDetailVersion;
+ private RelativeLayout rlDeployment;
+ private RelativeLayout rlDetele;
+ private TextView tvDeviceName;
+ private ImageView ivDevicePic;
+ private TextView tvDeviceVersion;
+ private Bundle arguments;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private DeviceDetailLCActivity deviceDetailActivity;
+ private DeviceDetailService deviceDetailService;
+ private CurWifiInfo wifiInfo;
+ private TextView tvCurrentWifi;
+ private RelativeLayout rlCurWifi;
+ private IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener;
+ private String fromWhere;
+ private LinearLayout ll_fanren;
+
+ private TextView tv_device_address;
+ private String devicePosition = "1";
+ private String deviceId, deviceType = CAMERA_TAG;
+ private RelativeLayout rl_device_storage;
+ private CheckBox cb_camera_reverse, cb_device_light, cb_device_alarm;
+ private UIHandle mHandler;
+
+ public static DeviceDetailMainFragment newInstance() {
+ DeviceDetailMainFragment fragment = new DeviceDetailMainFragment();
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.llOperate.setVisibility(View.GONE);
+ arguments = getArguments();
+ mHandler = new UIHandle(this);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_detail_main, container, false);
+ }
+
+ public void setModifyNameListener(IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener) {
+ this.modifyNameListener = modifyNameListener;
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ ll_fanren = view.findViewById(R.id.ll_fanren);
+ rlDeviceDetail = view.findViewById(R.id.rl_device_detail);
+ rlDetailVersion = view.findViewById(R.id.rl_detail_version);
+ rlDeployment = view.findViewById(R.id.rl_deployment);
+ rlDetele = view.findViewById(R.id.rl_detele);
+ tvDeviceName = view.findViewById(R.id.tv_device_name);
+ ivDevicePic = view.findViewById(R.id.iv_device_pic);
+ tvDeviceVersion = view.findViewById(R.id.tv_device_version);
+ tvCurrentWifi = view.findViewById(R.id.tv_current_wifi);
+ rlCurWifi = view.findViewById(R.id.rl_cur_wifi);
+ cb_camera_reverse = (CheckBox) view.findViewById(R.id.cb_camera_reverse);
+ cb_device_light = (CheckBox) view.findViewById(R.id.cb_device_light);
+ cb_device_alarm = (CheckBox) view.findViewById(R.id.cb_device_alarm);
+ tv_device_address = (TextView) view.findViewById(R.id.tv_device_address);
+ rl_device_storage = (RelativeLayout) view.findViewById(R.id.rl_device_storage);
+
+ rlDeployment.setOnClickListener(this);
+ rlDetele.setOnClickListener(this);
+ rlDeviceDetail.setOnClickListener(this);
+ rlCurWifi.setOnClickListener(this);
+ tv_device_address.setOnClickListener(this);
+ rl_device_storage.setOnClickListener(this);
+ cb_camera_reverse.setOnClickListener(this);
+ cb_device_light.setOnClickListener(this);
+ cb_device_alarm.setOnClickListener(this);
+ DeviceDetailLCActivity deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.tvTitle.setText(getResources().getString(R.string.lc_demo_device_detail_title));
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ //不为空 列表页跳转
+ fromWhere = arguments.getString(MethodConst.ParamConst.fromList);
+ if (deviceListBean == null) {
+ return;
+ }
+ deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 1) {
+ //多通道
+ if (MethodConst.ParamConst.fromList.equals(fromWhere)) {
+ //设备详情
+ tvDeviceName.setText(deviceListBean.name);
+ tvDeviceVersion.setText(deviceListBean.version);
+ rlDeployment.setVisibility(View.GONE);
+ rlCurWifi.setVisibility(View.VISIBLE);
+ //设备才能获取WIFI
+ getCurrentWifiInfo();
+ } else {
+ //通道详情
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ getDeviceLocalCache();
+ rlDetailVersion.setVisibility(View.GONE);
+ rlCurWifi.setVisibility(View.GONE);
+ rlDetele.setVisibility(View.GONE);
+ }
+ } else if (deviceListBean.channels != null && deviceListBean.channels.size() == 1) {
+ //单通道
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ getDeviceLocalCache();
+ tvDeviceVersion.setText(deviceListBean.version);
+ if (deviceListBean.deviceSource == 2) {
+ rlDetele.setVisibility(View.GONE);
+ }
+ rlCurWifi.setVisibility(View.VISIBLE);
+ //设备才能获取WIFI
+ getCurrentWifiInfo();
+ } else {
+ //多通道但是没有挂载通道
+ //设备详情
+ tvDeviceName.setText(deviceListBean.name);
+ tvDeviceVersion.setText(deviceListBean.version);
+ rlDeployment.setVisibility(View.GONE);
+ if (deviceListBean.ability.contains("WLAN")) {
+ rlCurWifi.setVisibility(View.VISIBLE);
+ //设备才能获取WIFI
+ getCurrentWifiInfo();
+ } else {
+ rlCurWifi.setVisibility(View.GONE);
+ }
+
+ }
+ if (deviceListBean.channels != null && deviceListBean.channels.size() == 0) {
+ if ("offline".equals(deviceListBean.status)) {
+ rlCurWifi.setVisibility(View.GONE);
+ } else {
+ rlDetailVersion.setOnClickListener(this);
+ }
+ } else {
+ if (deviceListBean.channels != null && "offline".equals(deviceListBean.channels.get(deviceListBean.checkedChannel).status)) {
+ rlCurWifi.setVisibility(View.GONE);
+ } else {
+ rlDetailVersion.setOnClickListener(this);
+ }
+ }
+
+
+ deviceType = getActivity().getIntent().getExtras().get("deviceType").toString();
+ deviceId = getActivity().getIntent().getExtras().get("deviceId").toString();
+ devicePosition = getActivity().getIntent().getExtras().get("addressId").toString();
+ tv_device_address.setText(AddressNameUtil.getAddressName(devicePosition));
+
+ if (deviceType.equals(CAMERA_TAG)) {
+
+ } else {
+ ll_fanren.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * 获取设备缓存信息
+ */
+ private void getDeviceLocalCache() {
+ DeviceLocalCacheData deviceLocalCacheData = new DeviceLocalCacheData();
+ deviceLocalCacheData.setDeviceId(deviceListBean.deviceId);
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ deviceLocalCacheData.setChannelId(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId);
+ }
+ DeviceLocalCacheService deviceLocalCacheService = ClassInstanceManager.newInstance().getDeviceLocalCacheService();
+ deviceLocalCacheService.findLocalCache(deviceLocalCacheData, this);
+ }
+
+ private void getCurrentWifiInfo() {
+ //设备才能获取WIFI
+ DialogUtils.show(getActivity());
+ deviceDetailService.currentDeviceWifi(deviceListBean.deviceId, new IGetDeviceInfoCallBack.IDeviceCurrentWifiInfoCallBack() {
+ @Override
+ public void deviceCurrentWifiInfo(CurWifiInfo curWifiInfo) {
+ DialogUtils.dismiss();
+ if (!isAdded() || curWifiInfo == null) {
+ return;
+ }
+ rlCurWifi.setVisibility(View.VISIBLE);
+ if (curWifiInfo.isLinkEnable()) {
+ wifiInfo = curWifiInfo;
+ tvCurrentWifi.setText(wifiInfo.getSsid());
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ DialogUtils.dismiss();
+ }
+ });
+
+ //获取设备指示灯状态
+ breathingLightStatus();
+ //获取摄像头翻转状态
+ frameReverseStatus();
+ //获取报警消息提醒
+ getAlarmStatus();
+ }
+
+ private synchronized void breathingLightStatus() {
+ Business.getInstance().breathingLightStatus(deviceListBean.deviceId, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ final int arg1 = msg.arg1;
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (arg1 == 1) {
+ cb_device_light.setChecked(true);
+ } else {
+ cb_device_light.setChecked(false);
+ }
+ }
+ });
+
+ } else {
+ }
+ }
+ });
+ }
+
+ private synchronized void frameReverseStatus() {
+ Business.getInstance().frameReverseStatus(deviceListBean.deviceId, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ final int obj = msg.arg1;
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (obj == 1) {
+ cb_camera_reverse.setChecked(true);
+ } else {
+ cb_camera_reverse.setChecked(false);
+ }
+ }
+ });
+ } else {
+
+ }
+ }
+ });
+ }
+
+ private void getAlarmStatus() {
+
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ public void gotoModifyNamePage(FragmentActivity fragmentActivity) {
+ if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
+ return;
+ }
+ DeviceDetailNameFragment fragment = DeviceDetailNameFragment.newInstance();
+ fragment.setArguments(arguments);
+ fragment.setModifyNameListener(this);
+ FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
+ transaction.hide(this).add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+
+ public void gotoUpdatePage(FragmentActivity fragmentActivity) {
+ if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
+ return;
+ }
+ DeviceDetailVersionFragment fragment = DeviceDetailVersionFragment.newInstance();
+ fragment.setArguments(arguments);
+ FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
+ transaction.hide(this).add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+
+ public void gotoDeploymentPage(FragmentActivity fragmentActivity) {
+ if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
+ return;
+ }
+ DeviceDetailDeploymentFragment fragment = DeviceDetailDeploymentFragment.newInstance();
+ fragment.setArguments(arguments);
+ FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
+ transaction.hide(this).add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.rl_device_detail) {
+ gotoModifyNamePage(getActivity());
+ } else if (id == R.id.rl_cur_wifi) {
+ DHDevice device = new DHDevice();
+ device.setDeviceId(deviceListBean.deviceId);
+ device.setName(deviceListBean.name);
+ device.setStatus(deviceListBean.status);
+ LCDeviceEngine.newInstance().deviceOnlineChangeNet(getActivity(), device, wifiInfo);
+ } else if (id == R.id.rl_deployment) {
+ gotoDeploymentPage(getActivity());
+ } else if (id == R.id.rl_detail_version) {
+ gotoUpdatePage(getActivity());
+ } else if (id == R.id.rl_detele) {
+ /*//解绑设备
+ deviceDetailActivity.rlLoading.setVisibility(View.VISIBLE);
+ DeviceDetailService deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ *//* DeviceUnBindData deviceUnBindData = new DeviceUnBindData();
+ deviceUnBindData.data.deviceId = deviceListBean.deviceId;
+ deviceDetailService.unBindDevice(deviceUnBindData, this);*//*
+ deviceDetailService.deletePermission(deviceListBean.deviceId, null, this);*/
+// subsetDelete();
+ ConfirmDialog dialog = new ConfirmDialog(getContext(), new Callback() {
+ @Override
+ public void callback(int position1) {
+ switch (position1) {
+ case 0:
+ break;
+ case 1:
+ unBindDevice();
+ break;
+ }
+ }
+ });
+ dialog.setContent(R.string.sure_delete_device);
+ dialog.setCancleBtn(R.string.cancel);
+ dialog.setSureBtn(R.string.sure);
+ dialog.setCancelable(false);
+ dialog.show();
+ } else if (id == R.id.tv_device_address) {
+ Intent intent2;
+ intent2 = new Intent(getActivity(), ModifyRoomActivity.class);
+ intent2.putExtra("deviceId", deviceId);
+ intent2.putExtra("ziId", "");
+ intent2.putExtra("deviceType", deviceType);
+ intent2.putExtra("deviceModel", "0");
+ intent2.putExtra("deviceAddress", devicePosition);
+ intent2.putExtra("addressId", devicePosition);
+ startActivityForResult(intent2, GET_SWITCHER_CHANGE_INFO);
+ } else if (id == R.id.rl_device_storage) {
+ Intent intent = new Intent(getContext(), RecoverSDCardActivity.class);
+ intent.putExtra("UUID", deviceListBean.deviceId);
+ startActivity(intent);
+ }
+ switch (id) {
+ case R.id.cb_camera_reverse:
+ if (cb_camera_reverse.isChecked()) {
+ modifyFrameReverseStatus("reverse");
+ } else {
+ modifyFrameReverseStatus("normal");
+ }
+ break;
+ case R.id.cb_device_light:
+ if (cb_device_light.isChecked()) {
+ modifyBreathingLight("on");
+ } else {
+ modifyBreathingLight("off");
+ }
+ break;
+ case R.id.cb_device_alarm:
+ if (cb_device_alarm.isChecked()) {
+ modifyAlarmStatus("1");
+ } else {
+ modifyAlarmStatus("0");
+ }
+ break;
+ }
+ }
+
+ @Override
+ public void unBindDevice(boolean result) {
+ if (!isAdded()) {
+ return;
+ }
+ DeviceUnBindData deviceUnBindData = new DeviceUnBindData();
+ deviceUnBindData.data.deviceId = deviceListBean.deviceId;
+ deviceDetailService.unBindDevice(deviceUnBindData, this);
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ Toast.makeText(getContext(), getResources().getString(R.string.lc_demo_device_unbind_success), Toast.LENGTH_SHORT).show();
+ Intent intent = new Intent();
+ intent.putExtra(DeviceConstant.IntentKey.DHDEVICE_UNBIND, true);
+ deviceDetailActivity.setResult(RESULT_OK, intent);
+ deviceDetailActivity.finish();
+ }
+
+ @Override
+ public void deviceCache(DeviceLocalCacheData deviceLocalCacheData) {
+ if (!isAdded()) {
+ return;
+ }
+ BitmapDrawable bitmapDrawable = MediaPlayHelper.picDrawable(deviceLocalCacheData.getPicPath());
+ if (bitmapDrawable != null) {
+ ivDevicePic.setImageDrawable(bitmapDrawable);
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ if (!isAdded()) {
+ return;
+ }
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ LogUtil.errorLog(TAG, "error", throwable);
+ if (!"null point".equals(throwable.getMessage()) && isAdded()) {
+ Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == DEVICE_SETTING_WIFI_LIST && resultCode == RESULT_OK && data != null) {
+ CurWifiInfo curWifiInfo = (CurWifiInfo) data.getSerializableExtra(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO);
+ if (curWifiInfo != null) {
+ wifiInfo = curWifiInfo;
+ tvCurrentWifi.setText(wifiInfo.getSsid());
+ }
+ }
+ switch (requestCode) {
+ case GET_SWITCHER_CHANGE_INFO:
+ case MODIFY_DEVICE_NAME:
+ if (data != null && data.getExtras().get("addressId") != null) {
+ String addressId = data.getExtras().get("addressId").toString();
+ tv_device_address.setText(AddressNameUtil.getAddressName(addressId));
+ }
+ break;
+ }
+ }
+
+ private void modifyFrameReverseStatus(String state) {
+ Business.getInstance().modifyFrameReverseStatus(state, deviceListBean.deviceId, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(
+ getContext(),
+ "修改成功",
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(
+ getContext(),
+ "修改失败",
+ Toast.LENGTH_SHORT).show();
+
+ }
+ }
+ });
+ }
+
+ private void modifyBreathingLight(String state) {
+ Business.getInstance().modifyBreathingLight(state, deviceListBean.deviceId, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(
+ getContext(),
+ "修改成功",
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(
+ getContext(),
+ "修改失败",
+ Toast.LENGTH_SHORT).show();
+
+ }
+ }
+ });
+ }
+
+ private void modifyAlarmStatus(String state) {
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ // map.put("deviceId", "4K0586CPAJ58121");
+ map.put("deviceId", deviceListBean.deviceId);
+ map.put("alarmStatus", state);
+ netWorkUtil.requestPostByAsynewApi(MODIFY_ALARM_STATUS, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("modifyAlarmStatus", "onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(
+ getContext(),
+ "修改报警消息提醒成功",
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+ } else {
+
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+
+ }
+ });
+ }
+
+ @Override
+ public void deviceName(String newName) {
+ tvDeviceName.setText(newName);
+ //多通道设备详情
+ if (deviceListBean.channels.size() == 0 || (deviceListBean.channels.size() > 1 && MethodConst.ParamConst.fromList.equals(fromWhere))) {
+ deviceListBean.name = newName;
+ } else {
+ deviceListBean.channels.get(deviceListBean.checkedChannel).channelName = newName;
+ }
+ if (modifyNameListener != null) {
+ modifyNameListener.deviceName(newName);
+ }
+ }
+
+ private void unBindDevice() {
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", deviceId);
+ netWorkUtil.requestPostByAsynewApi(UNBIND_DEVICE, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("unBindDevice", "onSuccess()" + respone);
+ BaseVersion5Entity obj = JSON.parseObject(respone, BaseVersion5Entity.class);
+ if (1 == obj.getFlag()) {
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("2"));
+ getActivity().finish();
+ } else {
+ Message msg = mHandler.obtainMessage(SEND_UPDATEVOICE_CONTROL_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ Message msg = mHandler.obtainMessage(SEND_UPDATEVOICE_CONTROL_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ private void subsetDelete() {
+ NetWorkUtil util = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", deviceId);
+ map.put("deviceModel", "0");
+ map.put("deviceType", deviceType);
+ map.put("ziId", "");
+ util.requestPostByAsyBody(NetWorkUrl.SUBSET_DELETE, map, "{}", new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("subsetDelete", "ShareDeviceActivity onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ getActivity().finish();
+ }
+ });
+ } else {
+
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+
+ }
+ });
+ }
+
+ //handler
+ private static class UIHandle extends Handler {
+ WeakReference weakReference;
+
+ public UIHandle(DeviceDetailMainFragment activity) {
+ weakReference = new WeakReference(activity);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ DeviceDetailMainFragment activity = weakReference.get();
+ activity.callBackUiThread(msg);
+ }
+ }
+
+ private void callBackUiThread(Message msg) {
+ switch (msg.what) {
+ case SEND_UPDATEVOICE_CONTROL_FAIL:
+ ToastUtil.show(getContext(), (String) msg.obj);
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceDetailModifyNameFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceDetailModifyNameFragment.java
new file mode 100644
index 0000000..8d08a40
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceDetailModifyNameFragment.java
@@ -0,0 +1,185 @@
+package com.lechange.demo.ui;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceDetailService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.DeviceModifyNameData;
+import com.mm.android.deviceaddmodule.helper.DeviceAddHelper;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.NameLengthFilter;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.WordInputFilter;
+import com.mm.android.deviceaddmodule.mobilecommon.widget.ClearEditText;
+import com.yonsz.z1.R;
+import com.yonsz.z1.mine.mydevice.DeviceDetailActivity;
+
+public class DeviceDetailModifyNameFragment extends Fragment implements View.OnClickListener, IGetDeviceInfoCallBack.IModifyDeviceCallBack {
+ private static final String TAG = DeviceDetailModifyNameFragment.class.getSimpleName();
+ private Bundle arguments;
+ private ClearEditText newName;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private DeviceDetailLCActivity deviceDetailActivity;
+ private final int MAXLETHER = 40;
+ private IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener;
+ private String name;
+ private String fromWhere;
+
+ public static DeviceDetailModifyNameFragment newInstance() {
+ DeviceDetailModifyNameFragment fragment = new DeviceDetailModifyNameFragment();
+ return fragment;
+ }
+
+ public void setModifyNameListener(IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener) {
+ this.modifyNameListener = modifyNameListener;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ arguments = getArguments();
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ //不为空 列表页跳转
+ fromWhere = arguments.getString(MethodConst.ParamConst.fromList);
+ if (deviceListBean == null) {
+ return;
+ }
+ deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.llOperate.setVisibility(View.VISIBLE);
+ deviceDetailActivity.llOperate.setOnClickListener(this);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_modify_name, container, false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ DeviceDetailLCActivity deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.tvTitle.setText(getResources().getString(R.string.lc_demo_device_detail_title));
+ initView(view);
+ }
+
+ private void initView(View view) {
+ newName = view.findViewById(R.id.et_new_name);
+ if (deviceListBean.channels.size() > 1) {
+ //多通道
+ if (MethodConst.ParamConst.fromList.equals(fromWhere)) {
+ newName.setText(deviceListBean.name);
+ } else {
+ newName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ }
+ } else if (deviceListBean.channels.size() == 1) {
+ newName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ } else {
+ newName.setText(deviceListBean.name);
+ }
+ if (!TextUtils.isEmpty(newName.getText().toString())) {
+ newName.setSelection(newName.getText().toString().length());
+ }
+ newName.setFilters(new InputFilter[]{new WordInputFilter(WordInputFilter.REX_NAME), new NameLengthFilter(MAXLETHER)});
+ newName.addTextChangedListener(mTextWatcher);
+ }
+
+ private final TextWatcher mTextWatcher = new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
+ String devName = s.toString().trim();
+ if (!TextUtils.isEmpty(devName)) {
+ deviceDetailActivity.llOperate.setEnabled(true);
+ newName.removeTextChangedListener(mTextWatcher);
+ String filterDevName = DeviceAddHelper.strDeviceNameFilter(devName);
+ if (!filterDevName.equals(devName)) {
+ newName.setText(filterDevName);
+ newName.setSelection(filterDevName.length());
+ }
+ newName.addTextChangedListener(mTextWatcher);
+ } else {
+ deviceDetailActivity.llOperate.setEnabled(false);
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable arg0) {
+ }
+ };
+
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ @Override
+ public void onClick(View v) {
+ //修改名称
+ deviceDetailActivity.rlLoading.setVisibility(View.VISIBLE);
+ if (newName == null || newName.getText().toString().trim() == null || newName.getText().toString().trim().isEmpty()) {
+ return;
+ }
+ name = newName.getText().toString().trim();
+ DeviceDetailService deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ DeviceModifyNameData deviceModifyNameData = new DeviceModifyNameData();
+ deviceModifyNameData.data.name = name;
+ deviceModifyNameData.data.deviceId = deviceListBean.deviceId;
+ if (deviceListBean.channels.size() > 1 && !MethodConst.ParamConst.fromList.equals(fromWhere)) {
+ //多通道
+ deviceModifyNameData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ }
+ deviceDetailService.modifyDeviceName(deviceModifyNameData, this);
+ }
+
+ @Override
+ public void deviceModify(boolean result) {
+ if (!isAdded()) {
+ return;
+ }
+ deviceDetailActivity.llOperate.setVisibility(View.GONE);
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ Toast.makeText(getContext(), getResources().getString(R.string.lc_demo_device_modify_success), Toast.LENGTH_SHORT).show();
+ if (modifyNameListener != null) {
+ modifyNameListener.deviceName(name);
+ }
+ //多通道设备详情
+ if (deviceListBean.channels.size() == 0 || (deviceListBean.channels.size() > 1 && MethodConst.ParamConst.fromList.equals(fromWhere))) {
+ deviceListBean.name = name;
+ } else {
+ deviceListBean.channels.get(deviceListBean.checkedChannel).channelName = name;
+ }
+ getActivity().getSupportFragmentManager().popBackStack();
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ if (!isAdded()) {
+ return;
+ }
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ LogUtil.errorLog(TAG, "error", throwable);
+ Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceDetailNameFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceDetailNameFragment.java
new file mode 100644
index 0000000..7208d61
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceDetailNameFragment.java
@@ -0,0 +1,128 @@
+package com.lechange.demo.ui;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.yonsz.z1.R;
+
+public class DeviceDetailNameFragment extends Fragment implements View.OnClickListener, IGetDeviceInfoCallBack.IModifyDeviceName {
+ private static final String TAG = DeviceDetailNameFragment.class.getSimpleName();
+ private Bundle arguments;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private DeviceDetailLCActivity deviceDetailActivity;
+ private TextView tvDeviceName;
+ private IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener;
+ private String fromWhere;
+
+ public static DeviceDetailNameFragment newInstance() {
+ DeviceDetailNameFragment fragment = new DeviceDetailNameFragment();
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ arguments = getArguments();
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ //不为空 列表页跳转
+ fromWhere = arguments.getString(MethodConst.ParamConst.fromList);
+ if (deviceListBean == null) {
+ return;
+ }
+ deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.llOperate.setVisibility(View.GONE);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_detail_name, container, false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ DeviceDetailLCActivity deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.tvTitle.setText(getResources().getString(R.string.lc_demo_device_detail_title));
+ initView(view);
+ }
+
+ private void initView(View view) {
+ view.findViewById(R.id.rl_device_modify).setOnClickListener(this);
+ tvDeviceName = view.findViewById(R.id.tv_device_name);
+ RelativeLayout rlDeviceType = view.findViewById(R.id.rl_detail_type);
+ RelativeLayout rlDeviceSerial = view.findViewById(R.id.rl_device_serial);
+ TextView tvDeviceType = view.findViewById(R.id.tv_device_type);
+ TextView tvDeviceSerial = view.findViewById(R.id.tv_device_serial);
+ if (deviceListBean.channels!=null&&deviceListBean.channels.size() > 1) {
+ //多通道
+ if (MethodConst.ParamConst.fromList.equals(fromWhere)) {
+ tvDeviceName.setText(deviceListBean.name);
+ tvDeviceType.setText(deviceListBean.deviceModel);
+ tvDeviceSerial.setText(deviceListBean.deviceId);
+ }else {
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ rlDeviceType.setVisibility(View.GONE);
+ rlDeviceSerial.setVisibility(View.GONE);
+ }
+ } else if (deviceListBean.channels!=null&&deviceListBean.channels.size() == 1){
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ tvDeviceType.setText(deviceListBean.deviceModel);
+ tvDeviceSerial.setText(deviceListBean.deviceId);
+ }else {
+ tvDeviceName.setText(deviceListBean.name);
+ tvDeviceType.setText(deviceListBean.deviceModel);
+ tvDeviceSerial.setText(deviceListBean.deviceId);
+ }
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (getActivity() == null || getActivity().getSupportFragmentManager() == null) {
+ return;
+ }
+ DeviceDetailModifyNameFragment fragment = DeviceDetailModifyNameFragment.newInstance();
+ fragment.setModifyNameListener(this);
+ fragment.setArguments(arguments);
+ FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
+ transaction.hide(this).add(R.id.fr_content, fragment).addToBackStack(null);
+ transaction.commitAllowingStateLoss();
+ }
+
+ public void setModifyNameListener(IGetDeviceInfoCallBack.IModifyDeviceName modifyNameListener) {
+ this.modifyNameListener = modifyNameListener;
+ }
+
+ @Override
+ public void deviceName(String newName) {
+ tvDeviceName.setText(newName);
+ //多通道设备详情
+ if (deviceListBean.channels.size() == 0 ||(deviceListBean.channels.size() > 1 && MethodConst.ParamConst.fromList.equals(fromWhere))) {
+ deviceListBean.name = newName;
+ } else {
+ deviceListBean.channels.get(deviceListBean.checkedChannel).channelName = newName;
+ }
+ if (modifyNameListener != null) {
+ modifyNameListener.deviceName(newName);
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceDetailVersionFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceDetailVersionFragment.java
new file mode 100644
index 0000000..60dc97a
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceDetailVersionFragment.java
@@ -0,0 +1,170 @@
+package com.lechange.demo.ui;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceDetailService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.DeviceVersionListData;
+import com.lechange.demo.dialog.DeviceUpdateDialog;
+import com.lechange.demo.view.LcProgressBar;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.yonsz.z1.R;
+import com.yonsz.z1.mine.mydevice.DeviceDetailActivity;
+
+public class DeviceDetailVersionFragment extends Fragment implements IGetDeviceInfoCallBack.IDeviceVersionCallBack, View.OnClickListener , IGetDeviceInfoCallBack.IDeviceUpdateCallBack {
+ private static final String TAG = DeviceDetailVersionFragment.class.getSimpleName();
+ private Bundle arguments;
+ private LcProgressBar pgUpodate;
+ private TextView tvVersionTip;
+ private LinearLayout llNewVersion;
+ private TextView tvNewVersionTip;
+ private TextView tvNewVersion;
+ private TextView tvDeviceCurrentVersion;
+ private DeviceDetailLCActivity deviceDetailActivity;
+ private DeviceDetailService deviceDetailService;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+
+ public static DeviceDetailVersionFragment newInstance() {
+ DeviceDetailVersionFragment fragment = new DeviceDetailVersionFragment();
+ Bundle args = new Bundle();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.llOperate.setVisibility(View.GONE);
+ arguments = getArguments();
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_version, container, false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ DeviceDetailLCActivity deviceDetailActivity = (DeviceDetailLCActivity) getActivity();
+ deviceDetailActivity.tvTitle.setText(getResources().getString(R.string.lc_demo_device_version_title));
+ initView(view);
+ initData();
+ }
+
+ private void initView(View view) {
+ tvDeviceCurrentVersion = view.findViewById(R.id.tv_device_current_version);
+ tvNewVersion = view.findViewById(R.id.tv_new_version);
+ tvNewVersionTip = view.findViewById(R.id.tv_new_version_tip);
+ llNewVersion = view.findViewById(R.id.ll_new_version);
+ tvVersionTip = view.findViewById(R.id.tv_version_tip);
+ pgUpodate = view.findViewById(R.id.pg_upodate);
+ pgUpodate.setOnClickListener(this);
+ }
+
+ private void initData() {
+ //获取设备版本信息
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ if (deviceListBean == null) {
+ return;
+ }
+ deviceDetailActivity.rlLoading.setVisibility(View.VISIBLE);
+ deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ DeviceVersionListData deviceVersionListData = new DeviceVersionListData();
+ deviceVersionListData.data.deviceIds = deviceListBean.deviceId;
+ deviceDetailService.deviceVersionList(deviceVersionListData, this);
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ @Override
+ public void deviceVersion(DeviceVersionListData.Response responseData) {
+ if (!isAdded()){
+ return;
+ }
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ if (responseData.data == null || responseData.data.deviceVersionList == null || responseData.data.deviceVersionList.size() == 0) {
+ return;
+ }
+ DeviceVersionListData.ResponseData.DeviceVersionListBean deviceVersionListBean = responseData.data.deviceVersionList.get(0);
+ if (deviceVersionListBean == null) {
+ return;
+ }
+ tvDeviceCurrentVersion.setText(deviceVersionListBean.version);
+ if (deviceVersionListBean.getUpgradeInfo() == null) {
+ //已是最新版本
+ llNewVersion.setVisibility(View.GONE);
+ pgUpodate.setVisibility(View.GONE);
+ tvVersionTip.setVisibility(View.VISIBLE);
+ tvVersionTip.setText(getResources().getString(R.string.lc_demo_device_version_new_tip));
+ } else {
+ //需要更新设备
+ llNewVersion.setVisibility(View.VISIBLE);
+ pgUpodate.setVisibility(View.VISIBLE);
+ tvVersionTip.setVisibility(View.GONE);
+ tvNewVersion.setText(deviceVersionListBean.getUpgradeInfo().getVersion());
+ tvNewVersionTip.setText(deviceVersionListBean.getUpgradeInfo().getDescription());
+ }
+ }
+
+ @Override
+ public void deviceUpdate(boolean result) {
+ if (!isAdded()){
+ return;
+ }
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ Toast.makeText(getContext(), getResources().getString(R.string.lc_demo_device_update_success), Toast.LENGTH_SHORT).show();
+ deviceDetailActivity.finish();
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ if (!isAdded()){
+ return;
+ }
+ deviceDetailActivity.rlLoading.setVisibility(View.GONE);
+ LogUtil.errorLog(TAG, "error", throwable);
+ pgUpodate.setText(getResources().getString(R.string.lc_demo_device_update));
+ Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.pg_upodate) {
+ DeviceUpdateDialog deviceUpdateDialog = new DeviceUpdateDialog(getContext());
+ deviceUpdateDialog.setOnOkClickLisenter(new DeviceUpdateDialog.OnOkClickLisenter() {
+ @Override
+ public void OnOK() {
+ deviceDetailActivity.rlLoading.setVisibility(View.VISIBLE);
+ pgUpodate.setText(getResources().getString(R.string.lc_demo_device_updateing));
+ if(deviceDetailService==null){
+ deviceDetailService = ClassInstanceManager.newInstance().getDeviceDetailService();
+ }
+ deviceDetailService.upgradeDevice(deviceListBean.deviceId, DeviceDetailVersionFragment.this);
+ }
+ });
+ deviceUpdateDialog.show();
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceLocalRecordListFragment.java b/app/src/main/java/com/lechange/demo/ui/DeviceLocalRecordListFragment.java
new file mode 100644
index 0000000..253ccda
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceLocalRecordListFragment.java
@@ -0,0 +1,303 @@
+package com.lechange.demo.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceRecordService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.LocalRecordsData;
+import com.common.openapi.entity.RecordListData;
+import com.common.openapi.entity.RecordsData;
+import com.lechange.demo.adapter.DeviceRecordListAdapter;
+import com.lechange.demo.tools.DateHelper;
+import com.lechange.demo.tools.DialogUtils;
+import com.lechange.demo.view.LcPullToRefreshRecyclerView;
+import com.lechange.pulltorefreshlistview.Mode;
+import com.lechange.pulltorefreshlistview.PullToRefreshBase;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.TimeUtils;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.UIUtils;
+import com.yonsz.z1.R;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+public class DeviceLocalRecordListFragment extends Fragment implements View.OnClickListener, IGetDeviceInfoCallBack.IDeviceLocalRecordCallBack, PullToRefreshBase.OnRefreshListener2 {
+ private static final String TAG = DeviceLocalRecordListFragment.class.getSimpleName();
+ private Bundle arguments;
+ private String searchDate;
+ private long searchDate1;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private RecyclerView recyclerView;
+ private TextView tvMonthDay;
+ private long oneDay = 24 * 60 * 60 * 1000;
+ private List recordListDataList = new ArrayList<>();
+ private DeviceRecordListAdapter deviceRecordListAdapter;
+ private DeviceRecordService deviceRecordService = ClassInstanceManager.newInstance().getDeviceRecordService();
+ private static DeviceLocalRecordListFragment fragment;
+ private DeviceRecordListActivity deviceRecordListActivity;
+ private LcPullToRefreshRecyclerView deviceList;
+ private int pageSize = 30;
+ private int pageIndex = 1;
+ private String time = "";
+ private TextView tvToday;
+ private ImageView mNextDayTv;
+ public static DeviceLocalRecordListFragment newInstance() {
+ fragment = new DeviceLocalRecordListFragment();
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ arguments = getArguments();
+ searchDate = DateHelper.dateFormat(new Date(System.currentTimeMillis()));
+ searchDate1 = DateHelper.parseMills(searchDate + " 00:00:00");
+ deviceRecordListActivity = (DeviceRecordListActivity) getActivity();
+ deviceRecordListActivity.llEdit.setVisibility(View.GONE);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_device_cloud_list, container, false);
+ }
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ initView(view);
+ if (arguments == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) arguments.getSerializable(MethodConst.ParamConst.deviceDetail);
+ if (deviceListBean == null) {
+ return;
+ }
+ initData();
+ }
+
+ private void initView(View view) {
+ view.findViewById(R.id.iv_day_pre).setOnClickListener(this);
+ mNextDayTv =view.findViewById(R.id.iv_day_next);
+ tvMonthDay = view.findViewById(R.id.tv_month_day);
+ deviceList = view.findViewById(R.id.record_list);
+ tvToday = view.findViewById(R.id.tv_today);
+ deviceList.setOnRefreshListener(this);
+ mNextDayTv.setOnClickListener(this);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ refreshMode(Mode.PULL_FROM_START);
+ refreshState(true);
+ }
+ }, 200);
+ recyclerView = deviceList.getRefreshableView();
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
+ linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ recyclerView.setLayoutManager(linearLayoutManager);
+ }
+
+ private void refreshState(boolean refresh) {
+ if (refresh) {
+ deviceList.setRefreshing(true);
+ } else {
+ deviceList.onRefreshComplete();
+ }
+ }
+
+ private void refreshMode(Mode mode) {
+ deviceList.setMode(mode);
+ }
+
+ private void initData() {
+ tvMonthDay.setText(searchDate);
+ mCalendar.setTime(TimeUtils.stringToDate(searchDate,"yyyy-MM-dd HH:mm:ss"));
+ UIUtils.setEnabledEX(TimeUtils.isBeforeToday(mCalendar), mNextDayTv);
+ }
+
+ protected Calendar mCalendar = Calendar.getInstance();
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.iv_day_pre) {
+ searchDate1 = searchDate1 - oneDay;
+ searchDate = DateHelper.dateFormat(new Date(searchDate1));
+ tvMonthDay.setText(searchDate);
+ mCalendar.setTime(new Date(searchDate1));
+ UIUtils.setEnabledEX(TimeUtils.isBeforeToday(mCalendar), mNextDayTv);
+ initLocalRecord(false);
+ } else if (id == R.id.iv_day_next) {
+ searchDate1 = searchDate1 + oneDay;
+ searchDate = DateHelper.dateFormat(new Date(searchDate1));
+ tvMonthDay.setText(searchDate);
+ mCalendar.setTime(new Date(searchDate1));
+ UIUtils.setEnabledEX(TimeUtils.isBeforeToday(mCalendar), mNextDayTv);
+ initLocalRecord(false);
+ }
+ }
+
+
+
+ @Override
+ public void deviceLocalRecord(LocalRecordsData.Response result) {
+ if (!isAdded()){
+ return;
+ }
+ tvToday.setVisibility(View.GONE);
+ recyclerView.setVisibility(View.VISIBLE);
+ DialogUtils.dismiss();
+ refreshState(false);
+ if (result != null && result.data != null && result.data.records != null && result.data.records.size() > 0) {
+ if (result.data.records.size() >= pageSize) {
+ refreshMode(Mode.BOTH);
+ } else {
+ refreshMode(Mode.PULL_FROM_START);
+ }
+ recordListDataList = dealLocalRecord(result);
+ } else {
+ if (pageIndex == 1){
+ tvToday.setVisibility(View.VISIBLE);
+ recyclerView.setVisibility(View.GONE);
+ }
+ refreshMode(Mode.PULL_FROM_START);
+ }
+ showList();
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ if (!isAdded()){
+ return;
+ }
+ LogUtil.errorLog(TAG, "error", throwable);
+ DialogUtils.dismiss();
+ refreshState(false);
+ refreshMode(Mode.PULL_FROM_START);
+ Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ pageIndex = 1;
+ time = "";
+ recordListDataList.clear();
+ showList();
+ }
+
+ private void initLocalRecord(boolean isLoadMore) {
+ if (isLoadMore) {
+ pageIndex = pageIndex + pageSize;
+ } else {
+ pageIndex = 1;
+ time = "";
+ recordListDataList.clear();
+ }
+ DialogUtils.show(getActivity());
+ getLocalData();
+ /* deviceRecordService.querySDUse(deviceListBean.deviceId, new IGetDeviceInfoCallBack.ICommon() {
+
+ @Override
+ public void onCommonBack(String response) {
+ if (!"empty".equals(response)){
+ getLocalData();
+ }else{
+ DialogUtils.dismiss();
+ refreshState(false);
+ tvToday.setVisibility(View.VISIBLE);
+ tvToday.setText(getActivity().getResources().getString(R.string.lc_demo_device_local_sd));
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Toast.makeText(getActivity(),throwable.getMessage(),Toast.LENGTH_SHORT).show();
+ }
+ });*/
+ }
+
+ private void getLocalData(){
+ LocalRecordsData localRecordsData = new LocalRecordsData();
+ localRecordsData.data.deviceId = deviceListBean.deviceId;
+ localRecordsData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ localRecordsData.data.beginTime = searchDate + " 00:00:00";
+ localRecordsData.data.endTime = searchDate + " 23:59:59";
+ localRecordsData.data.type = "All";
+ localRecordsData.data.queryRange = pageIndex + "-" + (pageIndex + pageSize - 1);
+ deviceRecordService.queryLocalRecords(localRecordsData, this);
+ }
+
+ private void showList() {
+ if (deviceRecordListAdapter == null) {
+ deviceRecordListAdapter = new DeviceRecordListAdapter(getContext(), recordListDataList);
+ recyclerView.setAdapter(deviceRecordListAdapter);
+ } else {
+ deviceRecordListAdapter.notifyDataSetChanged();
+ }
+ deviceRecordListAdapter.setEditClickListener(new DeviceRecordListAdapter.EditClickListener() {
+ @Override
+ public void edit(int outPosition, int innerPosition) {
+ LogUtil.debugLog(TAG, outPosition + "..." + innerPosition);
+ Bundle bundle = new Bundle();
+ bundle.putSerializable(MethodConst.ParamConst.deviceDetail, deviceListBean);
+ bundle.putSerializable(MethodConst.ParamConst.recordData, recordListDataList.get(outPosition).recordsData.get(innerPosition));
+ bundle.putInt(MethodConst.ParamConst.recordType, MethodConst.ParamConst.recordTypeLocal);
+ Intent intent = new Intent(getContext(), DeviceRecordPlayActivity.class);
+ intent.putExtras(bundle);
+ startActivity(intent);
+ }
+ });
+ }
+
+ private List dealLocalRecord(LocalRecordsData.Response result) {
+ for (LocalRecordsData.ResponseData.RecordsBean recordsBean : result.data.records) {
+ String innerTime = recordsBean.beginTime.substring(11, 13);
+ RecordsData a = new RecordsData();
+ a.recordType = 1;
+ a.recordId = recordsBean.recordId;
+ a.channelID = recordsBean.channelID;
+ a.beginTime = recordsBean.beginTime;
+ a.endTime = recordsBean.endTime;
+ a.fileLength = recordsBean.fileLength;
+ a.type = recordsBean.type;
+ if (!innerTime.equals(time)) {
+ RecordListData r = new RecordListData();
+ r.period = innerTime + ":00";
+ r.recordsData = new ArrayList<>();
+ r.recordsData.add(a);
+ recordListDataList.add(r);
+ time = innerTime;
+ } else {
+ RecordListData b = recordListDataList.get(recordListDataList.size() - 1);
+ b.recordsData.add(a);
+ }
+ }
+ LogUtil.debugLog(TAG, recordListDataList.size() + "");
+ return recordListDataList;
+ }
+
+ @Override
+ public void onPullDownToRefresh(PullToRefreshBase pullToRefreshBase) {
+ initLocalRecord(false);
+
+ }
+
+ @Override
+ public void onPullUpToRefresh(PullToRefreshBase pullToRefreshBase) {
+ initLocalRecord(true);
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceOnlineMediaPlayActivity.java b/app/src/main/java/com/lechange/demo/ui/DeviceOnlineMediaPlayActivity.java
new file mode 100644
index 0000000..5a1c5ed
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceOnlineMediaPlayActivity.java
@@ -0,0 +1,1515 @@
+package com.lechange.demo.ui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.graphics.drawable.BitmapDrawable;
+import android.hardware.SensorManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.Nullable;
+import android.support.v4.widget.PopupWindowCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.OrientationEventListener;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceLocalCacheService;
+import com.common.openapi.DeviceRecordService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.CloudRecordsData;
+import com.common.openapi.entity.ControlMovePTZData;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.DeviceLocalCacheData;
+import com.common.openapi.entity.LocalRecordsData;
+import com.common.openapi.entity.RecordsData;
+import com.lechange.common.log.Logger;
+import com.lechange.demo.adapter.MediaPlayRecordAdapter;
+import com.lechange.demo.dialog.EncryptKeyInputDialog;
+import com.lechange.demo.handler.ActivityHandler;
+import com.lechange.demo.tools.DateHelper;
+import com.lechange.demo.tools.DeviceAbilityHelper;
+import com.lechange.demo.tools.MediaPlayHelper;
+import com.lechange.demo.view.Direction;
+import com.lechange.demo.view.LcCloudRudderView;
+import com.lechange.demo.view.LcPopupWindow;
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.lechange.opensdk.listener.LCOpenSDK_TalkerListener;
+import com.lechange.opensdk.media.LCOpenSDK_ParamReal;
+import com.lechange.opensdk.media.LCOpenSDK_ParamTalk;
+import com.lechange.opensdk.media.LCOpenSDK_PlayWindow;
+import com.lechange.opensdk.media.LCOpenSDK_Talk;
+import com.mm.android.deviceaddmodule.LCDeviceEngine;
+import com.mm.android.deviceaddmodule.device_wifi.DeviceConstant;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.yonsz.z1.R;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.mine.mydevice.DeviceDetailActivity;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import de.greenrobot.event.EventBus;
+
+import static com.yonsz.z1.net.Constans.CLOSE_THIS_ACTIVITY;
+
+public class DeviceOnlineMediaPlayActivity extends AppCompatActivity implements View.OnClickListener, IGetDeviceInfoCallBack.IDeviceCacheCallBack {
+ private static final String TAG = DeviceOnlineMediaPlayActivity.class.getSimpleName();
+
+ private LCOpenSDK_PlayWindow mPlayWin = new LCOpenSDK_PlayWindow();
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private Bundle bundle;
+ private FrameLayout frLiveWindow, frLiveWindowContent;
+ private TextView tvNoVideo, tvDeviceName, tvCloudVideo, tvLocalVideo, tvLoadingMsg, tvPixel;
+ private RecyclerView rcvVideoList;
+ private LinearLayout llVideoContent, llVideo, llSpeak, llScreenShot, llCloudStage, llFullScreen, llSound, llPlayStyle, llPlayPause, llDetail, llBack, llVideo1, llSpeak1, llScreenShot1, llCloudStage1;
+ private ImageView ivPalyPause, ivPlayStyle, ivSound, ivCloudStage, ivScreenShot, ivSpeak, ivVideo, ivCloudStage1, ivScreenShot1, ivSpeak1, ivVideo1;
+ private ProgressBar pbLoading;
+ private RelativeLayout rlLoading;
+ private LcCloudRudderView rudderView;
+ private boolean cloudvideo = true;
+ private boolean isShwoRudder = false;
+ private boolean showHD = true;//显示HD和SD的切换
+ private AudioTalkerListener audioTalkerListener = new AudioTalkerListener();
+
+ private VideoMode videoMode = VideoMode.MODE_HD;
+ private SoundStatus soundStatus = SoundStatus.PLAY;
+ private SoundStatus soundStatusPre = SoundStatus.PLAY;
+ private SpeakStatus speakStatus = SpeakStatus.STOP;
+ private RecordStatus recordStatus = RecordStatus.STOP;
+ private PlayStatus playStatus = PlayStatus.ERROR;
+ private LinearLayoutManager linearLayoutManager;
+ private MediaPlayRecordAdapter mediaPlayRecordAdapter;
+ private List recordsDataList = new ArrayList<>();
+ private List cloudRecordsDataList;
+ private List localRecordsDataList;
+ private String cloudRecordsDataTip = "";
+ private String localRecordsDataTip = "";
+ private DeviceRecordService deviceRecordService = ClassInstanceManager.newInstance().getDeviceRecordService();
+ private Direction mPTZPreDirection = null;
+ private int mCurrentOrientation;
+ private LinearLayout llController;
+ private FrameLayout frRecord;
+ private RelativeLayout rlTitle;
+ private ImageView ivChangeScreen;
+ private EncryptKeyInputDialog encryptKeyInputDialog;
+ private String encryptKey;
+ private boolean supportPTZ;
+ private String videoPath = null;
+ // 屏幕方向改变监听器
+ private OrientationEventListener mOrientationEventListener;
+
+ private int mVideoViewCurrentOrientationRequest = NO_ORIENTATION_REQUEST;
+ private LcPopupWindow lcPopupWindow;
+ private int imageSize = -1;//视频播放分辨率
+ private int bateMode;
+
+
+ public enum PlayStatus {
+ PLAY, PAUSE, ERROR
+ }
+
+ public enum LoadStatus {
+ LOADING, LOAD_SUCCESS, LOAD_ERROR
+ }
+
+ public enum SoundStatus {
+ PLAY, STOP, NO_SUPPORT
+ }
+
+ public enum SpeakStatus {
+ PLAY, STOP, NO_SUPPORT, OPENING
+ }
+
+ public enum VideoMode {
+ MODE_HD, MODE_SD
+ }
+
+ public enum RecordStatus {
+ START, STOP
+ }
+
+ private Handler mHandler;
+
+ public void onEventMainThread(EventBusEntity event) {
+ String msg = event.getMsg();
+ Log.e("nettyUtil", msg);
+ if (msg.equals("关闭")) {
+ finish();
+ }
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ mHandler = new ActivityHandler(this) {
+ @Override
+ public void handleMsg(Message msg) {
+ switch (msg.what) {
+ case MSG_REQUEST_ORIENTATION:
+ requestedOrientation(msg.arg1, false);
+ break;
+ default:
+ break;
+ }
+ // handlePlayMessage(msg);
+ }
+
+ };
+ super.onCreate(savedInstanceState);
+ EventBus.getDefault().register(this);
+ mCurrentOrientation = Configuration.ORIENTATION_PORTRAIT;
+ initOrientationEventListener();
+ setContentView(R.layout.activity_device_online_media_play);
+ initView();
+ initData();
+ operatePTZ();
+ }
+
+ protected void requestedOrientation(int requestedOrientation, boolean isForce) {
+
+ if (!isForce) {
+
+ if (mVideoViewCurrentOrientationRequest == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
+
+ /*
+ * // 如果是开启全屏开关,禁止竖屏 if (requestedOrientation ==
+ * ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || requestedOrientation ==
+ * ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) { return; }
+ */
+ mVideoViewCurrentOrientationRequest = NO_ORIENTATION_REQUEST;
+
+ } else {
+
+ if (mVideoViewCurrentOrientationRequest == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
+
+ if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
+
+ // 如果监听器发出的请求是横屏,表示屏幕处于横屏,直接返回;
+ mVideoViewCurrentOrientationRequest = NO_ORIENTATION_REQUEST;
+ return;
+ }
+
+ if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
+
+ // 如果监听器发出的请求和当前开关方向保持一致时,表示屏幕已经恢复到制定的竖屏,将开关请求状态重置;
+ mVideoViewCurrentOrientationRequest = NO_ORIENTATION_REQUEST;
+ return;
+ }
+
+ // 如果监听器发出的请求与当前开关方向不一致时,表示屏幕已经转到其他方向,将开关请求状态重置,并发出相应的请求;
+ mVideoViewCurrentOrientationRequest = NO_ORIENTATION_REQUEST;
+ }
+
+ // 如果开关没有发出请求,或者开关请求状态已经重置,则直接发出相应请求;
+
+ }
+
+ } else {
+ mVideoViewCurrentOrientationRequest = requestedOrientation;
+ }
+
+ try {
+ setRequestedOrientation(requestedOrientation);
+ } catch (Exception e) {
+ }
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ mCurrentOrientation = newConfig.orientation;
+ super.onConfigurationChanged(newConfig);
+ switchScreenDirection();
+ }
+
+ private void operatePTZ() {
+ rudderView.setRudderListener(new LcCloudRudderView.RudderListener() {
+ @Override
+ public void onSteeringWheelChangedBegin() {
+
+ }
+
+ @Override
+ public void onSteeringWheelChangedContinue(Direction direction) {
+ if (direction == null && mPTZPreDirection != null) {
+ controlPTZ(mPTZPreDirection, 200, true);
+ mPTZPreDirection = null;
+ } else if (direction != mPTZPreDirection) {
+ // 方向不同才更新云台指示图标
+ mPTZPreDirection = direction;
+ controlPTZ(mPTZPreDirection, 30000, false);
+ }
+ }
+
+ @Override
+ public void onSteeringWheelChangedSingle(Direction direction) {
+ controlPTZ(direction, 200, false);
+ }
+
+ @Override
+ public void onSteeringWheelChangedEnd() {
+ }
+ });
+ }
+
+ private void controlPTZ(Direction em, long time, boolean stop) {
+ String operation = "";
+ if (em == Direction.Left) {
+ operation = "2";
+ } else if (em == Direction.Right) {
+ operation = "3";
+ } else if (em == Direction.Up) {
+ operation = "0";
+ } else if (em == Direction.Down) {
+ operation = "1";
+ }
+ if (stop) {
+ operation = "10";
+ }
+ ControlMovePTZData controlMovePTZData = new ControlMovePTZData();
+ controlMovePTZData.data.deviceId = deviceListBean.deviceId;
+ controlMovePTZData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ controlMovePTZData.data.operation = operation;
+ controlMovePTZData.data.duration = time;
+ deviceRecordService.controlMovePTZ(controlMovePTZData);
+ }
+
+ private void initCloudRecord() {
+ if ((cloudRecordsDataTip != null && !cloudRecordsDataTip.isEmpty()) || cloudRecordsDataList != null) {
+ if (cloudRecordsDataList != null) {
+ showRecordList(cloudRecordsDataList);
+ } else {
+ showRecordListTip(cloudRecordsDataTip);
+ }
+ } else {
+ getCloudRecord();
+ /* deviceRecordService.queryCloudUse(deviceListBean.deviceId, deviceListBean.channels.get(deviceListBean.checkedChannel).channelId, new IGetDeviceInfoCallBack.ICommon() {
+
+ @Override
+ public void onCommonBack(Integer response) {
+ if (response==-1||response==0){
+ cloudRecordsDataTip = getResources().getString(R.string.lc_demo_device_cloud_not_open);
+ showRecordListTip(cloudRecordsDataTip);
+ }else{
+ getCloudRecord();
+ }
+
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Toast.makeText(DeviceOnlineMediaPlayActivity.this,throwable.getMessage(),Toast.LENGTH_SHORT).show();
+ }
+ });*/
+ }
+ }
+
+
+ private void getCloudRecord() {
+ if (deviceListBean.channels.size() == 0) {
+ return;
+ }
+ CloudRecordsData cloudRecordsData = new CloudRecordsData();
+ cloudRecordsData.data.deviceId = deviceListBean.deviceId;
+ cloudRecordsData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ cloudRecordsData.data.beginTime = DateHelper.dateFormat(new Date(System.currentTimeMillis())) + " 00:00:00";
+ cloudRecordsData.data.endTime = DateHelper.dateFormat(new Date(System.currentTimeMillis())) + " 23:59:59";
+ cloudRecordsData.data.count = 6;
+ deviceRecordService.getCloudRecords(cloudRecordsData, new IGetDeviceInfoCallBack.IDeviceCloudRecordCallBack() {
+ @Override
+ public void deviceCloudRecord(CloudRecordsData.Response result) {
+ List cloudRecords = result.data.records;
+ if (cloudRecords != null && cloudRecords.size() > 0) {
+ cloudRecordsDataList = new ArrayList<>();
+ for (CloudRecordsData.ResponseData.RecordsBean recordsBean : cloudRecords) {
+ RecordsData recordsData = RecordsData.parseCloudData(recordsBean);
+ cloudRecordsDataList.add(recordsData);
+ }
+ showRecordList(cloudRecordsDataList);
+ } else {
+ queryCloudUseState(deviceListBean.deviceId, deviceListBean.channels.get(deviceListBean.checkedChannel).channelId);
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ cloudRecordsDataTip = throwable.getMessage();
+ showRecordListTip(cloudRecordsDataTip);
+ }
+ });
+ }
+
+ /**
+ * 查询套餐使用情况
+ *
+ * @param deviceId
+ * @param channelId
+ */
+ private void queryCloudUseState(String deviceId, String channelId) {
+ deviceRecordService.queryCloudUse(deviceId, channelId, new IGetDeviceInfoCallBack.ICommon() {
+ @Override
+ public void onCommonBack(Integer response) {
+ switch (response) {
+ case -1://未开通
+ cloudRecordsDataTip = getResources().getString(R.string.lc_demo_device_cloud_state_not_opened);
+ break;
+ case 0://过期
+ cloudRecordsDataTip = getResources().getString(R.string.lc_demo_device_cloud_state_expired);
+ break;
+ case 1://使用中
+ cloudRecordsDataTip = getResources().getString(R.string.lc_demo_device_more_video);
+ break;
+ case 2://暂停
+ cloudRecordsDataTip = getResources().getString(R.string.lc_demo_device_cloud_state_suspended);
+ break;
+ }
+ showRecordListTip(cloudRecordsDataTip);
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ cloudRecordsDataTip = throwable.getMessage();
+ showRecordListTip(cloudRecordsDataTip);
+ }
+ });
+ }
+
+ private void showRecordList(List list) {
+ rcvVideoList.setVisibility(View.VISIBLE);
+ tvNoVideo.setVisibility(View.GONE);
+ recordsDataList.clear();
+ for (RecordsData a : list) {
+ recordsDataList.add(a);
+ }
+ if (mediaPlayRecordAdapter == null) {
+ mediaPlayRecordAdapter = new MediaPlayRecordAdapter(recordsDataList, DeviceOnlineMediaPlayActivity.this);
+ rcvVideoList.setAdapter(mediaPlayRecordAdapter);
+ } else {
+ mediaPlayRecordAdapter.notifyDataSetChanged();
+ }
+ //加载更多
+ mediaPlayRecordAdapter.setLoadMoreClickListener(new MediaPlayRecordAdapter.LoadMoreClickListener() {
+ @Override
+ public void loadMore() {
+ gotoRecordList();
+ }
+ });
+ //进入视频片段播放页
+ mediaPlayRecordAdapter.setOnItemClickListener(new MediaPlayRecordAdapter.OnItemClickListener() {
+ @Override
+ public void click(int recordType, int position) {
+ Bundle bundle = new Bundle();
+ bundle.putSerializable(MethodConst.ParamConst.deviceDetail, deviceListBean);
+ bundle.putSerializable(MethodConst.ParamConst.recordData, recordsDataList.get(position));
+ bundle.putInt(MethodConst.ParamConst.recordType, recordsDataList.get(position).recordType == 0 ? MethodConst.ParamConst.recordTypeCloud : MethodConst.ParamConst.recordTypeLocal);
+ Intent intent = new Intent(DeviceOnlineMediaPlayActivity.this, DeviceRecordPlayActivity.class);
+ intent.putExtras(bundle);
+ startActivity(intent);
+ }
+ });
+ }
+
+ private void gotoRecordList() {
+ if (cloudvideo) {
+ Bundle bundle = new Bundle();
+ bundle.putSerializable(MethodConst.ParamConst.deviceDetail, deviceListBean);
+ bundle.putInt(MethodConst.ParamConst.recordType, MethodConst.ParamConst.recordTypeCloud);
+ Intent intent = new Intent(DeviceOnlineMediaPlayActivity.this, DeviceRecordListActivity.class);
+ intent.putExtras(bundle);
+ startActivity(intent);
+ } else {
+ Bundle bundle = new Bundle();
+ bundle.putSerializable(MethodConst.ParamConst.deviceDetail, deviceListBean);
+ bundle.putInt(MethodConst.ParamConst.recordType, MethodConst.ParamConst.recordTypeLocal);
+ Intent intent = new Intent(DeviceOnlineMediaPlayActivity.this, DeviceRecordListActivity.class);
+ intent.putExtras(bundle);
+ startActivity(intent);
+ }
+ }
+
+ private void showRecordListTip(String txt) {
+ rcvVideoList.setVisibility(View.GONE);
+ tvNoVideo.setVisibility(View.VISIBLE);
+ tvNoVideo.setText(txt);
+ }
+
+ private void initLocalRecord() {
+ if ((localRecordsDataTip != null && !localRecordsDataTip.isEmpty()) || localRecordsDataList != null) {
+ if (localRecordsDataList != null) {
+ showRecordList(localRecordsDataList);
+ } else {
+ showRecordListTip(localRecordsDataTip);
+ }
+ } else {
+ getLocalRecord();
+ /* deviceRecordService.querySDUse(deviceListBean.deviceId, new IGetDeviceInfoCallBack.ICommon() {
+ @Override
+ public void onCommonBack(String response) {
+ if (!"empty".equals(response)){
+ getLocalRecord();
+ }else{
+ localRecordsDataTip = getResources().getString(R.string.lc_demo_device_local_sd);
+ showRecordListTip(localRecordsDataTip);
+ }
+ }
+ @Override
+ public void onError(Throwable throwable) {
+ Toast.makeText(DeviceOnlineMediaPlayActivity.this,throwable.getMessage(),Toast.LENGTH_SHORT).show();
+ }
+ });*/
+
+ }
+ }
+
+ private void getLocalRecord() {
+ LocalRecordsData localRecordsData = new LocalRecordsData();
+ localRecordsData.data.deviceId = deviceListBean.deviceId;
+ localRecordsData.data.channelId = deviceListBean.channels.get(deviceListBean.checkedChannel).channelId;
+ localRecordsData.data.beginTime = DateHelper.dateFormat(new Date(System.currentTimeMillis())) + " 00:00:00";
+ localRecordsData.data.endTime = DateHelper.dateFormat(new Date(System.currentTimeMillis())) + " 23:59:59";
+ localRecordsData.data.type = "All";
+ localRecordsData.data.queryRange = "1-6";
+ deviceRecordService.queryLocalRecords(localRecordsData, new IGetDeviceInfoCallBack.IDeviceLocalRecordCallBack() {
+ @Override
+ public void deviceLocalRecord(LocalRecordsData.Response result) {
+ List localRecords = result.data.records;
+ if (localRecords != null && localRecords.size() > 0) {
+ localRecordsDataList = new ArrayList<>();
+ for (LocalRecordsData.ResponseData.RecordsBean recordsBean : localRecords) {
+ RecordsData recordsData = RecordsData.parseLocalData(recordsBean);
+ localRecordsDataList.add(recordsData);
+ }
+ showRecordList(localRecordsDataList);
+ } else {
+ localRecordsDataTip = getResources().getString(R.string.lc_demo_device_more_video);
+ showRecordListTip(localRecordsDataTip);
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ localRecordsDataTip = throwable.getMessage();
+ showRecordListTip(localRecordsDataTip);
+ }
+ });
+ }
+
+ private void initView() {
+ frLiveWindow = findViewById(R.id.fr_live_window);
+ frLiveWindowContent = findViewById(R.id.fr_live_window_content);
+ tvCloudVideo = findViewById(R.id.tv_cloud_video);
+ tvLocalVideo = findViewById(R.id.tv_local_video);
+ llBack = findViewById(R.id.ll_back);
+ tvDeviceName = findViewById(R.id.tv_device_name);
+ llDetail = findViewById(R.id.ll_detail);
+ llPlayPause = findViewById(R.id.ll_paly_pause);
+ llPlayStyle = findViewById(R.id.ll_play_style);
+ llSound = findViewById(R.id.ll_sound);
+ llFullScreen = findViewById(R.id.ll_fullscreen);
+ llCloudStage = findViewById(R.id.ll_cloudstage);
+ llScreenShot = findViewById(R.id.ll_screenshot);
+ llSpeak = findViewById(R.id.ll_speak);
+ llVideo = findViewById(R.id.ll_video);
+ llVideoContent = findViewById(R.id.ll_video_content);
+ rcvVideoList = findViewById(R.id.rcv_video_list);
+ tvNoVideo = findViewById(R.id.tv_no_video);
+ rudderView = findViewById(R.id.rudder);
+ ivPalyPause = findViewById(R.id.iv_paly_pause);
+ ivPlayStyle = findViewById(R.id.iv_play_style);
+ tvPixel = findViewById(R.id.tv_play_pixel);
+ ivSound = findViewById(R.id.iv_sound);
+ ivCloudStage = findViewById(R.id.iv_cloudStage);
+ ivScreenShot = findViewById(R.id.iv_screen_shot);
+ ivSpeak = findViewById(R.id.iv_speak);
+ ivVideo = findViewById(R.id.iv_video);
+
+ llCloudStage1 = findViewById(R.id.ll_cloudstage1);
+ llScreenShot1 = findViewById(R.id.ll_screenshot1);
+ llSpeak1 = findViewById(R.id.ll_speak1);
+ llVideo1 = findViewById(R.id.ll_video1);
+ ivCloudStage1 = findViewById(R.id.iv_cloudStage1);
+ ivScreenShot1 = findViewById(R.id.iv_screen_shot1);
+ ivSpeak1 = findViewById(R.id.iv_speak1);
+ ivVideo1 = findViewById(R.id.iv_video1);
+
+ rlLoading = findViewById(R.id.rl_loading);
+ pbLoading = findViewById(R.id.pb_loading);
+ tvLoadingMsg = findViewById(R.id.tv_loading_msg);
+ llController = findViewById(R.id.ll_controller);
+ frRecord = findViewById(R.id.fr_record);
+ rlTitle = findViewById(R.id.rl_title);
+ ivChangeScreen = findViewById(R.id.iv_change_screen);
+ linearLayoutManager = new LinearLayoutManager(DeviceOnlineMediaPlayActivity.this);
+ linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
+ rcvVideoList.setLayoutManager(linearLayoutManager);
+ initCommonClickListener();
+ // 初始化播放窗口
+ switchScreenDirection();
+ mPlayWin.initPlayWindow(this, frLiveWindowContent, 0, false);
+ setWindowListener(mPlayWin);
+ mPlayWin.openTouchListener();//开启收拾监听
+ }
+
+ private void switchScreenDirection() {
+ if (mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT) {
+ RelativeLayout.LayoutParams mLayoutParams = new RelativeLayout.LayoutParams(frLiveWindow.getLayoutParams());
+ DisplayMetrics metric = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ mLayoutParams.addRule(RelativeLayout.BELOW, R.id.rl_title);
+ frLiveWindow.setLayoutParams(mLayoutParams);
+ MediaPlayHelper.quitFullScreen(DeviceOnlineMediaPlayActivity.this);
+ llController.setVisibility(View.VISIBLE);
+ rlTitle.setVisibility(View.VISIBLE);
+ llSpeak1.setVisibility(View.GONE);
+ llCloudStage1.setVisibility(View.GONE);
+ llVideo1.setVisibility(View.GONE);
+ llScreenShot1.setVisibility(View.GONE);
+ RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(frRecord
+ .getLayoutParams());
+ layoutParams.addRule(RelativeLayout.BELOW, R.id.ll_controller);
+ frRecord.setLayoutParams(layoutParams);
+ FrameLayout.LayoutParams layoutParams3 = new FrameLayout.LayoutParams(rudderView.getLayoutParams());
+ layoutParams3.gravity = Gravity.CENTER;
+ rudderView.setLayoutParams(layoutParams3);
+ switchCloudRudder(false);
+ } else if (mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
+ DisplayMetrics metric = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(metric);
+ RelativeLayout.LayoutParams mLayoutParams = new RelativeLayout.LayoutParams(metric.widthPixels, metric.heightPixels);
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ mLayoutParams.removeRule(RelativeLayout.BELOW);
+ frLiveWindow.setLayoutParams(mLayoutParams);
+ MediaPlayHelper.setFullScreen(DeviceOnlineMediaPlayActivity.this);
+ llController.setVisibility(View.GONE);
+ rlTitle.setVisibility(View.GONE);
+ llSpeak1.setVisibility(View.VISIBLE);
+ llCloudStage1.setVisibility(View.VISIBLE);
+ llVideo1.setVisibility(View.VISIBLE);
+ llScreenShot1.setVisibility(View.VISIBLE);
+ RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(frRecord
+ .getLayoutParams());
+ layoutParams.removeRule(RelativeLayout.BELOW);
+ frRecord.setLayoutParams(layoutParams);
+ FrameLayout.LayoutParams layoutParams3 = new FrameLayout.LayoutParams(rudderView.getLayoutParams());
+ layoutParams3.gravity = Gravity.CENTER_VERTICAL;
+ rudderView.setLayoutParams(layoutParams3);
+ switchCloudRudder(false);
+ }
+ }
+
+ private void initData() {
+ bundle = getIntent().getExtras();
+ if (bundle == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) bundle.getSerializable(MethodConst.ParamConst.deviceDetail);
+ switchVideoList(true);
+ if (deviceListBean.channels.size() == 0) {
+ return;
+ }
+ getDeviceLocalCache();
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+
+ /*if (deviceListBean.channels.get(deviceListBean.checkedChannel).resolutions != null && deviceListBean.channels.get(deviceListBean.checkedChannel).resolutions.size() > 0) {
+ showHD = false;
+ bateMode = deviceListBean.channels.get(deviceListBean.checkedChannel).resolutions.get(0).streamType;
+ imageSize = deviceListBean.channels.get(deviceListBean.checkedChannel).resolutions.get(0).imageSize;
+ tvPixel.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).resolutions.get(0).name);
+ } else {
+ showHD = true;
+ }
+ lcPopupWindow = new LcPopupWindow(DeviceOnlineMediaPlayActivity.this, deviceListBean.channels.get(deviceListBean.checkedChannel).resolutions);
+ lcPopupWindow.getContentView().measure(lcPopupWindow.makeDropDownMeasureSpec(lcPopupWindow.getWidth()),
+ lcPopupWindow.makeDropDownMeasureSpec(lcPopupWindow.getHeight()
+ ));*/
+ }
+
+ /**
+ * 获取设备缓存信息
+ */
+ private void getDeviceLocalCache() {
+ DeviceLocalCacheData deviceLocalCacheData = new DeviceLocalCacheData();
+ deviceLocalCacheData.setDeviceId(deviceListBean.deviceId);
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ deviceLocalCacheData.setChannelId(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId);
+ }
+ DeviceLocalCacheService deviceLocalCacheService = ClassInstanceManager.newInstance().getDeviceLocalCacheService();
+ deviceLocalCacheService.findLocalCache(deviceLocalCacheData, this);
+ }
+
+
+ @Override
+ public void deviceCache(DeviceLocalCacheData deviceLocalCacheData) {
+ BitmapDrawable bitmapDrawable = MediaPlayHelper.picDrawable(deviceLocalCacheData.getPicPath());
+ if (bitmapDrawable != null) {
+ rlLoading.setBackground(bitmapDrawable);
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_loading), deviceListBean.deviceId);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ stop();
+ recordStatus = RecordStatus.STOP;
+ }
+
+ private void initAbility(boolean loadSuccess) {
+ String deviceAbility = deviceListBean.ability;
+ String channelAbility = deviceListBean.ability;
+// String channelAbility = deviceListBean.channels.get(deviceListBean.checkedChannel).ability;
+ //云台
+ supportPTZ = DeviceAbilityHelper.isHasAbility(deviceAbility, channelAbility, "PT", "PTZ") && loadSuccess;
+ cloudStageClickListener(supportPTZ);
+ //对讲
+ speakClickListener(DeviceAbilityHelper.isHasAbility(deviceAbility, channelAbility, "AudioTalkV1", "AudioTalk") && loadSuccess);
+ }
+
+ private void switchVideoList(boolean b) {
+ this.cloudvideo = b;
+ tvCloudVideo.setSelected(cloudvideo);
+ tvLocalVideo.setSelected(!cloudvideo);
+ if (cloudvideo) {
+ initCloudRecord();
+ } else {
+ initLocalRecord();
+ }
+ }
+
+ private void initCommonClickListener() {
+ llBack.setOnClickListener(this);
+ llDetail.setOnClickListener(this);
+ tvCloudVideo.setOnClickListener(this);
+ tvLocalVideo.setOnClickListener(this);
+ tvNoVideo.setOnClickListener(this);
+ llFullScreen.setOnClickListener(this);
+ }
+
+ private void featuresClickListener(boolean loadSuccess) {
+ llPlayPause.setOnClickListener(loadSuccess ? this : null);
+ llPlayStyle.setOnClickListener(loadSuccess ? this : null);
+
+ llScreenShot.setOnClickListener(loadSuccess ? this : null);
+ llScreenShot1.setOnClickListener(loadSuccess ? this : null);
+ llVideo.setOnClickListener(loadSuccess ? this : null);
+ llVideo1.setOnClickListener(loadSuccess ? this : null);
+ llSound.setOnClickListener(loadSuccess ? this : null);
+ ivPalyPause.setImageDrawable(loadSuccess ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_pause) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_pause_disable));
+ if (showHD) {
+ ivPlayStyle.setVisibility(View.VISIBLE);
+ tvPixel.setVisibility(View.GONE);
+ ivPlayStyle.setImageDrawable(videoMode == VideoMode.MODE_HD ?
+ (loadSuccess ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_hd) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_hd_disable)) :
+ (loadSuccess ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_sd) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_hd_disable)));
+ } else {
+ ivPlayStyle.setVisibility(View.GONE);
+ tvPixel.setVisibility(View.VISIBLE);
+ }
+
+ ivScreenShot.setImageDrawable(loadSuccess
+ ? getDrawable(R.drawable.lc_demo_photo_capture_selector)
+ : getDrawable(R.mipmap.lc_demo_livepreview_icon_screenshot_disable));
+ ivVideo.setImageDrawable(loadSuccess
+ ? getDrawable(R.mipmap.lc_demo_livepreview_icon_video)
+ : getDrawable(R.mipmap.lc_demo_livepreview_icon_video_disable));
+
+ ivScreenShot1.setImageDrawable(loadSuccess
+ ? getDrawable(R.mipmap.live_video_icon_h_screenshot)
+ : getDrawable(R.mipmap.live_video_icon_h_screenshot_disable));
+ ivVideo1.setImageDrawable(loadSuccess
+ ? getDrawable(R.mipmap.live_video_icon_h_video_off)
+ : getDrawable(R.mipmap.live_video_icon_h_video_off_disable));
+ ivSound.setImageDrawable(loadSuccess ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off_disable));
+ //媒体声
+ if (soundStatus != SoundStatus.PLAY) {
+ return;
+ }
+ if (openAudio()) {
+ soundStatus = SoundStatus.PLAY;
+ ivSound.setImageDrawable(getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_on));
+ }
+ }
+
+ private void cloudStageClickListener(boolean isSupport) {
+ llCloudStage.setOnClickListener(isSupport ? this : null);
+ ivCloudStage.setImageDrawable(isSupport
+ ? getDrawable(R.mipmap.lc_demo_livepreview_icon_cloudstage)
+ : getDrawable(R.mipmap.lc_demo_livepreview_icon_cloudstage_disable));
+ llCloudStage1.setOnClickListener(isSupport ? this : null);
+ ivCloudStage1.setImageDrawable(isSupport
+ ? getDrawable(R.mipmap.live_video_icon_h_cloudterrace_off)
+ : getDrawable(R.mipmap.live_video_icon_h_cloudterrace_off_disable));
+ }
+
+ private void speakClickListener(boolean isSupport) {
+ ivSpeak.setOnClickListener(isSupport ? this : null);
+ ivSpeak.setImageDrawable(isSupport
+ ? getDrawable(R.mipmap.lc_demo_livepreview_icon_speak)
+ : getDrawable(R.mipmap.lc_demo_livepreview_icon_speak_disable));
+ ivSpeak1.setOnClickListener(isSupport ? this : null);
+ ivSpeak1.setImageDrawable(isSupport
+ ? getDrawable(R.mipmap.live_video_icon_h_talk_off)
+ : getDrawable(R.mipmap.live_video_icon_h_talk_off_disable));
+ }
+
+ private void setWindowListener(LCOpenSDK_PlayWindow playWin) {
+ playWin.setWindowListener(new LCOpenSDK_EventListener() {
+ //手势缩放开始事件
+ @Override
+ public void onZoomBegin(int index) {
+ super.onZoomBegin(index);
+ LogUtil.debugLog(TAG, "onZoomBegin: index= " + index);
+ }
+
+ //手势缩放中事件
+ @Override
+ public void onZooming(int index, float dScale) {
+ super.onZooming(index, dScale);
+ LogUtil.debugLog(TAG, "onZooming: index= " + index + " , dScale= " + dScale);
+ mPlayWin.doScale(dScale);
+ }
+
+ //缩放结束事件
+ @Override
+ public void onZoomEnd(int index, ZoomType zoomType) {
+ super.onZoomEnd(index, zoomType);
+ LogUtil.debugLog(TAG, "onZoomEnd: index= " + index + " , zoomType= " + zoomType);
+ }
+
+ //窗口单击事件
+ @Override
+ public void onControlClick(int index, float dx, float dy) {
+ super.onControlClick(index, dx, dy);
+ LogUtil.debugLog(TAG, "onControlClick: index= " + index + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //窗口双击事件
+ @Override
+ public void onWindowDBClick(int index, float dx, float dy) {
+ super.onWindowDBClick(index, dx, dy);
+ LogUtil.debugLog(TAG, "onWindowDBClick: index= " + index + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //滑动开始事件
+ @Override
+ public boolean onSlipBegin(int index, Direction direction, float dx, float dy) {
+ LogUtil.debugLog(TAG, "onSlipBegin: index= " + index + " , direction= " + direction + " , dx= " + dx + " , dy= " + dy);
+ return super.onSlipBegin(index, direction, dx, dy);
+ }
+
+ //滑动中事件
+ @Override
+ public void onSlipping(int index, Direction direction, float prex, float prey, float dx, float dy) {
+ super.onSlipping(index, direction, prex, prey, dx, dy);
+ mPlayWin.doTranslate(dx, dy);
+ LogUtil.debugLog(TAG, "onSlipping: index= " + index + " , direction= " + direction + " , prex= " + prex + " , prey= " + prey + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //滑动结束事件
+ @Override
+ public void onSlipEnd(int index, Direction direction, float dx, float dy) {
+ super.onSlipEnd(index, direction, dx, dy);
+ mPlayWin.doTranslateEnd();
+ LogUtil.debugLog(TAG, "onSlipEnd: index= " + index + " , direction= " + direction + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //长按开始回调
+ @Override
+ public void onWindowLongPressBegin(int index, Direction direction, float dx, float dy) {
+ super.onWindowLongPressBegin(index, direction, dx, dy);
+ LogUtil.debugLog(TAG, "onWindowLongPressBegin: index= " + index + " , direction= " + direction + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //长按事件结束
+ @Override
+ public void onWindowLongPressEnd(int index) {
+ super.onWindowLongPressEnd(index);
+ LogUtil.debugLog(TAG, "onWindowLongPressEnd: index= " + index);
+ }
+
+ /**
+ * 播放事件回调
+ * resultSource: 0--RTSP 1--HLS 5--DHHTTP 99--OPENAPI
+ */
+ @Override
+ public void onPlayerResult(int index, String code, int resultSource) {
+ //mPlayWin.setSEnhanceMode(4);//设置降噪等级最大
+ super.onPlayerResult(index, code, resultSource);
+ LogUtil.debugLog(TAG, "onPlayerResult: index= " + index + " , code= " + code + " , resultSource= " + resultSource);
+ boolean failed = false;
+ if (resultSource == 99) {
+ //code -1000 HTTP交互出错或超时
+ failed = true;
+ } else {
+ if (resultSource == 5 && (!(code.equals("1000") || code.equals("0") || code.equals("4000")))) {
+ // code 1000-开启播放成功 0-开始拉流
+ failed = true;
+ if (code.equals("1000005")) {
+ inputEncryptKey();
+ }
+ } else if (resultSource == 0 && (code.equals("0") || code.equals("1") || code.equals("3") || code.equals("7"))) {
+ // code
+ // 0-组帧失败,错误状态
+ // 1-内部要求关闭,如连接断开等,错误状态
+ // 3-RTSP鉴权失败,错误状态
+ // 7-秘钥错误
+ failed = true;
+ if (code.equals("7")) {
+ inputEncryptKey();
+ }
+ }
+ }
+ if (failed) {
+ loadingStatus(LoadStatus.LOAD_ERROR, getResources().getString(R.string.lc_demo_device_video_play_error) + ":" + code + "." + resultSource, "");
+ playStatus = PlayStatus.ERROR;
+ }
+ }
+
+ //分辨率改变事件
+ @Override
+ public void onResolutionChanged(int index, int width, int height) {
+ super.onResolutionChanged(index, width, height);
+ LogUtil.debugLog(TAG, "onResolutionChanged: index= " + index + " , width= " + width + " , height= " + height);
+ }
+
+ //播放开始回调
+ @Override
+ public void onPlayBegan(int index) {
+ super.onPlayBegan(index);
+ LogUtil.debugLog(TAG, "onPlayBegan: index= " + index);
+ loadingStatus(LoadStatus.LOAD_SUCCESS, "", "");
+ playStatus = PlayStatus.PLAY;
+ }
+
+ //接收数据回调
+ @Override
+ public void onReceiveData(int index, int len) {
+ super.onReceiveData(index, len);
+ LogUtil.debugLog(TAG, "onReceiveData: index= " + index + " , len= " + len);
+ }
+
+ //接收帧流回调
+ @Override
+ public void onStreamCallback(int index, byte[] bytes, int len) {
+ super.onStreamCallback(index, bytes, len);
+ LogUtil.debugLog(TAG, "onStreamCallback: index= " + index + " , len= " + len);
+ }
+
+ //播放结束事件
+ @Override
+ public void onPlayFinished(int index) {
+ super.onPlayFinished(index);
+ LogUtil.debugLog(TAG, "onPlayFinished: index= " + index);
+ }
+
+ //播放时间信息回调
+ @Override
+ public void onPlayerTime(int index, long time) {
+ super.onPlayerTime(index, time);
+ LogUtil.debugLog(TAG, "onPlayerTime: index= " + index + " , time= " + time);
+ }
+ });
+ }
+
+ /**
+ * 输入秘钥
+ */
+ private void inputEncryptKey() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (encryptKeyInputDialog == null) {
+ encryptKeyInputDialog = new EncryptKeyInputDialog(DeviceOnlineMediaPlayActivity.this);
+ }
+ encryptKeyInputDialog.show();
+ encryptKeyInputDialog.setOnClick(new EncryptKeyInputDialog.OnClick() {
+ @Override
+ public void onSure(String txt) {
+ encryptKey = txt;
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_change), txt);
+ }
+ });
+ }
+ });
+ }
+
+ /**
+ * 播放状态
+ *
+ * @param loadStatus 播放状态
+ * @param msg
+ */
+ private void loadingStatus(final LoadStatus loadStatus, final String msg, final String psk) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (loadStatus == LoadStatus.LOADING) {
+ //先关闭
+ stop();
+ //开始播放
+ play(psk);
+ rlLoading.setVisibility(View.VISIBLE);
+ pbLoading.setVisibility(View.VISIBLE);
+ tvLoadingMsg.setText(msg);
+ } else if (loadStatus == LoadStatus.LOAD_SUCCESS) {
+ //播放成功
+ rlLoading.setVisibility(View.GONE);
+ rudderView.enable(true);
+ initAbility(true);
+ featuresClickListener(true);
+ } else {
+ //播放失败
+ stop();
+ rlLoading.setVisibility(View.VISIBLE);
+ pbLoading.setVisibility(View.GONE);
+ tvLoadingMsg.setText(msg);
+ initAbility(false);
+ featuresClickListener(false);
+ }
+ }
+ });
+ }
+
+ /**
+ * 开始播放
+ */
+ public void play(String psk) {
+
+ if (showHD) {
+ bateMode = videoMode == VideoMode.MODE_HD ? 0 : 1;
+ }
+ if (deviceListBean.channels.size() == 0) {
+ return;
+ }
+ LCOpenSDK_ParamReal paramReal = new LCOpenSDK_ParamReal(
+ SharedpreferencesUtil.get("accessToken", ""),
+ deviceListBean.deviceId,
+ Integer.parseInt(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId),
+ psk,
+ deviceListBean.playToken,
+ bateMode,
+ true, true, imageSize
+ );
+ mPlayWin.playRtspReal(paramReal);
+
+ }
+
+ /**
+ * 停止播放
+ */
+ public void stop() {
+ captureLastPic();
+ stopRecord();// 关闭录像
+ closeAudio();// 关闭音频
+ stopTalk();//关闭对讲
+ rudderView.enable(false);
+ mPlayWin.stopRtspReal(true);// 关闭视频
+ }
+
+ /**
+ * 保存最后一帧做封面
+ */
+ private void captureLastPic() {
+ if (playStatus == PlayStatus.ERROR) {
+ return;
+ }
+ String capturePath;
+ try {
+ capturePath = capture(false);
+ } catch (Throwable e) {
+ capturePath = null;
+ }
+ if (capturePath == null) {
+ return;
+ }
+ DeviceLocalCacheService deviceLocalCacheService = ClassInstanceManager.newInstance().getDeviceLocalCacheService();
+ DeviceLocalCacheData deviceLocalCacheData = new DeviceLocalCacheData();
+ deviceLocalCacheData.setPicPath(capturePath);
+ deviceLocalCacheData.setDeviceName(deviceListBean.name);
+ deviceLocalCacheData.setDeviceId(deviceListBean.deviceId);
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ deviceLocalCacheData.setChannelId(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId);
+ deviceLocalCacheData.setChannelName(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ }
+ deviceLocalCacheService.addLocalCache(deviceLocalCacheData);
+ }
+
+ /**
+ * 开始录像
+ */
+ public boolean startRecord() {
+ // 录像的路径
+
+ String channelName = null;
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ channelName = deviceListBean.channels.get(deviceListBean.checkedChannel).channelName;
+ } else {
+ channelName = deviceListBean.name;
+ }
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+ videoPath = MediaPlayHelper.getCaptureAndVideoPath(MediaPlayHelper.DHFilesType.DHVideo, channelName);
+ LogUtil.debugLog(TAG, "videopath:::----start" + videoPath);
+ //MediaScannerConnection.scanFile(this, new String[]{videoPath}, null, null);
+ // 开始录制 1
+ int ret = mPlayWin.startRecord(videoPath, 1, 0x7FFFFFFF);
+ return ret == 0;
+ }
+
+ /**
+ * 关闭录像
+ */
+ public boolean stopRecord() {
+ return mPlayWin.stopRecord() == 0;
+ }
+
+ /**
+ * 截图
+ */
+ public String capture(boolean notify) {
+ String captureFilePath = null;
+ String channelName = null;
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ channelName = deviceListBean.channels.get(deviceListBean.checkedChannel).channelName;
+ } else {
+ channelName = deviceListBean.name;
+ }
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+ captureFilePath = MediaPlayHelper.getCaptureAndVideoPath(notify ? MediaPlayHelper.DHFilesType.DHImage : MediaPlayHelper.DHFilesType.DHImageCache, channelName);
+ int ret = mPlayWin.snapShot(captureFilePath);
+ if (ret == 0) {
+ if (notify) {
+ // 扫描到相册中
+ MediaPlayHelper.updatePhotoAlbum(captureFilePath);
+ // MediaScannerConnection.scanFile(this, new String[]{captureFilePath}, null, null);
+ }
+ } else {
+ captureFilePath = null;
+ }
+ return captureFilePath;
+ }
+
+ /**
+ * 打开声音
+ */
+ public boolean openAudio() {
+ return mPlayWin.playAudio() == 0;
+ }
+
+ /**
+ * 关闭声音
+ */
+ public boolean closeAudio() {
+ return mPlayWin.stopAudio() == 0;
+ }
+
+ /**
+ * 开始对讲 多通道通道号参数传入对应的通道号,单通道传-1
+ */
+ public void startTalk() {
+ closeAudio();
+ soundStatus = SoundStatus.STOP;
+ speakStatus = SpeakStatus.OPENING;
+ ivSound.setImageDrawable(getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off_disable));
+ llSound.setClickable(false);//声音按钮不允许点击
+ LCOpenSDK_Talk.setListener(audioTalkerListener);//对讲前先设备监听
+ int channelId = -1;
+
+ if (Integer.parseInt(deviceListBean.channelNum) > 1) {
+ /* if(null != deviceListBean.channels.get(deviceListBean.checkedChannel).channelId && !"".equals(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId)) {
+ channelId = Integer.parseInt(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId);
+ } else {
+ stopTalk();
+ Logger.e(TAG, "server returned NVR device channelId is null or empty charators");
+ return;
+ }*/
+ channelId = Integer.parseInt(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId);
+ Logger.d(TAG, "deviceCatalog = " + deviceListBean.catalog + ", routing device talk...");
+ }
+ Logger.d(TAG, "playTalk, channelId = " + channelId);
+ LCOpenSDK_ParamTalk paramTalk = new LCOpenSDK_ParamTalk(
+ SharedpreferencesUtil.get("accessToken", ""),
+ deviceListBean.deviceId,
+ channelId,
+ TextUtils.isEmpty(encryptKey) ? deviceListBean.deviceId : encryptKey,
+ deviceListBean.playToken,
+ true, "talk"
+ );
+ LCOpenSDK_Talk.playTalk(paramTalk);
+ }
+
+ /**
+ * 停止对讲
+ */
+ public void stopTalk() {
+ soundStatus = soundStatusPre;
+ if (SoundStatus.PLAY == soundStatus) {
+ ivSound.setImageDrawable(getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_on));
+ openAudio();
+ } else {
+ ivSound.setImageDrawable(getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off));
+ }
+ speakStatus = SpeakStatus.STOP;
+ ivSpeak.setImageDrawable(getDrawable(R.mipmap.lc_demo_livepreview_icon_speak));
+ ivSpeak1.setImageDrawable(getDrawable(R.mipmap.live_video_icon_h_talk_off));
+
+ LCOpenSDK_Talk.stopTalk();
+ LCOpenSDK_Talk.setListener(null);//停止对讲后对讲监听置为空
+ llSound.setClickable(true);
+ }
+
+ class AudioTalkerListener extends LCOpenSDK_TalkerListener {
+ public AudioTalkerListener() {
+ super();
+ }
+
+ @Override
+ public void onTalkResult(String error, int type) {
+ super.onTalkResult(error, type);
+ boolean talkResult = false;
+ if (type == 99 || error.equals("-1000") || error.equals("0") || error.equals("1") || error.equals("3")) {
+ talkResult = false;
+ } else if (error.equals("4")) {
+ talkResult = true;
+ }
+ final boolean finalTalkResult = talkResult;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (!finalTalkResult) {
+ stopTalk();
+ // 提示对讲打开失败
+ Toast.makeText(DeviceOnlineMediaPlayActivity.this, R.string.lc_demo_device_talk_open_failed, Toast.LENGTH_SHORT).show();
+ speakStatus = SpeakStatus.STOP;
+ ivSpeak.setImageDrawable(getDrawable(R.mipmap.lc_demo_livepreview_icon_speak));
+ ivSpeak1.setImageDrawable(getDrawable(R.mipmap.live_video_icon_h_talk_off));
+ } else {
+ // 提示对讲打开成功
+ Toast.makeText(DeviceOnlineMediaPlayActivity.this, R.string.lc_demo_device_talk_open_success, Toast.LENGTH_SHORT).show();
+ speakStatus = SpeakStatus.PLAY;
+ ivSpeak.setImageDrawable(getDrawable(R.mipmap.lc_demo_livepreview_icon_speak_ing));
+ ivSpeak1.setImageDrawable(getDrawable(R.mipmap.live_video_icon_h_talk_on));
+
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onTalkPlayReady() {
+ super.onTalkPlayReady();
+ }
+
+ @Override
+ public void onAudioRecord(byte[] bytes, int i, int i1, int i2, int i3) {
+ super.onAudioRecord(bytes, i, i1, i2, i3);
+ }
+
+ @Override
+ public void onAudioReceive(byte[] bytes, int i, int i1, int i2, int i3) {
+ super.onAudioReceive(bytes, i, i1, i2, i3);
+ }
+
+ @Override
+ public void onDataLength(int i) {
+ super.onDataLength(i);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.ll_back) {
+ //返回
+ finish();
+ } else if (id == R.id.ll_fullscreen) {
+ //横竖屏切换
+ if (mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT) {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ mCurrentOrientation = Configuration.ORIENTATION_LANDSCAPE;
+ } else {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ mCurrentOrientation = Configuration.ORIENTATION_PORTRAIT;
+ }
+ ivChangeScreen.setImageDrawable(mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ? getResources().getDrawable(R.mipmap.live_btn_smallscreen) : getResources().getDrawable(R.mipmap.video_fullscreen));
+ } else if (id == R.id.ll_detail) {
+ Bundle bundle = new Bundle();
+ bundle.putSerializable(MethodConst.ParamConst.deviceDetail, deviceListBean);
+ Intent intent = new Intent(DeviceOnlineMediaPlayActivity.this, DeviceDetailLCActivity.class);
+ intent.putExtras(bundle);
+ intent.putExtra("addressId", getIntent().getExtras().get("addressId").toString());
+ intent.putExtra("id", getIntent().getExtras().get("id").toString());
+ intent.putExtra("deviceId", getIntent().getExtras().get("deviceId").toString());
+ intent.putExtra("deviceType", getIntent().getExtras().get("deviceType").toString());
+ startActivityForResult(intent, 0);
+ } else if (id == R.id.ll_paly_pause) {
+ //播放暂停
+ if (playStatus == PlayStatus.PLAY) {
+ stop();
+ initAbility(false);
+ featuresClickListener(false);
+ llPlayPause.setOnClickListener(this);
+ } else {
+ getDeviceLocalCache();
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_loading), TextUtils.isEmpty(encryptKey) ? deviceListBean.deviceId : encryptKey);
+ }
+ playStatus = (playStatus == PlayStatus.PLAY) ? PlayStatus.PAUSE : PlayStatus.PLAY;
+ ivPalyPause.setImageDrawable(playStatus == PlayStatus.PLAY ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_pause) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_play));
+ } else if (id == R.id.ll_play_style) {
+ if (showHD) {
+ //视频清晰度切换
+ videoMode = (videoMode == VideoMode.MODE_HD) ? VideoMode.MODE_SD : VideoMode.MODE_HD;
+ ivPlayStyle.setImageDrawable(videoMode == VideoMode.MODE_HD ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_hd) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_sd));
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_change), TextUtils.isEmpty(encryptKey) ? deviceListBean.deviceId : encryptKey);
+ } else {
+ int offsetX = llPlayStyle.getWidth() / 3 * 2;
+ int offsetY = -(lcPopupWindow.getContentView().getMeasuredHeight() + 10);
+ PopupWindowCompat.showAsDropDown(lcPopupWindow, llPlayStyle, offsetX, offsetY, Gravity.START);
+ lcPopupWindow.setPixelRecycleListener(new LcPopupWindow.onRecyclerViewItemClickListener() {
+ @Override
+ public void onItemClick(RecyclerView parent, View view, int position, String name, int image_size, int streamType) {
+ tvPixel.setText(name);
+ lcPopupWindow.dismiss();
+ imageSize = image_size;
+ bateMode = streamType;
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_change), TextUtils.isEmpty(encryptKey) ? deviceListBean.deviceId : encryptKey);
+ }
+ });
+ }
+
+
+ } else if (id == R.id.ll_sound) {
+ //媒体声 如果是开启去关闭,反之
+ if (soundStatus == SoundStatus.NO_SUPPORT) {
+ return;
+ }
+ boolean result = false;
+ if (soundStatus == SoundStatus.PLAY) {
+ result = closeAudio();
+ } else {
+ result = openAudio();
+ }
+ if (!result) {
+ return;
+ }
+ soundStatus = (soundStatus == SoundStatus.PLAY) ? SoundStatus.STOP : SoundStatus.PLAY;
+ ivSound.setImageDrawable(soundStatus == SoundStatus.PLAY ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_on) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off));
+ } else if (id == R.id.ll_cloudstage || id == R.id.ll_cloudstage1) {
+ //云台和录像列表切换
+ switchCloudRudder(!isShwoRudder);
+ } else if (id == R.id.ll_screenshot || id == R.id.ll_screenshot1) {
+ //截图
+ if (capture(true) != null) {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_capture_success), Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_capture_failed), Toast.LENGTH_SHORT).show();
+ }
+ } else if (id == R.id.iv_speak || id == R.id.iv_speak1) {
+ //对讲 如果是打开状态去关闭,反之
+ if (speakStatus == SpeakStatus.NO_SUPPORT || speakStatus == SpeakStatus.OPENING) {
+ return;
+ }
+ if (speakStatus == SpeakStatus.STOP) {
+ soundStatusPre = soundStatus;
+ startTalk();
+ } else {
+ Toast.makeText(DeviceOnlineMediaPlayActivity.this, R.string.lc_demo_device_talk_close_success, Toast.LENGTH_SHORT).show();
+ stopTalk();
+
+ }
+ } else if (id == R.id.ll_video || id == R.id.ll_video1) {
+ //录像 如果是关闭状态去打开,反之
+ if (recordStatus == RecordStatus.STOP) {
+ if (startRecord()) {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_record_begin), Toast.LENGTH_SHORT).show();
+ } else {
+ return;
+ }
+ } else {
+ if (stopRecord()) {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_record_stop), Toast.LENGTH_SHORT).show();
+ LogUtil.debugLog(TAG, "videopath:::" + videoPath);
+ MediaPlayHelper.updatePhotoVideo(videoPath);
+ } else {
+ return;
+ }
+ }
+ recordStatus = (recordStatus == RecordStatus.START) ? RecordStatus.STOP : RecordStatus.START;
+ ivVideo.setImageDrawable(recordStatus == RecordStatus.START
+ ? getDrawable(R.mipmap.lc_demo_livepreview_icon_video_ing)
+ : getDrawable(R.mipmap.lc_demo_livepreview_icon_video));
+ ivVideo1.setImageDrawable(recordStatus == RecordStatus.START
+ ? getDrawable(R.mipmap.live_video_icon_h_video_on)
+ : getDrawable(R.mipmap.live_video_icon_h_video_off));
+ } else if (id == R.id.tv_cloud_video) {
+ //切换至云录像
+ switchVideoList(true);
+ } else if (id == R.id.tv_local_video) {
+ //切换至设备录像
+ switchVideoList(false);
+ } else if (id == R.id.tv_no_video) {
+ //暂无录像切换
+ gotoRecordList();
+ }
+ }
+
+ private void switchCloudRudder(boolean isShow) {
+ this.isShwoRudder = isShow;
+ if (isShow) {
+ ivCloudStage.setImageDrawable(getDrawable(R.mipmap.lc_demo_livepreview_icon_cloudstage_click));
+ ivCloudStage1.setImageDrawable(getDrawable(R.mipmap.live_video_icon_h_cloudterrace_on));
+ llVideoContent.setVisibility(View.GONE);
+ rudderView.setVisibility(View.VISIBLE);
+ } else {
+ ivCloudStage.setImageDrawable(supportPTZ
+ ? getDrawable(R.mipmap.lc_demo_livepreview_icon_cloudstage)
+ : getDrawable(R.mipmap.lc_demo_livepreview_icon_cloudstage_disable));
+ ivCloudStage1.setImageDrawable(supportPTZ
+ ? getDrawable(R.mipmap.live_video_icon_h_cloudterrace_off)
+ : getDrawable(R.mipmap.live_video_icon_h_cloudterrace_off_disable));
+ llVideoContent.setVisibility(mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ? View.VISIBLE : View.GONE);
+ rudderView.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mPlayWin.uninitPlayWindow();// 销毁底层资源
+ uninitOrientationEventListener();
+ EventBus.getDefault().unregister(this);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ boolean unBind = data.getBooleanExtra(DeviceConstant.IntentKey.DHDEVICE_UNBIND, false);
+ if (unBind) {
+ finish();
+ }
+ }
+ if (resultCode == 100 && data != null) {
+ String name = data.getStringExtra(DeviceConstant.IntentKey.DHDEVICE_NEW_NAME);
+ tvDeviceName.setText(name);
+ deviceListBean.channels.get(deviceListBean.checkedChannel).channelName = name;
+ }
+ }
+
+
+ public static final int NO_ORIENTATION_REQUEST = -1;
+
+ public static final int MSG_REQUEST_ORIENTATION = 1;
+
+
+ private void initOrientationEventListener() {
+
+ mOrientationEventListener = new MediaPlayOrientationEventListener(this,
+ SensorManager.SENSOR_DELAY_NORMAL, mHandler);
+
+ if (mOrientationEventListener.canDetectOrientation()) {
+ mOrientationEventListener.enable();
+ } else {
+ mOrientationEventListener.disable();
+ }
+ }
+
+
+ private void uninitOrientationEventListener() {
+ if (mOrientationEventListener != null) {
+ mOrientationEventListener.disable();
+ mOrientationEventListener = null;
+ }
+ }
+
+
+ static class MediaPlayOrientationEventListener extends OrientationEventListener {
+
+ private WeakReference mWRHandler;
+
+ private int mOrientationEventListenerLastOrientationRequest = NO_ORIENTATION_REQUEST;
+
+ public MediaPlayOrientationEventListener(Context context, int rate, Handler handler) {
+ super(context, rate);
+ mWRHandler = new WeakReference(handler);
+ }
+
+ @Override
+ public void onOrientationChanged(int orientation) {
+
+ int requestedOrientation = createOrientationRequest(orientation);
+ if (requestedOrientation != NO_ORIENTATION_REQUEST
+ && mOrientationEventListenerLastOrientationRequest != requestedOrientation) {
+
+ Handler handler = mWRHandler.get();
+
+ if (handler != null) {
+ handler.removeMessages(MSG_REQUEST_ORIENTATION);
+ Message msg = handler.obtainMessage(MSG_REQUEST_ORIENTATION);
+ msg.arg1 = requestedOrientation;
+ handler.sendMessageDelayed(msg, 200);
+ mOrientationEventListenerLastOrientationRequest = requestedOrientation;
+ }
+ }
+ }
+
+ private int createOrientationRequest(int rotation) {
+ int requestedOrientation = NO_ORIENTATION_REQUEST;
+
+ if (rotation == -1) {
+
+ } else if (rotation < 10 || rotation > 350) {// 手机顶部向上
+
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+
+ } else if (rotation < 100 && rotation > 80) {// 手机左边向上
+
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
+
+ } else if (rotation < 190 && rotation > 170) {// 手机底边向上
+
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
+
+ } else if (rotation < 280 && rotation > 260) {// 手机右边向上
+
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+ }
+
+ return requestedOrientation;
+ }
+
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceRecordListActivity.java b/app/src/main/java/com/lechange/demo/ui/DeviceRecordListActivity.java
new file mode 100644
index 0000000..0f5ea51
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceRecordListActivity.java
@@ -0,0 +1,110 @@
+package com.lechange.demo.ui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.common.openapi.MethodConst;
+import com.yonsz.z1.R;
+
+public class DeviceRecordListActivity extends AppCompatActivity implements View.OnClickListener {
+
+ private static final String TAG = DeviceRecordListActivity.class.getSimpleName();
+ private TextView tvCloudRecord;
+ private TextView tvLocalRecord;
+ private Bundle bundle;
+ private DeviceCloudRecordListFragment deviceCloudRecordListFragment = DeviceCloudRecordListFragment.newInstance();
+ private DeviceLocalRecordListFragment deviceLocalRecordListFragment = DeviceLocalRecordListFragment.newInstance();
+ private FragmentManager supportFragmentManager;
+ private Fragment currentFragment;
+ public LinearLayout llEdit;
+ public LinearLayout llAll;
+ public LinearLayout llBack;
+ public TextView tvEdit;
+ private int recordType;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_device_record_list);
+ supportFragmentManager = getSupportFragmentManager();
+ initView();
+ initData();
+ }
+
+ private void initData() {
+ bundle = getIntent().getExtras();
+ recordType = bundle.getInt(MethodConst.ParamConst.recordType);
+ if (recordType == MethodConst.ParamConst.recordTypeCloud ? showFragment(deviceCloudRecordListFragment) : showFragment(deviceLocalRecordListFragment)) {
+ tvCloudRecord.setSelected(recordType == MethodConst.ParamConst.recordTypeCloud);
+ tvLocalRecord.setSelected(recordType == MethodConst.ParamConst.recordTypeLocal);
+ }
+ }
+
+ private void initView() {
+ findViewById(R.id.ll_back).setOnClickListener(this);
+ llBack = findViewById(R.id.ll_back);
+ llEdit = findViewById(R.id.ll_edit);
+ llAll = findViewById(R.id.ll_all);
+ tvEdit = findViewById(R.id.tv_edit);
+ tvCloudRecord = findViewById(R.id.tv_cloud_record);
+ tvLocalRecord = findViewById(R.id.tv_local_record);
+ tvCloudRecord.setOnClickListener(this);
+ tvLocalRecord.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.ll_back) {
+ finish();
+ } else if (id == R.id.tv_cloud_record) {
+ if (showFragment(deviceCloudRecordListFragment)) {
+ tvCloudRecord.setSelected(true);
+ tvLocalRecord.setSelected(false);
+ }
+ } else if (id == R.id.tv_local_record) {
+ if (showFragment(deviceLocalRecordListFragment)) {
+ tvCloudRecord.setSelected(false);
+ tvLocalRecord.setSelected(true);
+ }
+ }
+ }
+
+ private boolean showFragment(Fragment fragment) {
+ if (currentFragment != fragment) {
+ FragmentTransaction transaction = supportFragmentManager.beginTransaction();
+ if (currentFragment != null) {
+ transaction.hide(currentFragment);
+ }
+ currentFragment = fragment;
+ fragment.setArguments(bundle);
+ if (!fragment.isAdded()) {
+ transaction.add(R.id.fr_content, fragment).show(fragment).commit();
+ } else {
+ transaction.show(fragment).commit();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ boolean delete = data.getBooleanExtra("data", false);
+ if (delete && deviceCloudRecordListFragment != null) {
+ deviceCloudRecordListFragment.deleteCloudRecord();
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/ui/DeviceRecordPlayActivity.java b/app/src/main/java/com/lechange/demo/ui/DeviceRecordPlayActivity.java
new file mode 100644
index 0000000..54357a8
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/ui/DeviceRecordPlayActivity.java
@@ -0,0 +1,1000 @@
+package com.lechange.demo.ui;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.media.MediaScannerConnection;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+import android.widget.SeekBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.common.openapi.ClassInstanceManager;
+import com.common.openapi.DeviceRecordService;
+import com.common.openapi.IGetDeviceInfoCallBack;
+import com.common.openapi.MethodConst;
+import com.common.openapi.entity.DeleteCloudRecordsData;
+import com.common.openapi.entity.DeviceDetailListData;
+import com.common.openapi.entity.RecordsData;
+import com.lechange.demo.dialog.EncryptKeyInputDialog;
+import com.lechange.demo.tools.DateHelper;
+import com.lechange.demo.tools.DialogUtils;
+import com.lechange.demo.tools.MediaPlayHelper;
+import com.lechange.demo.view.LcProgressBar;
+import com.lechange.demo.view.RecoderSeekBar;
+import com.lechange.opensdk.listener.LCOpenSDK_DownloadListener;
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.lechange.opensdk.media.LCOpenSDK_Download;
+import com.lechange.opensdk.media.LCOpenSDK_ParamCloudRecord;
+import com.lechange.opensdk.media.LCOpenSDK_ParamDeviceRecord;
+import com.lechange.opensdk.media.LCOpenSDK_PlayWindow;
+import com.mm.android.deviceaddmodule.LCDeviceEngine;
+import com.mm.android.deviceaddmodule.mobilecommon.dialog.LCAlertDialog;
+import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
+import com.yonsz.z1.R;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DeviceRecordPlayActivity extends AppCompatActivity implements View.OnClickListener, IGetDeviceInfoCallBack.IDeviceDeleteRecordCallBack {
+ private static final String TAG = DeviceRecordPlayActivity.class.getSimpleName();
+ private FrameLayout frLiveWindow, frLiveWindowContent;
+ private TextView tvDeviceName, tvLoadingMsg, recordStartTime, recordEndTime;
+ private LinearLayout llFullScreen, llSound, llPlayStyle, llPlayPause, llDelete, llBack, llScreenshot, llVideo;
+ private ImageView ivPalyPause, ivPlayStyle, ivSound, ivScreenShot, ivVideo;
+ private ProgressBar pbLoading;
+ private RelativeLayout rlLoading;
+ private LcProgressBar pgDownload;
+ private DeviceDetailListData.ResponseData.DeviceListBean deviceListBean;
+ private Bundle bundle;
+ private LCOpenSDK_PlayWindow mPlayWin = new LCOpenSDK_PlayWindow();
+ private RecordsData recordsData;
+ //1 云录像 2 设备录像
+ private int recordType;
+ private RecoderSeekBar recordSeekbar;
+ private int progress;
+ private String beginTime;
+
+ private SoundStatus soundStatus = SoundStatus.PLAY;
+ private PlayStatus playStatus = PlayStatus.PAUSE;
+ private RecordStatus recordStatus = RecordStatus.STOP;
+ private DownloadStatus downloadStatus = DownloadStatus.UNBEGIN;
+ //倍速位置
+ private int speedPosition = 0;
+ //倍速数组
+ private int[] speed = {1, 4, 8, 16};
+ //倍速图片
+ private Drawable[] speedImage = new Drawable[4];
+ private DeviceRecordService deviceRecordService = ClassInstanceManager.newInstance().getDeviceRecordService();
+ private String totalMb;
+ private ImageView ivChangeScreen;
+ private LinearLayout llOperate;
+ private RelativeLayout rlTitle;
+ private EncryptKeyInputDialog encryptKeyInputDialog;
+ private String encryptKey;
+ private String path;
+ private LCAlertDialog mLCAlertDialog;
+ private int passcode;
+
+ public enum LoadStatus {
+ LOADING, LOAD_SUCCESS, LOAD_ERROR
+ }
+
+ public enum SoundStatus {
+ PLAY, STOP, NO_SUPPORT
+ }
+
+ public enum PlayStatus {
+ PLAY, PAUSE, ERROR, STOP
+ }
+
+ public enum RecordStatus {
+ START, STOP
+ }
+
+ public enum DownloadStatus {
+ UNBEGIN, ING, FINISH, ERROR
+ }
+
+
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mCurrentOrientation = getResources().getConfiguration().orientation;
+ setContentView(R.layout.activity_device_record_play);
+ initView();
+ initData();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ if (mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT) {
+ LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(frLiveWindow.getLayoutParams());
+ DisplayMetrics metric = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ frLiveWindow.setLayoutParams(mLayoutParams);
+ MediaPlayHelper.quitFullScreen(DeviceRecordPlayActivity.this);
+ llOperate.setVisibility(View.VISIBLE);
+ if (recordType == MethodConst.ParamConst.recordTypeLocal) {
+ pgDownload.setVisibility(View.GONE);
+ } else {
+ pgDownload.setVisibility(View.VISIBLE);
+ }
+ rlTitle.setVisibility(View.VISIBLE);
+ } else if (mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
+ DisplayMetrics metric = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(metric);
+ LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(metric.widthPixels, metric.heightPixels);
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ frLiveWindow.setLayoutParams(mLayoutParams);
+ MediaPlayHelper.setFullScreen(DeviceRecordPlayActivity.this);
+ llOperate.setVisibility(View.GONE);
+ pgDownload.setVisibility(View.GONE);
+ rlTitle.setVisibility(View.GONE);
+ }
+ }
+
+ private void initData() {
+ speedImage[0] = getResources().getDrawable(R.mipmap.play_module_video_1x);
+ speedImage[1] = getResources().getDrawable(R.mipmap.play_module_video_4x);
+ speedImage[2] = getResources().getDrawable(R.mipmap.play_module_video_8x);
+ speedImage[3] = getResources().getDrawable(R.mipmap.play_module_video_16x);
+ bundle = getIntent().getExtras();
+ if (bundle == null) {
+ return;
+ }
+ deviceListBean = (DeviceDetailListData.ResponseData.DeviceListBean) bundle.getSerializable(MethodConst.ParamConst.deviceDetail);
+ recordsData = (RecordsData) bundle.getSerializable(MethodConst.ParamConst.recordData);
+ recordType = bundle.getInt(MethodConst.ParamConst.recordType);
+ tvDeviceName.setText(deviceListBean.channels.get(deviceListBean.checkedChannel).channelName);
+ if (recordType == MethodConst.ParamConst.recordTypeLocal) {
+ llDelete.setVisibility(View.GONE);
+ pgDownload.setVisibility(View.GONE);
+ totalMb = byte2mb(Long.parseLong(recordsData.fileLength + ""));
+ } else {
+ totalMb = byte2mb(Long.parseLong(recordsData.size));
+ }
+ //初始化时间
+ initSeekBarAndTime();
+ //初始化控件
+ initCommonClickListener();
+ //播放视频
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_loading), deviceListBean.deviceId);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ pauseAsync();
+ playStatus = PlayStatus.PAUSE;
+ ivPalyPause.setImageDrawable(getDrawable(R.mipmap.lc_demo_live_video_icon_h_play));
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ stop();
+ mPlayWin.uninitPlayWindow();// 销毁底层资源
+ }
+
+ private void playVideo(String psk) {
+ if (recordType == MethodConst.ParamConst.recordTypeCloud) {
+ //云录像
+ LCOpenSDK_ParamCloudRecord paramCloudRecord = new LCOpenSDK_ParamCloudRecord(
+ LCDeviceEngine.newInstance().accessToken,
+ deviceListBean.deviceId,
+ Integer.parseInt(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId),
+ psk,
+ deviceListBean.playToken,
+ recordsData.recordRegionId,
+ 1000,
+ 0,
+ 24 * 3600
+ );
+
+ mPlayWin.playCloud(paramCloudRecord);
+ } else if (recordType == MethodConst.ParamConst.recordTypeLocal) {
+ //设备录像
+ LCOpenSDK_ParamDeviceRecord paramDeviceRecord = new LCOpenSDK_ParamDeviceRecord(
+ LCDeviceEngine.newInstance().accessToken,
+ deviceListBean.deviceId,
+ Integer.parseInt(deviceListBean.channels.get(deviceListBean.checkedChannel).channelId),
+ psk,
+ deviceListBean.playToken,
+ recordsData.recordId,
+ DateHelper.parseMills(recordsData.beginTime),
+ DateHelper.parseMills(recordsData.endTime),
+ 0,
+ 0,
+ true
+ );
+
+ mPlayWin.playRtspPlayback(paramDeviceRecord);
+ }
+ }
+
+ private void stop() {
+ stopPlayWindow();
+ //禁止拖动
+ setCanSeekChanged(false);
+ }
+
+ /**
+ * 单独关闭播放 注意:组件要求必须要主线程调用
+ */
+ private void stopPlayWindow() {
+ closeAudio();// 关闭音频
+ if (recordType == MethodConst.ParamConst.recordTypeCloud) {
+ mPlayWin.stopCloud(true);
+ } else {
+ mPlayWin.stopRtspPlayback(true);// 关闭视频
+ }
+ }
+
+ /**
+ * 设置拖动进度条是否能使用
+ */
+ public void setCanSeekChanged(boolean canSeek) {
+ recordSeekbar.setCanTouchAble(canSeek);
+ }
+
+ /**
+ * 开始录像
+ */
+ public boolean startRecord() {
+ // 录像的路径
+ String videoPath = null;
+ String channelName = null;
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ channelName = deviceListBean.channels.get(deviceListBean.checkedChannel).channelName;
+ } else {
+ channelName = deviceListBean.name;
+ }
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+ videoPath = MediaPlayHelper.getCaptureAndVideoPath(MediaPlayHelper.DHFilesType.DHVideo, channelName);
+ MediaScannerConnection.scanFile(this, new String[]{videoPath}, null, null);
+ // 开始录制 1
+ int ret = mPlayWin.startRecord(videoPath, 1, 0x7FFFFFFF);
+ return ret == 0;
+ }
+
+ /**
+ * 关闭录像
+ */
+ public boolean stopRecord() {
+ return mPlayWin.stopRecord() == 0;
+ }
+
+ /**
+ * 截图
+ */
+ public String capture() {
+ String captureFilePath = null;
+ String channelName = null;
+ if (deviceListBean.channels != null && deviceListBean.channels.size() > 0) {
+ channelName = deviceListBean.channels.get(deviceListBean.checkedChannel).channelName;
+ } else {
+ channelName = deviceListBean.name;
+ }
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+ captureFilePath = MediaPlayHelper.getCaptureAndVideoPath(MediaPlayHelper.DHFilesType.DHImage, channelName);
+ int ret = mPlayWin.snapShot(captureFilePath);
+ if (ret == 0) {
+ // 扫描到相册中
+ MediaScannerConnection.scanFile(this, new String[]{captureFilePath}, null, null);
+ } else {
+ captureFilePath = null;
+ }
+ return captureFilePath;
+ }
+
+ private void initView() {
+ frLiveWindow = findViewById(R.id.fr_live_window);
+ frLiveWindowContent = findViewById(R.id.fr_live_window_content);
+ llBack = findViewById(R.id.ll_back);
+ tvDeviceName = findViewById(R.id.tv_device_name);
+ llDelete = findViewById(R.id.ll_delete);
+ llPlayPause = findViewById(R.id.ll_paly_pause);
+ llPlayStyle = findViewById(R.id.ll_play_style);
+ llSound = findViewById(R.id.ll_sound);
+ llFullScreen = findViewById(R.id.ll_fullscreen);
+ ivPalyPause = findViewById(R.id.iv_paly_pause);
+ ivPlayStyle = findViewById(R.id.iv_play_style);
+ ivSound = findViewById(R.id.iv_sound);
+ rlLoading = findViewById(R.id.rl_loading);
+ pbLoading = findViewById(R.id.pb_loading);
+ tvLoadingMsg = findViewById(R.id.tv_loading_msg);
+ recordStartTime = findViewById(R.id.record_startTime);
+ recordSeekbar = findViewById(R.id.record_seekbar);
+ recordEndTime = findViewById(R.id.record_endTime);
+ llScreenshot = findViewById(R.id.ll_screenshot);
+ llVideo = findViewById(R.id.ll_video);
+ ivScreenShot = findViewById(R.id.iv_screen_shot);
+ ivVideo = findViewById(R.id.iv_video);
+ pgDownload = findViewById(R.id.pg_download);
+ ivChangeScreen = findViewById(R.id.iv_change_screen);
+ llOperate = findViewById(R.id.ll_operate);
+ rlTitle = findViewById(R.id.rl_title);
+ pgDownload.setText(getResources().getString(R.string.lc_demo_device_record_download));
+ // 初始化播放窗口
+ LinearLayout.LayoutParams mLayoutParams = (LinearLayout.LayoutParams) frLiveWindow
+ .getLayoutParams();
+ DisplayMetrics metric = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ frLiveWindow.setLayoutParams(mLayoutParams);
+ mPlayWin.initPlayWindow(this, frLiveWindowContent, 0, false);
+ setWindowListener(mPlayWin);
+ mPlayWin.openTouchListener();//开启收拾监听
+ }
+
+ private void initCommonClickListener() {
+ llBack.setOnClickListener(this);
+ llFullScreen.setOnClickListener(this);
+ if (recordType == MethodConst.ParamConst.recordTypeCloud) {
+ llDelete.setOnClickListener(this);
+ pgDownload.setOnClickListener(this);
+ LCOpenSDK_Download.setListener(new CloudDownloadListener());
+ }
+ }
+
+ private void featuresClickListener(boolean loadSuccess) {
+ llPlayStyle.setOnClickListener(loadSuccess ? this : null);
+ llPlayPause.setOnClickListener(loadSuccess ? this : null);
+ llSound.setOnClickListener(loadSuccess ? this : null);
+ ivScreenShot.setOnClickListener(loadSuccess ? this : null);
+ ivVideo.setOnClickListener(loadSuccess ? this : null);
+ ivPalyPause.setImageDrawable(loadSuccess ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_pause) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_pause_disable));
+ ivSound.setImageDrawable(loadSuccess ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off_disable));
+ ivScreenShot.setImageDrawable(loadSuccess ? getDrawable(R.drawable.lc_demo_photo_capture_selector) : getDrawable(R.mipmap.lc_demo_livepreview_icon_screenshot_disable));
+ ivVideo.setImageDrawable(loadSuccess ? getDrawable(R.mipmap.lc_demo_livepreview_icon_video) : getDrawable(R.mipmap.lc_demo_livepreview_icon_video_disable));
+ //媒体声
+ if (soundStatus != SoundStatus.PLAY) {
+ return;
+ }
+ if (openAudio()) {
+ soundStatus = SoundStatus.PLAY;
+ ivSound.setImageDrawable(getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_on));
+ }
+ }
+
+ private void initSeekBarAndTime() {
+ String startTime = recordsData.beginTime.substring(11);
+ String endTime = recordsData.endTime.substring(11);
+ recordSeekbar.setMax((int) ((DateHelper.parseMills(recordsData.endTime) - DateHelper.parseMills(recordsData.beginTime)) / 1000));
+ recordSeekbar.setProgress(0);
+ recordStartTime.setText(startTime);
+ recordEndTime.setText(endTime);
+ }
+
+
+ private void setSeekBarListener() {
+ recordSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+
+ if (recordSeekbar.getMax() - DeviceRecordPlayActivity.this.progress <= 2) {
+ seek(recordSeekbar.getMax() >= 2 ? recordSeekbar.getMax() - 2 : 0);
+ } else {
+ seek(DeviceRecordPlayActivity.this.progress);
+ }
+
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean byUser) {
+ if (byUser) {
+ DeviceRecordPlayActivity.this.progress = progress;
+ }
+ }
+ });
+ }
+
+ /**
+ * 继续播放(异步)
+ */
+ public void resumeAsync() {
+ mPlayWin.resumeAsync();
+ }
+
+ /**
+ * 暂停播放(异步)
+ */
+ public void pauseAsync() {
+ mPlayWin.pauseAsync();
+ }
+
+ public boolean openAudio() {
+ return mPlayWin.playAudio() == 0;
+ }
+
+ public boolean closeAudio() {
+ return mPlayWin.stopAudio() == 0;
+ }
+
+ public void seek(int index) {
+ long seekTime = DateHelper.parseMills(recordsData.beginTime) / 1000 + index;
+ //先暂存时间记录
+ beginTime = DateHelper.getTimeHMS(seekTime * 1000);
+ this.progress = index;
+ recordSeekbar.setProgress(index);
+ recordStartTime.setText(this.beginTime);
+ mPlayWin.seek(index);
+ }
+
+ private int mCurrentOrientation;
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ if (id == R.id.ll_back) {
+ if (downloadStatus == DownloadStatus.ING) {
+ LCAlertDialog.Builder builder = new LCAlertDialog.Builder(this);
+ builder.setTitle(R.string.lc_demo_device_delete_exit);
+ builder.setMessage(R.string.lc_demo_device_delete_exit_tip);
+ builder.setCancelButton(com.mm.android.deviceaddmodule.R.string.common_cancel, null);
+ builder.setConfirmButton(com.mm.android.deviceaddmodule.R.string.common_confirm,
+ new LCAlertDialog.OnClickListener() {
+ @Override
+ public void onClick(LCAlertDialog dialog, int which, boolean isChecked) {
+ stopDownLoad();
+ finish();
+ }
+ });
+ mLCAlertDialog = builder.create();
+ mLCAlertDialog.show(getSupportFragmentManager(), "exit");
+ return;
+ }
+ finish();
+ } else if (id == R.id.ll_fullscreen) {
+ //横竖屏切换
+ if (mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT) {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ mCurrentOrientation = Configuration.ORIENTATION_LANDSCAPE;
+ } else {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ mCurrentOrientation = Configuration.ORIENTATION_PORTRAIT;
+ }
+ ivChangeScreen.setImageDrawable(mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ? getResources().getDrawable(R.mipmap.live_btn_smallscreen) : getResources().getDrawable(R.mipmap.video_fullscreen));
+ } else if (id == R.id.pg_download) {
+ //下载
+ if (downloadStatus == DownloadStatus.ING || downloadStatus == DownloadStatus.FINISH) {
+ return;
+ }
+ pgDownloadProgress(
+ getResources().getString(R.string.lc_demo_device_record_download_begin),
+ 0,
+ 100,
+ getResources().getColor(R.color.lc_demo_color_ffffff));
+ downloadStatus = DownloadStatus.ING;
+ startDownload();
+ } else if (id == R.id.ll_play_style) {
+ if (speedPosition == 3) {
+ speedPosition = 0;
+ } else {
+ speedPosition = speedPosition + 1;
+ }
+ ivPlayStyle.setImageDrawable(speedImage[speedPosition]);
+ mPlayWin.setPlaySpeed(speed[speedPosition]);
+ } else if (id == R.id.ll_delete) {
+ LCAlertDialog.Builder builder = new LCAlertDialog.Builder(this);
+ builder.setTitle(R.string.lc_demo_device_delete_sure);
+ builder.setMessage("");
+ builder.setCancelButton(com.mm.android.deviceaddmodule.R.string.common_cancel, null);
+ builder.setConfirmButton(com.mm.android.deviceaddmodule.R.string.common_confirm,
+ new LCAlertDialog.OnClickListener() {
+ @Override
+ public void onClick(LCAlertDialog dialog, int which, boolean isChecked) {
+ //删除
+ DialogUtils.show(DeviceRecordPlayActivity.this);
+ DeleteCloudRecordsData deleteCloudRecordsData = new DeleteCloudRecordsData();
+ List recordRegionIds = new ArrayList<>();
+ recordRegionIds.add(recordsData.recordRegionId);
+ deleteCloudRecordsData.data.recordRegionIds = recordRegionIds;
+ deviceRecordService.deleteCloudRecords(deleteCloudRecordsData, DeviceRecordPlayActivity.this);
+ }
+ });
+ mLCAlertDialog = builder.create();
+ mLCAlertDialog.show(getSupportFragmentManager(), "delete");
+ } else if (id == R.id.ll_paly_pause) {
+ //播放暂停 重新播放
+ if (playStatus == PlayStatus.PLAY) {
+ pauseAsync();
+ featuresClickListener(false);
+ llPlayPause.setOnClickListener(this);
+ playStatus = (playStatus == PlayStatus.PLAY) ? PlayStatus.PAUSE : PlayStatus.PLAY;
+ ivPalyPause.setImageDrawable(playStatus == PlayStatus.PLAY ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_pause) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_play));
+ } else if (playStatus == PlayStatus.PAUSE) {
+ resumeAsync();
+ featuresClickListener(true);
+ llPlayPause.setOnClickListener(this);
+ playStatus = (playStatus == PlayStatus.PLAY) ? PlayStatus.PAUSE : PlayStatus.PLAY;
+ ivPalyPause.setImageDrawable(playStatus == PlayStatus.PLAY ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_pause) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_play));
+ } else {
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_change), TextUtils.isEmpty(encryptKey) ? deviceListBean.deviceId : encryptKey);
+ }
+ } else if (id == R.id.ll_sound) {
+ //媒体声 如果是开启去关闭,反之
+ if (soundStatus == SoundStatus.NO_SUPPORT) {
+ return;
+ }
+ boolean result = false;
+ if (soundStatus == SoundStatus.PLAY) {
+ result = closeAudio();
+ } else {
+ result = openAudio();
+ }
+ if (!result) {
+ return;
+ }
+ soundStatus = (soundStatus == SoundStatus.PLAY) ? SoundStatus.STOP : SoundStatus.PLAY;
+ ivSound.setImageDrawable(soundStatus == SoundStatus.PLAY ? getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_on) : getDrawable(R.mipmap.lc_demo_live_video_icon_h_sound_off));
+ } else if (id == R.id.iv_screen_shot) {
+ //截图
+ if (capture() != null) {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_capture_success), Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_capture_failed), Toast.LENGTH_SHORT).show();
+ }
+ } else if (id == R.id.iv_video) {
+ if (playStatus != PlayStatus.PLAY) {
+ return;
+ }
+ //录像 如果是关闭状态去打开,反之
+ if (recordStatus == RecordStatus.STOP) {
+ if (startRecord()) {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_record_begin), Toast.LENGTH_SHORT).show();
+ } else {
+ return;
+ }
+ } else {
+ if (stopRecord()) {
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_record_stop), Toast.LENGTH_SHORT).show();
+ } else {
+ return;
+ }
+ }
+ recordStatus = (recordStatus == RecordStatus.START) ? RecordStatus.STOP : RecordStatus.START;
+ ivVideo.setImageDrawable(recordStatus == RecordStatus.START ? getDrawable(R.mipmap.lc_demo_livepreview_icon_video_ing) : getDrawable(R.mipmap.lc_demo_livepreview_icon_video));
+ }
+ }
+
+ private void setWindowListener(LCOpenSDK_PlayWindow playWin) {
+ playWin.setWindowListener(new LCOpenSDK_EventListener() {
+ //手势缩放开始事件
+ @Override
+ public void onZoomBegin(int index) {
+ super.onZoomBegin(index);
+ LogUtil.debugLog(TAG, "onZoomBegin: index= " + index);
+ }
+
+ //手势缩放中事件
+ @Override
+ public void onZooming(int index, float dScale) {
+ super.onZooming(index, dScale);
+ LogUtil.debugLog(TAG, "onZooming: index= " + index + " , dScale= " + dScale);
+ mPlayWin.doScale(dScale);
+ }
+
+ //缩放结束事件
+ @Override
+ public void onZoomEnd(int index, ZoomType zoomType) {
+ super.onZoomEnd(index, zoomType);
+ LogUtil.debugLog(TAG, "onZoomEnd: index= " + index + " , zoomType= " + zoomType);
+ }
+
+ //窗口单击事件
+ @Override
+ public void onControlClick(int index, float dx, float dy) {
+ super.onControlClick(index, dx, dy);
+ LogUtil.debugLog(TAG, "onControlClick: index= " + index + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //窗口双击事件
+ @Override
+ public void onWindowDBClick(int index, float dx, float dy) {
+ super.onWindowDBClick(index, dx, dy);
+ LogUtil.debugLog(TAG, "onWindowDBClick: index= " + index + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //滑动开始事件
+ @Override
+ public boolean onSlipBegin(int index, Direction direction, float dx, float dy) {
+ LogUtil.debugLog(TAG, "onSlipBegin: index= " + index + " , direction= " + direction + " , dx= " + dx + " , dy= " + dy);
+ return super.onSlipBegin(index, direction, dx, dy);
+ }
+
+ //滑动中事件
+ @Override
+ public void onSlipping(int index, Direction direction, float prex, float prey, float dx, float dy) {
+ super.onSlipping(index, direction, prex, prey, dx, dy);
+ LogUtil.debugLog(TAG, "onSlipping: index= " + index + " , direction= " + direction + " , prex= " + prex + " , prey= " + prey + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //滑动结束事件
+ @Override
+ public void onSlipEnd(int index, Direction direction, float dx, float dy) {
+ super.onSlipEnd(index, direction, dx, dy);
+ LogUtil.debugLog(TAG, "onSlipEnd: index= " + index + " , direction= " + direction + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //长按开始回调
+ @Override
+ public void onWindowLongPressBegin(int index, Direction direction, float dx, float dy) {
+ super.onWindowLongPressBegin(index, direction, dx, dy);
+ LogUtil.debugLog(TAG, "onWindowLongPressBegin: index= " + index + " , direction= " + direction + " , dx= " + dx + " , dy= " + dy);
+ }
+
+ //长按事件结束
+ @Override
+ public void onWindowLongPressEnd(int index) {
+ super.onWindowLongPressEnd(index);
+ LogUtil.debugLog(TAG, "onWindowLongPressEnd: index= " + index);
+ }
+
+ /**
+ * 播放事件回调
+ * resultSource: 0--RTSP 1--HLS 5--DHHTTP 99--OPENAPI
+ */
+ @Override
+ public void onPlayerResult(int index, String code, int resultSource) {
+ super.onPlayerResult(index, code, resultSource);
+ LogUtil.debugLog(TAG, "onPlayerResult: index= " + index + " , code= " + code + " , resultSource= " + resultSource);
+ boolean failed = false;
+
+ if (resultSource == 99) {
+ //code -1000 HTTP交互出错或超时
+ failed = true;
+ } else if (resultSource == 1) {
+ //云录像
+ if (code.equals("0") || code.equals("4") || code.equals("7") || code.equals("11") || code.equals("14")) {
+ failed = true;
+ }
+ if (code.equals("11")) {
+ showInputKey();
+ }
+ if (code.equals("14")) {
+ passcode = 1;
+ showInputKey();
+ }
+ } else if (resultSource == 0) {
+ //设备录像
+ if (code.equals("0") || code.equals("1") || code.equals("3") || code.equals("7")) {
+ failed = true;
+ }
+ if (code.equals("7")) {
+ showInputKey();
+ }
+ } else if (resultSource == 5) {
+ //设备录像
+ if (!(code.equals("1000") || code.equals("0") || code.equals("2000") || code.equals("4000"))) {
+ failed = true;
+ }
+ if (code.equals("1000005")) {
+ showInputKey();
+ }
+ }
+ if (failed) {
+ loadingStatus(LoadStatus.LOAD_ERROR, getResources().getString(R.string.lc_demo_device_video_play_error) + ":" + code + "." + resultSource, "");
+ }
+ }
+
+ //分辨率改变事件
+ @Override
+ public void onResolutionChanged(int index, int width, int height) {
+ super.onResolutionChanged(index, width, height);
+ LogUtil.debugLog(TAG, "onResolutionChanged: index= " + index + " , width= " + width + " , height= " + height);
+ }
+
+ //播放开始回调
+ @Override
+ public void onPlayBegan(int index) {
+ super.onPlayBegan(index);
+ LogUtil.debugLog(TAG, "onPlayBegan: index= " + index);
+ loadingStatus(LoadStatus.LOAD_SUCCESS, "", "");
+ }
+
+ //接收数据回调
+ @Override
+ public void onReceiveData(int index, int len) {
+ super.onReceiveData(index, len);
+ // LogUtil.debugLog(TAG, "onReceiveData: index= " + index + " , len= " + len);
+ }
+
+ //接收帧流回调
+ @Override
+ public void onStreamCallback(int index, byte[] bytes, int len) {
+ super.onStreamCallback(index, bytes, len);
+ LogUtil.debugLog(TAG, "onStreamCallback: index= " + index + " , len= " + len);
+ }
+
+ //播放结束事件
+ @Override
+ public void onPlayFinished(int index) {
+ super.onPlayFinished(index);
+ LogUtil.debugLog(TAG, "onPlayFinished: index= " + index);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ stop();
+ playStatus = PlayStatus.STOP;
+ featuresClickListener(false);
+ speedPosition = 0;
+ ivPlayStyle.setImageDrawable(speedImage[0]);
+ llPlayPause.setOnClickListener(DeviceRecordPlayActivity.this);
+ ivPalyPause.setImageDrawable(getDrawable(R.mipmap.lc_demo_live_video_icon_h_play));
+ }
+ });
+ }
+
+ //播放时间信息回调
+ @Override
+ public void onPlayerTime(int index, final long current) {
+ super.onPlayerTime(index, current);
+ LogUtil.debugLog(TAG, "onPlayerTime: index= " + index + " , time= " + current);
+
+ long startTime = DateHelper.parseMills(recordsData.beginTime) / 1000;
+ DeviceRecordPlayActivity.this.progress = (int) (current - startTime);
+ LogUtil.debugLog(TAG, "onPlayerTime: progress= " + DeviceRecordPlayActivity.this.progress);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ recordSeekbar.setProgress(DeviceRecordPlayActivity.this.progress);
+ DeviceRecordPlayActivity.this.beginTime = DateHelper.getTimeHMS(current * 1000);
+ recordStartTime.setText(DeviceRecordPlayActivity.this.beginTime);
+ }
+ });
+
+ }
+
+
+ });
+ }
+
+ private void showInputKey() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (encryptKeyInputDialog == null) {
+ encryptKeyInputDialog = new EncryptKeyInputDialog(DeviceRecordPlayActivity.this);
+ }
+ encryptKeyInputDialog.show();
+ if (1 == passcode) {
+ encryptKeyInputDialog.setText(getText(R.string.lc_demo_device_encrypt_device_password_tip).toString());
+ } else {
+ encryptKeyInputDialog.setText(getText(R.string.lc_demo_device_encrypt_key_tip).toString());
+ }
+ encryptKeyInputDialog.setOnClick(new EncryptKeyInputDialog.OnClick() {
+ @Override
+ public void onSure(String txt) {
+ encryptKey = txt;
+ loadingStatus(LoadStatus.LOADING, getResources().getString(R.string.lc_demo_device_video_play_change), txt);
+ }
+ });
+ }
+ });
+ }
+
+ private void showInputKeyEx() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (encryptKeyInputDialog == null) {
+ encryptKeyInputDialog = new EncryptKeyInputDialog(DeviceRecordPlayActivity.this);
+ }
+ encryptKeyInputDialog.show();
+ if (1 == passcode) {
+ encryptKeyInputDialog.setText(getText(R.string.lc_demo_device_encrypt_device_password_tip).toString());
+ } else {
+ encryptKeyInputDialog.setText(getText(R.string.lc_demo_device_encrypt_key_tip).toString());
+ }
+ encryptKeyInputDialog.setOnClick(new EncryptKeyInputDialog.OnClick() {
+ @Override
+ public void onSure(String txt) {
+ encryptKey = txt;
+ path = MediaPlayHelper.getDownloadVideoPath(0, recordsData.recordId, DateHelper.parseMills(recordsData.beginTime));
+ LCOpenSDK_Download.startDownload(0,
+ path,
+ LCDeviceEngine.newInstance().accessToken,
+ recordsData.recordRegionId,
+ recordsData.deviceId,
+ String.valueOf(0),
+ txt,
+ 1000,
+ 5000);
+ }
+ });
+ }
+ });
+ }
+
+ /**
+ * 播放状态
+ *
+ * @param loadStatus 播放状态
+ * @param msg
+ */
+ private void loadingStatus(final LoadStatus loadStatus, final String msg, final String psk) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (loadStatus == LoadStatus.LOADING) {
+ //先关闭
+ stop();
+ //开始播放
+ playVideo(psk);
+ rlLoading.setVisibility(View.VISIBLE);
+ pbLoading.setVisibility(View.VISIBLE);
+ tvLoadingMsg.setText(msg);
+ //禁止拖动
+ setCanSeekChanged(false);
+
+ } else if (loadStatus == LoadStatus.LOAD_SUCCESS) {
+ //播放成功
+ rlLoading.setVisibility(View.GONE);
+ //允许拖动
+ setCanSeekChanged(true);
+ //SeekBar监听
+ setSeekBarListener();
+ playStatus = PlayStatus.PLAY;
+ //mPlayWin.setSEnhanceMode(4);//设置降噪等级最大
+ featuresClickListener(true);
+ } else {
+ //播放失败
+ stop();
+ rlLoading.setVisibility(View.VISIBLE);
+ pbLoading.setVisibility(View.GONE);
+ tvLoadingMsg.setText(msg);
+ //禁止拖动
+ setCanSeekChanged(false);
+ playStatus = PlayStatus.ERROR;
+ featuresClickListener(false);
+ }
+ }
+ });
+ }
+
+ private void startDownload() {
+ path = MediaPlayHelper.getDownloadVideoPath(0, recordsData.recordId, DateHelper.parseMills(recordsData.beginTime));
+ LCOpenSDK_Download.startDownload(0,
+ path,
+ LCDeviceEngine.newInstance().accessToken,
+ recordsData.recordRegionId,
+ recordsData.deviceId,
+ String.valueOf(0),
+ recordsData.deviceId,
+ 1000,
+ 5000);
+ }
+
+ private void stopDownLoad() {
+ LCOpenSDK_Download.stopDownload(0);
+ //更新數據到相冊
+ MediaPlayHelper.updatePhotoVideo(path);
+ }
+
+ private int downloadProgress;
+
+ private class CloudDownloadListener extends LCOpenSDK_DownloadListener {
+ @Override
+ public void onDownloadReceiveData(int index, final int dataLen) {
+ LogUtil.debugLog(TAG, "CloudDownloadListener----" + "index=" + index + ", dataLen=" + dataLen);
+ if (downloadStatus == DownloadStatus.ING) {
+ downloadProgress = downloadProgress + dataLen;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ pgDownloadProgress(
+ getResources().getString(R.string.lc_demo_device_record_download_begin) + byte2mb(downloadProgress) + "MB/" + totalMb + "M",
+ (int) ((float) downloadProgress / (float) Long.parseLong(recordsData.size) * 100),
+ 100,
+ getResources().getColor(R.color.lc_demo_color_ffffff));
+
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onDownloadState(int index, String code, int type) {
+ LogUtil.debugLog(TAG, "CloudDownloadListener----" + "index=" + index + ", code=" + code + ", type=" + type);
+ if (type == 99 || code.equals("0") || code.equals("4") || code.equals("7") || code.equals("8")) {
+ //下载出错
+ downloadStatus = DownloadStatus.ERROR;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ pgDownloadProgress(getResources().getString(R.string.lc_demo_device_record_download_error),
+ 0,
+ 0,
+ getResources().getColor(R.color.lc_demo_color_FF4F4F));
+ downloadProgress = 0;
+ }
+ });
+ }
+ if (code.equals("14")) {
+ passcode = 1;
+ }
+ if (code.equals("11") || code.equals("14")) {
+ //下载出错
+ downloadStatus = DownloadStatus.ERROR;
+ showInputKeyEx();
+ }
+ if (type == 1 && code.equals("1")) {
+ //开始下载
+ downloadStatus = DownloadStatus.ING;
+ }
+
+ if (type == 1 && code.equals("2")) {
+ //下载完成
+ downloadStatus = DownloadStatus.FINISH;
+ // MediaScannerConnection.scanFile(DeviceRecordPlayActivity.this, new String[]{path}, null, null);
+ MediaPlayHelper.updatePhotoVideo(path);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ pgDownloadProgress(getResources().getString(R.string.lc_demo_device_record_download_finish),
+ 100,
+ 100,
+ getResources().getColor(R.color.lc_demo_color_ffffff));
+ downloadProgress = 0;
+ }
+ });
+ }
+ }
+ }
+
+ private void pgDownloadProgress(String tip, int progress, int secondProgress, int textColor) {
+ pgDownload.setText(tip);
+ pgDownload.setProgress(progress);
+ pgDownload.setSecondaryProgress(secondProgress);
+ pgDownload.setTextColor(textColor);
+ }
+
+ @Override
+ public void deleteDeviceRecord() {
+ DialogUtils.dismiss();
+ Toast.makeText(this, getResources().getString(R.string.lc_demo_device_record_delete_success), Toast.LENGTH_SHORT).show();
+ Intent intent = new Intent();
+ intent.putExtra("data", true);
+ setResult(RESULT_OK, intent);
+ finish();
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ DialogUtils.dismiss();
+ Toast.makeText(this, throwable.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+
+ private String byte2mb(long b) {
+ double mb = (double) b / 1024 / 1024;
+ DecimalFormat decimalFormat = new DecimalFormat("0.00");
+ return decimalFormat.format(mb);
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/videoplay/ContainerAdapter.java b/app/src/main/java/com/lechange/demo/videoplay/ContainerAdapter.java
new file mode 100644
index 0000000..af20bd8
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/ContainerAdapter.java
@@ -0,0 +1,102 @@
+package com.lechange.demo.videoplay;
+
+import android.content.Context;
+import android.support.constraint.ConstraintLayout;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.lechange.opensdk.media.LCOpenSDK_PlayWindow;
+import com.yonsz.z1.R;
+
+import java.util.List;
+
+public class ContainerAdapter extends RecyclerView.Adapter {
+ private String TAG = getClass().getSimpleName();
+ private LCOpenSDK_EventListener videoPlayerListener;
+ private List mData;
+ private Context mContext;
+
+ private ConstraintLayout.LayoutParams layoutParams;
+
+ public ContainerAdapter(Context mContext, List datas) {
+ this.mData = datas;
+ this.mContext = mContext;
+ }
+
+ @Override
+ public ContainerHoler onCreateViewHolder(ViewGroup parent, int viewType) {
+ View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_container, parent, false);
+ ContainerHoler containerHoler = new ContainerHoler(rootView);
+ layoutParams = new ConstraintLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT);
+ layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID;
+ layoutParams.rightToRight = ConstraintLayout.LayoutParams.PARENT_ID;
+ layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
+ layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
+ return containerHoler;
+ }
+
+ @Override
+ public void onBindViewHolder(final ContainerHoler holder, int position) {
+ // final VideoBean videoBean = mData.get(position);
+ // holder.pqVideoPlayer.setId(videoBean.getId());
+ // holder.pqVideoPlayer.setFocus(videoBean.isSelect());
+ // holder.pqVideoPlayer.setVideoPlayerListener(videoPlayerListener);
+ // holder.pqVideoPlayer.setPqVideoOnclickListener(new PqVideoPlayer.PqVideoOnclickListener() {
+ // @Override
+ // public void onClick() {
+ // refreshSelect(videoBean);
+ // }
+ // });
+ /*pqVideoPlayer.setVideoPlayerListener(videoPlayerListener);
+ pqVideoPlayer.setPqVideoOnclickListener(new PqVideoPlayer.PqVideoOnclickListener() {
+ @Override
+ public void onClick() {
+ refreshSelect(pqVideoPlayer);
+ }
+ });*/
+ holder.setViews(position);
+ }
+
+ private void refreshSelect(LCOpenSDK_PlayWindow videoBean) {
+ Log.d(TAG, "refreshSelect: ");
+ /*for (LCOpenSDK_PlayWindow vb : mData) {
+ vb.setFocus(vb == videoBean);
+ }*/
+ // notifyDataSetChanged();
+ }
+
+ @Override
+ public int getItemCount() {
+ return mData.size();
+ }
+
+ public void setVideoPlayerListener(LCOpenSDK_EventListener videoPlayerListener) {
+ this.videoPlayerListener = videoPlayerListener;
+ }
+
+ public class ContainerHoler extends RecyclerView.ViewHolder {
+ // private PqVideoPlayer pqVideoPlayer;
+ private ViewGroup constraintLayout;
+ private FrameLayout frame_content;
+
+ public ContainerHoler(View itemView) {
+ super(itemView);
+ // pqVideoPlayer = itemView.findViewById(R.id.pq_video_player);
+ constraintLayout = (ConstraintLayout) itemView.findViewById(R.id.container);
+ }
+
+ public void setViews(final int position) {
+ final VideoPlayOnlineFragment pqVideoPlayer = mData.get(position);
+ /*constraintLayout.addView(pqVideoPlayer, 0, layoutParams);
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.frame_content, pqVideoPlayer)
+ .commitAllowingStateLoss();*/
+ // constraintLayout.addView(pqVideoPlayer, 0, layoutParams);
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/videoplay/PqVideoPlayer.java b/app/src/main/java/com/lechange/demo/videoplay/PqVideoPlayer.java
new file mode 100644
index 0000000..5390205
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/PqVideoPlayer.java
@@ -0,0 +1,688 @@
+/*
+package com.lechange.demo.videoplay;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.SurfaceTexture;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.TextureView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.yonsz.z1.R;
+import com.yonsz.z1.utils.DensityUtil;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+*/
+/**
+ * 描述:自定义播放器
+ *
+ * @author :chezi008 on 2017/11/21 15:41
+ * 邮箱:chezi008@163.com
+ *//*
+
+
+public class PqVideoPlayer extends RelativeLayout implements View.OnClickListener, PqVideoPlayerZoomIn.PqZoomOutVideoListener {
+
+ public static final int HANDLER_SET_STATUS_DEAULT = 0;
+ public static final int HANDLER_SET_STATUS_PLAYING = 1;
+ public static final int HANDLER_UPDATE_BPS = 2;
+ public static final int HANDLER_UPDATE_LOSS_FRAME = 3;
+ private static final int CORE_POOL_SIZE = 5;
+ private static final int MAXIMUM_POOL_SIZE = 10;
+ private static final int KEEP_ALIVE_TIME = 60000;
+ */
+/**
+ * 默认边框大小
+ *//*
+
+ private final int DEFAULT_BORDER_SIZE = 1;
+ private final int DEFALUT_BORDER_COLOR = Color.parseColor("#00000000");
+ //自定义属性 1、选中时候边框大小 2、选中边框颜色
+ //3、默认背景色 4、选中背景色
+ // 5、资源添加icon
+ */
+/**
+ * 默认背景
+ *//*
+
+ private final int DEFAULT_BG_COLOR = Color.parseColor("#6b7e9e");
+ private final int DEFAULT_BG_SELECT_COLOR = Color.parseColor("#FFFFFF");
+ */
+/**
+ * 默认添加资源图片
+ *//*
+
+ private final int DEFAULT_RES_ICON = R.mipmap.vp_ic_res_add;
+ private final int DEFAULT_FULL_SCREEN_ICON = R.mipmap.vp_ic_full_screen;
+ private final int DEFAULT_STOP_ICON = R.mipmap.vp_ic_stop_play;
+ private ArrayBlockingQueue mArrayBlockingQueue;
+ private String TAG = getClass().getSimpleName();
+ */
+/**
+ * 选中边框
+ *//*
+
+ private int mBorderSize, mBorderColor;
+ private int mBgColor, mBgSelectColor;
+ private int mResIcon, mFullIcon, mStopIcon;
+
+ private RelativeLayout mRlBorderBg, mRlVideoBg, mTextureParent, mRlBottomBar;
+ private TextureView mTextureView;
+ private SurfaceTexture mSurfaceTexture;
+ private TextureView.SurfaceTextureListener mSurfaceTextureListener;
+
+ private ProgressBar mProcessBar;
+ private TextView mTvPath, mTvLoss;
+ private ImageView ivResAdd;
+
+ */
+/**
+ * 解码器
+ *//*
+
+ private PqVideoDecoder mVideoDecoder;
+ */
+/**
+ * 线程池
+ *//*
+
+ private ThreadPoolExecutor mExecutorService;
+ private ScheduledExecutorService mScheduledExecutorService;
+ private Runnable mScheduleRunable;
+ private H264ReadRunable mH264ReadRunable;
+
+ private boolean isFullScreen, isFoucsed, isZoomIn;
+ */
+/**
+ * 码流统计
+ *//*
+
+ private Handler mMainHandler;
+
+ private VideoPlayerListener videoPlayerListener;
+ private PqVideoOnclickListener mPqVideoOnclickListener;
+
+ private PlayerViewState curState;
+ private long[] mHits = new long[2];
+
+ public PqVideoPlayer(Context context) {
+ this(context, null);
+ }
+
+
+ public PqVideoPlayer(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PqVideoPlayer);
+ mBorderSize = ta.getInt(R.styleable.PqVideoPlayer_vp_border_size, DEFAULT_BORDER_SIZE);
+ mBorderColor = ta.getColor(R.styleable.PqVideoPlayer_vp_border_color, DEFALUT_BORDER_COLOR);
+ mBgColor = ta.getColor(R.styleable.PqVideoPlayer_vp_bg_default_color, DEFAULT_BG_COLOR);
+ mBgSelectColor = ta.getColor(R.styleable.PqVideoPlayer_vp_bg_select_color, DEFAULT_BG_SELECT_COLOR);
+ mResIcon = ta.getResourceId(R.styleable.PqVideoPlayer_vp_res_icon, DEFAULT_RES_ICON);
+ mFullIcon = ta.getResourceId(R.styleable.PqVideoPlayer_vp_fullscreen_icon, DEFAULT_FULL_SCREEN_ICON);
+ mStopIcon = ta.getResourceId(R.styleable.PqVideoPlayer_vp_stop_icon, DEFAULT_STOP_ICON);
+
+ initVirable();
+ initView();
+ }
+
+ public void setVideoPlayerListener(VideoPlayerListener videoPlayerListener) {
+ this.videoPlayerListener = videoPlayerListener;
+ }
+
+ public void setPqVideoOnclickListener(PqVideoOnclickListener mPqVideoOnclickListener) {
+ this.mPqVideoOnclickListener = mPqVideoOnclickListener;
+ }
+
+ private void initVirable() {
+ mArrayBlockingQueue = new ArrayBlockingQueue(MAXIMUM_POOL_SIZE);
+ mExecutorService = new ThreadPoolExecutor(CORE_POOL_SIZE,
+ MAXIMUM_POOL_SIZE,
+ KEEP_ALIVE_TIME,
+ TimeUnit.MILLISECONDS, mArrayBlockingQueue);
+ mScheduledExecutorService = new ScheduledThreadPoolExecutor(1);
+
+ if (mMainHandler == null) {
+ mMainHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case HANDLER_SET_STATUS_DEAULT:
+ setDefaultUI();
+ break;
+ case HANDLER_SET_STATUS_PLAYING:
+ setPlayerViewState(PlayerViewState.Playying);
+ break;
+ case HANDLER_UPDATE_BPS:
+ // if (videoPlayerFullScreenListener != null) {
+ // videoPlayerFullScreenListener.onGetBps((String) msg.obj);
+ // }
+ break;
+ //播放器丢包率更新
+ case HANDLER_UPDATE_LOSS_FRAME:
+ mTvLoss.setText((String) msg.obj);
+ // if (videoPlayerFullScreenListener != null) {
+ // videoPlayerFullScreenListener.onGetLossFrame((String) msg.obj);
+ // }
+ break;
+ default:
+ break;
+ }
+ }
+ };
+ }
+ }
+
+ */
+/**
+ * 初始化视图
+ *//*
+
+ private void initView() {
+ //设置屏幕常亮
+ setKeepScreenOn(true);
+ //添加选中的边框
+ LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ mRlBorderBg = new RelativeLayout(getContext());
+ mRlBorderBg.setBackgroundColor(mBorderColor);
+ mRlBorderBg.setPadding(mBorderSize, mBorderSize, mBorderSize, mBorderSize);
+ addView(mRlBorderBg, layoutParams);
+ //添加播放器背景
+ layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ mRlVideoBg = new RelativeLayout(getContext());
+ mRlVideoBg.setBackgroundColor(mBgColor);
+ mRlBorderBg.addView(mRlVideoBg, layoutParams);
+
+ //添加播放器显示界面
+ layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ mTextureParent = new RelativeLayout(getContext());
+ mTextureParent.setBackgroundColor(Color.BLACK);
+ mTextureParent.setVisibility(GONE);
+ mRlVideoBg.addView(mTextureParent, layoutParams);
+
+ //添加添加资源图标
+ layoutParams = new LayoutParams(DensityUtil.sp2px(getContext(), 35),
+ DensityUtil.sp2px(getContext(), 35));
+ layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
+ ivResAdd = new ImageView(getContext());
+ ivResAdd.setImageResource(mResIcon);
+ ivResAdd.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ ivResAdd.setId(R.id.iv_res_add);
+ ivResAdd.setOnClickListener(this);
+ mRlVideoBg.addView(ivResAdd, layoutParams);
+ //添加progres
+ mProcessBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyle);
+ mRlVideoBg.addView(mProcessBar, layoutParams);
+ mProcessBar.setVisibility(GONE);
+
+ // addTextureView();
+
+ //添加播放器控制栏
+ //底部白色背景
+ LayoutParams layoutParamsInner = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+ mRlBottomBar = new RelativeLayout(getContext());
+ mRlBottomBar.setBackgroundColor(Color.WHITE);
+ mRlBottomBar.getBackground().setAlpha(128);
+ mRlBottomBar.setGravity(CENTER_VERTICAL);
+ layoutParamsInner.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
+ mRlVideoBg.addView(mRlBottomBar, layoutParamsInner);
+ mRlBottomBar.setVisibility(GONE);
+ //全屏
+ int btnWidth = DensityUtil.sp2px(getContext(), 25);
+ int btnPadding = DensityUtil.sp2px(getContext(), 3);
+ LayoutParams layoutParamsFullScreen = new LayoutParams(btnWidth, btnWidth);
+ layoutParamsFullScreen.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+ ImageView ivFull = new ImageView(getContext());
+ ivFull.setId(R.id.btnFullScreen);
+
+ ivFull.setPadding(btnPadding, btnPadding, btnPadding, btnPadding);
+ ivFull.setImageResource(mFullIcon);
+ ivFull.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ ivFull.setOnClickListener(this);
+ mRlBottomBar.addView(ivFull, layoutParamsFullScreen);
+ //停止
+ LayoutParams layoutParamsStopVideo = new LayoutParams(btnWidth, btnWidth);
+ layoutParamsStopVideo.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
+ ImageView ivStop = new ImageView(getContext());
+ ivStop.setId(R.id.btnStop);
+ ivStop.setPadding(btnPadding, btnPadding, btnPadding, btnPadding);
+ ivStop.setImageResource(mStopIcon);
+ ivStop.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ ivStop.setOnClickListener(this);
+ mRlBottomBar.addView(ivStop, layoutParamsStopVideo);
+
+ //设备路径信息
+ LinearLayout llPath = new LinearLayout(getContext());
+ llPath.setId(R.id.tvDeviceInfo);
+ mTvPath = new TextView(getContext());
+ mTvPath.setTextColor(Color.WHITE);
+ mTvPath.setTextSize(8);
+ mTvPath.setSingleLine(true);
+ mTvPath.setText("轮播字");
+ mTvPath.setEllipsize(TextUtils.TruncateAt.MARQUEE);
+ mTvPath.setMarqueeRepeatLimit(-1);
+ mTvPath.setSelected(true);
+ llPath.addView(mTvPath);
+
+ LayoutParams layoutParamsDevicePathTextView = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ layoutParamsDevicePathTextView.setMargins(btnPadding, btnPadding, btnPadding, btnPadding);
+ layoutParamsDevicePathTextView.addRule(RIGHT_OF, R.id.btnStop);
+ layoutParamsDevicePathTextView.addRule(RelativeLayout.LEFT_OF, R.id.tvLossFrame);
+ layoutParamsDevicePathTextView.addRule(CENTER_VERTICAL);
+ mRlBottomBar.addView(llPath, layoutParamsDevicePathTextView);
+
+ //丢包率
+ mTvLoss = new TextView(getContext());
+ mTvLoss.setId(R.id.tvLossFrame);
+ mTvLoss.setTextColor(Color.WHITE);
+ mTvLoss.setTextSize(8);
+ mTvLoss.setLines(1);
+ mTvLoss.setText("0.00%");
+ LayoutParams rlLoss = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ rlLoss.setMargins(btnPadding, btnPadding, btnPadding, btnPadding);
+ rlLoss.addRule(RelativeLayout.LEFT_OF, R.id.btnFullScreen);
+ rlLoss.addRule(CENTER_VERTICAL);
+ mRlBottomBar.addView(mTvLoss, rlLoss);
+
+ setPlayerViewState(PlayerViewState.Default);
+ // setPlayerViewState(PlayerViewState.Playying);
+ }
+
+ private void initTextureView() {
+ if (mTextureView == null) {
+ mTextureView = new VideoTextureView(getContext());
+ mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
+ @Override
+ public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
+ Log.d(TAG, "onSurfaceTextureAvailable: ");
+ //检查解码器是否初始化
+ if (!initDecoder(surface)) {
+ Log.d(TAG, "onSurfaceTextureAvailable: init decoder failed!");
+ return;
+ }
+ if (mH264ReadRunable != null) {
+ Log.d(TAG, "onSurfaceTextureAvailable: 读取视频流");
+ mExecutorService.execute(mH264ReadRunable);
+ }
+ }
+
+ @Override
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
+
+ }
+
+ @Override
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
+ Log.d(TAG, "onSurfaceTextureDestroyed: ");
+ // stopDecoder();
+ mSurfaceTexture = surface;
+ if (isZoomIn) {
+ videoPlayerListener.onChangeSurface(surface);
+ }
+ return false;
+ }
+
+ @Override
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+
+ }
+ });
+
+ }
+ }
+
+ */
+/**
+ * 添加显示画面
+ *//*
+
+ private void addTextureView() {
+ Log.d(TAG, "addTextureView: ----------->");
+ LayoutParams textureParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ textureParams.addRule(RelativeLayout.CENTER_IN_PARENT);
+ if (mTextureParent.getChildCount() > 0) {
+ throw new IllegalStateException("已经添加了显示控件!");
+ }
+ //不能添加空控件 播放器setPlaying的时候会添加
+ mTextureParent.addView(mTextureView, textureParams);
+ mTextureParent.setVisibility(VISIBLE);
+ }
+
+ */
+/**
+ * 停止解码器
+ *//*
+
+ private void stopDecoder() {
+ if (mVideoDecoder != null) {
+ mVideoDecoder.stop();
+ }
+ }
+
+ */
+/**
+ * 移除显示画面
+ *//*
+
+ private void removeTextureView() {
+ mTextureParent.setVisibility(GONE);
+ if (mTextureParent.getChildCount() > 0) {
+ mTextureParent.removeView(mTextureView);
+ // mTextureView = null;
+ }
+ }
+
+ private void resetTextureView() {
+ mTextureParent.setVisibility(GONE);
+ if (mTextureParent.getChildCount() > 0) {
+ mTextureParent.removeView(mTextureView);
+ mTextureView = null;
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.iv_res_add) {
+ //播放
+ if (mH264ReadRunable == null) {
+ mH264ReadRunable = new H264ReadRunable();
+ mH264ReadRunable.setH264ReadListener(new H264ReadRunable.H264ReadListener() {
+ @Override
+ public void onFrameData(byte[] datas) {
+ mVideoDecoder.feedData(datas, 0, datas.length);
+ }
+
+ @Override
+ public void onStopRead() {
+ stopVideoPlayer(true);
+ }
+ });
+ }
+ setPlayerViewState(PlayerViewState.Playying);
+ } else if (v.getId() == R.id.btnFullScreen) {
+ //全屏
+ startFullScreen();
+ } else if (v.getId() == R.id.btnStop) {
+ //停止
+ Log.d(TAG, "onClick:btnStop ");
+ stopVideoPlayer(true);
+ }
+ setSelectStyle();
+ }
+
+ */
+/**
+ * 开启全屏
+ *//*
+
+ public void startFullScreen() {
+ isFullScreen = true;
+ FullScreenActivity.start(getContext());
+ }
+
+ */
+/**
+ * 退出全屏模式
+ *//*
+
+ public void exitFullScreen() {
+ isFullScreen = false;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // gestureDetector.onTouchEvent(event);
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ doubleClick_2();
+ mPqVideoOnclickListener.onClick();
+ return true;
+ case MotionEvent.ACTION_UP:
+ return true;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ private void doubleClick_2() {
+ System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
+ //获取手机开机时间
+ mHits[mHits.length - 1] = SystemClock.uptimeMillis();
+ if (mHits[mHits.length - 1] - mHits[0] < 500) {
+ */
+/**双击的业务逻辑*//*
+
+ Log.d(TAG, "doubleClick_2: 双击");
+ onZoomViewExchange();
+ }
+ }
+
+ private void onZoomViewExchange() {
+ if (mTextureView != null) {
+ mSurfaceTextureListener = mTextureView.getSurfaceTextureListener();
+ }
+ isZoomIn = true;
+ removeTextureView();
+ videoPlayerListener.onZoomInView(PqVideoPlayer.this);
+ }
+
+ */
+/**
+ * 设置选中的状态
+ *//*
+
+ private void setSelectStyle() {
+ isFoucsed = true;
+ //背景为黑色,且出现选中边框
+ mRlVideoBg.setBackgroundColor(Color.BLACK);
+ mRlBorderBg.setBackgroundColor(mBgSelectColor);
+ }
+
+ private void setDefultStyle() {
+ isFoucsed = false;
+ mRlVideoBg.setBackgroundColor(mBgColor);
+ mRlBorderBg.setBackgroundColor(mBorderColor);
+ }
+
+ */
+/**
+ * 设置时候获取焦点
+ *
+ * @param focus
+ *//*
+
+ public void setFocus(boolean focus) {
+ if (focus) {
+ setSelectStyle();
+ } else {
+ setDefultStyle();
+ }
+ }
+
+ */
+/**
+ * 开始播放视频
+ *//*
+
+ public void startVideoPlayer() {
+ setPlayerViewState(PlayerViewState.Playying);
+ //设置轮播字幕
+ // mTvPath.setText(mParams.getVideoName());
+ }
+
+ public void stopVideoPlayer(boolean isClear) {
+ //停止视频解码器
+ stopDecoder();
+ //移除显示画面
+ mMainHandler.sendEmptyMessage(HANDLER_SET_STATUS_DEAULT);
+ // setPlayerViewState(PlayerViewState.Default);
+ if (isClear) {
+ // mParams.getSessionParams().requestId = null;
+ }
+ }
+
+ */
+/**
+ * 显示加载动画
+ *//*
+
+ public void showProgressbar() {
+ setPlayerViewState(PlayerViewState.Waiting);
+ //定时器 15s还没来自动关闭
+ if (mScheduleRunable == null) {
+ mScheduleRunable = new Runnable() {
+ @Override
+ public void run() {
+ if (mProcessBar.getVisibility() == VISIBLE) {
+ mMainHandler.sendEmptyMessage(HANDLER_SET_STATUS_DEAULT);
+ }
+ }
+ };
+ }
+ mScheduledExecutorService.schedule(mScheduleRunable, 15000, TimeUnit.MILLISECONDS);
+ }
+
+
+ private void setPlayerViewState(PlayerViewState state) {
+ curState = state;
+ Log.d(TAG, "setPlayerViewState: " + curState);
+ switch (state) {
+ case Default:
+ //默认背景
+ mRlVideoBg.setBackgroundColor(mBgColor);
+ ivResAdd.setVisibility(VISIBLE);
+ //隐藏textureView
+ resetTextureView();
+ //隐藏dialog
+ mProcessBar.setVisibility(GONE);
+ //隐藏底部控制栏
+ mRlBottomBar.setVisibility(GONE);
+ break;
+ case Waiting:
+ //背景设为黑色
+ mRlVideoBg.setBackgroundColor(Color.BLACK);
+ //隐藏资源图标
+ ivResAdd.setVisibility(GONE);
+ //显示dialog
+ mProcessBar.setVisibility(VISIBLE);
+ break;
+ case Playying:
+ //隐藏dialog
+ mProcessBar.setVisibility(GONE);
+ //隐藏资源
+ ivResAdd.setVisibility(GONE);
+ initTextureView();
+ addTextureView();
+ //显示底部控制栏
+ mRlBottomBar.setVisibility(VISIBLE);
+ break;
+ case Control:
+ break;
+ }
+ }
+
+
+ private boolean initDecoder(SurfaceTexture surface) {
+ Log.d(TAG, "initDecoder: ");
+ if (mVideoDecoder == null) {
+ mVideoDecoder = new PqVideoDecoder();
+ }
+ boolean initSuccess = mVideoDecoder.init(surface,
+ 1280,
+ 720);
+
+ return initSuccess;
+ }
+
+
+ private void setDefaultUI() {
+ //判断当前是否是播放状态
+ if (mRlBottomBar.getVisibility() == VISIBLE || mProcessBar.getVisibility() == VISIBLE) {
+ //停止视频解码器
+ stopDecoder();
+ //移除显示画面
+ setPlayerViewState(PlayerViewState.Default);
+ setSelectStyle();
+ }
+ }
+
+ @Override
+ public void onZoomIn() {
+ onResume();
+ setVisibility(VISIBLE);
+ isZoomIn = false;
+ }
+
+ public void onResume() {
+ if (curState == PlayerViewState.Playying) {
+ setSurfaceTexture();
+ }
+ }
+
+ private void setSurfaceTexture() {
+ if (null == mTextureView.getSurfaceTexture()) {
+ Log.d(TAG, "setSurfaceTexture: ");
+ mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
+ mTextureView.setSurfaceTexture(mSurfaceTexture);
+ }
+ addTextureView();
+ }
+
+ public SurfaceTexture getSurfaceTexture() {
+ return mTextureView.getSurfaceTexture();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
+ getDefaultSize(0, heightMeasureSpec));
+
+ int childWidthSize = getMeasuredWidth();
+ // 高度和宽度一样
+ heightMeasureSpec = widthMeasureSpec = MeasureSpec.makeMeasureSpec(
+ childWidthSize, MeasureSpec.EXACTLY);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ public interface VideoPlayerListener {
+ */
+/**
+ * 双击放大
+ *
+ * @param videoPlayer
+ *//*
+
+ void onZoomInView(PqVideoPlayer videoPlayer);
+
+ */
+/**
+ * 渲染画面被交换
+ *
+ * @param surfaceTexture
+ *//*
+
+ void onChangeSurface(SurfaceTexture surfaceTexture);
+
+ }
+
+ public interface PqVideoOnclickListener {
+ void onClick();
+ }
+}
+*/
diff --git a/app/src/main/java/com/lechange/demo/videoplay/PqVideoPlayerZoomIn.java b/app/src/main/java/com/lechange/demo/videoplay/PqVideoPlayerZoomIn.java
new file mode 100644
index 0000000..b260336
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/PqVideoPlayerZoomIn.java
@@ -0,0 +1,194 @@
+package com.lechange.demo.videoplay;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.SurfaceTexture;
+import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.TextureView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.yonsz.z1.R;
+import com.yonsz.z1.utils.DensityUtil;
+
+public class PqVideoPlayerZoomIn extends FrameLayout implements View.OnClickListener {
+ private String TAG = getClass().getSimpleName();
+ private RelativeLayout mTextureParent, mRlBottomBar;
+ private TextureView mTextureView;
+ private ImageView ivResAdd;
+ private TextView mTvPath, mTvLoss;
+ private PqZoomOutVideoListener mPqZoomOutVideoListener;
+ private SurfaceTexture mSurfaceTexture;
+ private long[] mHits = new long[2];
+ private float[] mHorizontals = new float[2];
+
+ public PqVideoPlayerZoomIn(@NonNull Context context) {
+ this(context, null);
+ }
+
+ public PqVideoPlayerZoomIn(@NonNull Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public PqVideoPlayerZoomIn(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ initView();
+ }
+
+ private void initView() {
+ //设置屏幕常亮
+ setKeepScreenOn(true);
+ setBackgroundColor(getResources().getColor(R.color.colorPrimary));
+ addTextureParent();
+ // addTextureView();
+ addResIconView();
+ // addBottomView();
+ }
+
+ private void addTextureParent() {
+ //先添加其父容器
+ LayoutParams parentParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+ parentParams.gravity = Gravity.CENTER;
+
+ mTextureParent = new RelativeLayout(getContext());
+ mTextureParent.setBackgroundColor(Color.BLACK);
+ mTextureParent.setVisibility(VISIBLE);
+ addView(mTextureParent, parentParams);
+ }
+
+ private void addResIconView() {
+ //添加添加资源图标
+ LayoutParams layoutParams = new LayoutParams(DensityUtil.sp2px(getContext(), 35),
+ DensityUtil.sp2px(getContext(), 35));
+ layoutParams.gravity = Gravity.CENTER;
+ ivResAdd = new ImageView(getContext());
+ ivResAdd.setImageResource(R.mipmap.vp_ic_res_add);
+ ivResAdd.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+// ivResAdd.setId(R.id.iv_res_add);
+ ivResAdd.setOnClickListener(this);
+ addView(ivResAdd, layoutParams);
+ }
+
+ private void addTextureView() {
+ //添加渲染视图
+ if (mTextureView == null) {
+ mTextureView = new VideoTextureView(getContext());
+ mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
+ @Override
+ public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
+ Log.d(TAG, "onSurfaceTextureAvailable: ");
+ if (mSurfaceTexture != null) {
+ mTextureView.setSurfaceTexture(mSurfaceTexture);
+ }
+ }
+
+ @Override
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
+
+ }
+
+ @Override
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
+ Log.d(TAG, "onSurfaceTextureDestroyed: ");
+ mSurfaceTexture = surface;
+ return false;
+ }
+
+ @Override
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+
+ }
+ });
+ }
+
+ if (mTextureParent.getChildCount() > 0) {
+ throw new IllegalStateException("已经添加了一个子控件了!");
+ }
+ RelativeLayout.LayoutParams LinlayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
+ RelativeLayout.LayoutParams.MATCH_PARENT);
+ LinlayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
+ mTextureParent.addView(mTextureView, LinlayoutParams);
+ }
+
+ public void setSurfaceView(SurfaceTexture surfaceView) {
+ Log.d(TAG, "setSurfaceView: ");
+ addTextureView();
+ mTextureView.setSurfaceTexture(surfaceView);
+ }
+
+ public void setPqZoomOutVideoListener(PqZoomOutVideoListener mPqZoomOutVideoListener) {
+ this.mPqZoomOutVideoListener = mPqZoomOutVideoListener;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ Log.i("TAG", "onTouchEvent--ACTION_DOWN" + event.getX());
+ mHorizontals[0] = event.getX();
+ doubleClick_2();
+ return true;
+ case MotionEvent.ACTION_UP:
+ Log.i("TAG", "onTouchEvent--ACTION_UP" + event.getX());
+ mHorizontals[1] = event.getX();
+ changeLeftOrRight();
+ return true;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ private void changeLeftOrRight() {
+ if (mHorizontals[0] > mHorizontals[1]) {
+ if ((mHorizontals[0] - mHorizontals[1]) > 200) {
+ Log.i("TAG", "onTouchEvent" + "下一个" + (mHorizontals[0] - mHorizontals[1]));
+ Toast.makeText(getContext(), "下一个", Toast.LENGTH_SHORT).show();
+ }
+ } else {
+ if ((mHorizontals[1] - mHorizontals[0]) > 200) {
+ Log.i("TAG", "onTouchEven" + "上一个");
+ Toast.makeText(getContext(), "上一个", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+
+ private void doubleClick_2() {
+ System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
+ //获取手机开机时间
+ mHits[mHits.length - 1] = SystemClock.uptimeMillis();
+ if (mHits[mHits.length - 1] - mHits[0] < 500) {
+ /**双击的业务逻辑*/
+ Log.d(TAG, "doubleClick_2: 双击");
+ onZoomViewExchange();
+ }
+ }
+
+ private void onZoomViewExchange() {
+ mTextureParent.removeView(mTextureView);
+ mPqZoomOutVideoListener.onZoomIn();
+ setVisibility(GONE);
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ /*case R.id.iv_res_add:
+ break;*/
+ }
+ }
+
+ public interface PqZoomOutVideoListener {
+ void onZoomIn();
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/videoplay/VideoContainerFragment.java b/app/src/main/java/com/lechange/demo/videoplay/VideoContainerFragment.java
new file mode 100644
index 0000000..3f9631c
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/VideoContainerFragment.java
@@ -0,0 +1,169 @@
+package com.lechange.demo.videoplay;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.yonsz.z1.R;
+import com.yonsz.z1.fragment.BaseFragment;
+import com.yonsz.z1.version4.fragment.MyFragmentPagerAdapter;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+public class VideoContainerFragment extends BaseFragment {
+ private View fragView;
+ private String TAG = getClass().getSimpleName();
+ private UIHandle mHandler;
+ private RecyclerView rv_list;
+ private PqVideoPlayerZoomIn pqZoomOutVideoPlayer;
+ private VideoPlayOnlineFragment mCurPqVideoPlayer;
+ private GridLayoutManager mGridLayoutManager;
+ private ContainerAdapter containerAdapter;
+ private List videoIdList;
+ private MyFragmentPagerAdapter myFragmentPagerAdapter;
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mHandler = new UIHandle(this);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ fragView = View.inflate(getActivity(), R.layout.activity_video_container, null);
+ initView(fragView);
+ return fragView;
+ }
+
+
+ private void initView(View fragView) {
+ videoIdList = new ArrayList<>();
+
+ for (int i = 0; i < 4; i++) {
+ VideoPlayOnlineFragment pqVideoPlayer = new VideoPlayOnlineFragment();
+ Bundle b = new Bundle();
+ String resId = getActivity().getIntent().getStringExtra("UUID");
+ b.putString("RESID", resId);
+ pqVideoPlayer.setArguments(b);
+ videoIdList.add(pqVideoPlayer);
+ }
+
+ rv_list = (RecyclerView) fragView.findViewById(R.id.rv_list);
+ pqZoomOutVideoPlayer = (PqVideoPlayerZoomIn) fragView.findViewById(R.id.pq_video);
+
+ containerAdapter = new ContainerAdapter(getContext(), videoIdList);
+ myFragmentPagerAdapter = new MyFragmentPagerAdapter(getFragmentManager()) {
+ @Override
+ public int getCount() {
+ return 4;
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ return videoIdList.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return videoIdList.get(position).getId();
+ }
+ };
+ /*containerAdapter.setVideoPlayerListener(new PqVideoPlayer.VideoPlayerListener() {
+ @Override
+ public void onZoomInView(PqVideoPlayer videoPlayer) {
+ mCurPqVideoPlayer = videoPlayer;
+ videoPlayer.setVisibility(View.GONE);
+ pqZoomOutVideoPlayer.setVisibility(View.VISIBLE);
+ pqZoomOutVideoPlayer.setPqZoomOutVideoListener(videoPlayer);
+ }
+
+ @Override
+ public void onChangeSurface(SurfaceTexture surfaceTexture) {
+ pqZoomOutVideoPlayer.setSurfaceView(surfaceTexture);
+ }
+
+ });*/
+ mGridLayoutManager = new VideoGridLayoutManager(getContext(), 2);
+ rv_list.setLayoutManager(mGridLayoutManager);
+ rv_list.setAdapter(containerAdapter);
+
+ ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
+ @Override
+ public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+ Log.d(TAG, "getMovementFlags: ");
+ int dragFlags;
+ int swipeFlags;
+ if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
+ dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
+ ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
+ swipeFlags = 0;
+ } else {
+ dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
+ swipeFlags = 0;
+ }
+ return makeMovementFlags(dragFlags, swipeFlags);
+ }
+
+ @Override
+ public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
+ Log.d(TAG, "onMove: ");
+ int fromPosition = viewHolder.getAdapterPosition();
+ int toPosition = target.getAdapterPosition();
+ if (fromPosition < toPosition) {
+ for (int i = fromPosition; i < toPosition; i++) {
+ Collections.swap(videoIdList, i, i + 1);
+ }
+ } else {
+ for (int i = fromPosition; i < toPosition; i--) {
+ Collections.swap(videoIdList, i, i - 1);
+ }
+ }
+ containerAdapter.notifyItemMoved(fromPosition, toPosition);
+ return true;
+ }
+
+ @Override
+ public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
+ Log.d(TAG, "onSwiped: ");
+ }
+ });
+ itemTouchHelper.attachToRecyclerView(rv_list);
+ }
+
+ private void callBackUiThread(Message msg) {
+
+ }
+
+ //handler
+ private static class UIHandle extends Handler {
+ WeakReference weakReference;
+
+ public UIHandle(VideoContainerFragment activity) {
+ weakReference = new WeakReference(activity);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ VideoContainerFragment activity = weakReference.get();
+ activity.callBackUiThread(msg);
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/videoplay/VideoGridLayoutManager.java b/app/src/main/java/com/lechange/demo/videoplay/VideoGridLayoutManager.java
new file mode 100644
index 0000000..cd6405a
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/VideoGridLayoutManager.java
@@ -0,0 +1,27 @@
+package com.lechange.demo.videoplay;
+
+import android.content.Context;
+import android.support.v7.widget.GridLayoutManager;
+import android.util.AttributeSet;
+
+
+public class VideoGridLayoutManager extends GridLayoutManager {
+ public VideoGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public VideoGridLayoutManager(Context context, int spanCount) {
+ super(context, spanCount);
+ }
+
+ public VideoGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
+ super(context, spanCount, orientation, reverseLayout);
+ }
+
+ @Override
+ public boolean canScrollVertically() {
+// super.canScrollVertically()
+ return false;
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/videoplay/VideoPlayFragment.java b/app/src/main/java/com/lechange/demo/videoplay/VideoPlayFragment.java
new file mode 100644
index 0000000..a6a2c92
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/VideoPlayFragment.java
@@ -0,0 +1,251 @@
+/*
+ * 项目名: YYS
+ * 文件名: MediaPlayFragment.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.videoplay;
+
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.support.v4.app.Fragment;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.OrientationEventListener;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.lechange.demo.business.util.MediaPlayHelper;
+import com.lechange.demo.common.ProgressDialog;
+import com.lechange.demo.mediaplay.MediaPlayActivity;
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.lechange.opensdk.media.LCOpenSDK_PlayWindow;
+
+
+/**
+ * 描述:视频播放组件基类 作者: lc
+ */
+public class VideoPlayFragment extends Fragment{
+ private final static String tag = "MediaPlayFragment";
+ //底层返回值
+ protected static final int retOK = 0;
+ protected static final int retNG = -1;
+
+ public interface BackHandlerInterface {
+ public void setSelectedFragment(VideoPlayFragment backHandledFragment);
+ }
+ protected LCOpenSDK_EventListener listener;
+ protected LCOpenSDK_PlayWindow mPlayWin = new LCOpenSDK_PlayWindow();
+ protected Handler mHander = new Handler();
+ // 屏幕方向改变监听器
+ private OrientationEventListener mOrientationListener;
+
+ // 统计当前累计总流量,单位:字节
+ //protected long mTotalFlow;
+ protected ViewGroup mSurfaceParentView;
+ protected ProgressDialog mProgressDialog; //播放加载使用
+ protected TextView mReplayTip;
+
+ public enum ORIENTATION {isPortRait, isLandScape, isNone}
+ protected ORIENTATION mOrientation = ORIENTATION.isNone; //禁止横竖屏标志
+
+ protected static final String AUDIO_TALK_ERROR = "-1000"; //实时对讲初始化失败
+
+
+ //吐司类工具
+ protected void toast(int resId) {
+ if (getActivity() != null && !getActivity().isFinishing()) {
+ Toast.makeText(getActivity(), resId, Toast.LENGTH_SHORT).show();
+ }
+ }
+ protected void toast(String content) {
+ if (getActivity() != null && !getActivity().isFinishing()) {
+ Toast.makeText(getActivity(), content, Toast.LENGTH_SHORT).show();
+ }
+ }
+ public void toastWithImg(String content, int imgId) {
+ if (getActivity() != null && !getActivity().isFinishing()) {
+ Toast toast = Toast.makeText(getActivity(), content, Toast.LENGTH_LONG);
+ toast.setGravity(Gravity.CENTER, 0, 0);
+ LinearLayout toastView = (LinearLayout) toast.getView();
+ ImageView imageCodeProject = new ImageView(getActivity());
+ imageCodeProject.setImageResource(imgId);
+ toastView.addView(imageCodeProject, 0);
+ toast.show();
+ }
+ }
+
+ //播放失败提示器
+ protected void showErrorTip(int resId){
+ mReplayTip.setVisibility(View.VISIBLE);
+ mReplayTip.setText(resId);
+ }
+ protected void showErrorTip(String res){
+ mReplayTip.setVisibility(View.VISIBLE);
+ mReplayTip.setText(res);
+ }
+
+ //播放缓冲提示器
+ protected void showLoading(int res) {
+ mReplayTip.setVisibility(View.GONE);
+ mProgressDialog.setStart(getString(res)); //开启播放加载控件
+ }
+ protected void showLoading(String res) {
+ mReplayTip.setVisibility(View.GONE);
+ mProgressDialog.setStart(res); //开启播放加载控件
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ //将自己的实例传出去
+ if (!(getActivity() instanceof BackHandlerInterface)) {
+ throw new ClassCastException("Hosting activity must implement BackHandlerInterface");
+ } else {
+ ((BackHandlerInterface)getActivity()).setSelectedFragment(this);
+ }
+ }
+
+ @Override
+ public void onDestroyView()
+ {
+ super.onDestroyView();
+ mOrientationListener.disable();
+ mOrientationListener = null;
+ }
+
+ /**
+ * 描述:开启屏幕方向监听
+ */
+ protected final void startListener() {
+ if (getActivity() == null || getActivity().isFinishing()) {
+ return;
+ }
+ mOrientationListener = new OrientationEventListener(getActivity(), SensorManager.SENSOR_DELAY_NORMAL) {
+ @Override
+ public void onOrientationChanged(int rotation) {
+ // 设置竖屏
+ if (getActivity() == null || getActivity().isFinishing()) {
+ return;
+ }
+ requestedOrientation(rotation);
+ }
+ };
+ if (mOrientationListener.canDetectOrientation()) {
+ mOrientationListener.enable();
+ } else {
+ mOrientationListener.disable();
+ }
+
+ }
+ /**
+ * 描述:改变屏幕方向
+ */
+ private void requestedOrientation(int rotation) {
+ if (rotation < 10 || rotation > 350) {// 手机顶部向上
+ setPortOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ } else if (rotation < 100 && rotation > 80) {// 手机右边向上
+ setLandOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
+ } else if (rotation < 190 && rotation > 170) {// 手机低边向上
+ setPortOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
+ } else if (rotation < 280 && rotation > 260) {// 手机左边向上
+ setLandOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ }
+ }
+
+ private void setPortOrientation(int type) {
+ switch(mOrientation){
+ case isNone:
+ getActivity().setRequestedOrientation(type);
+ break;
+ case isPortRait:
+ mOrientation = ORIENTATION.isNone;
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void setLandOrientation(int type) {
+ switch(mOrientation){
+ case isNone:
+ getActivity().setRequestedOrientation(type);
+ break;
+ case isLandScape:
+ mOrientation = ORIENTATION.isNone;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * @see Fragment#onConfigurationChanged(Configuration)
+ * 描述:屏幕方向改变时重新绘制界面
+ */
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ initWindow(newConfig);
+ initSurFace(newConfig);
+ resetViews(newConfig);
+ }
+
+ /**
+ * 描述:初始化playWindow
+ */
+ protected void initWindow(Configuration mConfiguration) {
+ LayoutParams mLayoutParams = (LayoutParams) mSurfaceParentView.getLayoutParams();
+ if (mConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏
+ DisplayMetrics metric = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.heightPixels; // 屏幕高度(像素)
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ } else if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ DisplayMetrics metric = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ }
+ mSurfaceParentView.setLayoutParams(mLayoutParams);
+ }
+
+ /**
+ * 描述:初始化全屏或非全屏
+ */
+ private void initSurFace(Configuration mConfiguration) {
+ if (mConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏
+ if (getActivity() instanceof MediaPlayActivity) {
+ ((MediaPlayActivity) getActivity()).toggleTitle(false);
+ }
+ MediaPlayHelper.setFullScreen(getActivity());
+ } else if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ if (getActivity() instanceof MediaPlayActivity) {
+ ((MediaPlayActivity) getActivity()).toggleTitle(true);
+ }
+ MediaPlayHelper.quitFullScreen(getActivity());
+ }
+ }
+
+ /**
+ * 重置View,子类实现
+ */
+ protected void resetViews(Configuration mConfiguration) {}
+
+ public boolean onBackPressed() {
+ return false;
+ }
+}
+
diff --git a/app/src/main/java/com/lechange/demo/videoplay/VideoPlayOnlineFragment.java b/app/src/main/java/com/lechange/demo/videoplay/VideoPlayOnlineFragment.java
new file mode 100644
index 0000000..7358870
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/VideoPlayOnlineFragment.java
@@ -0,0 +1,1023 @@
+/*
+ * 项目名: YYS
+ * 文件名: MediaPlayOnlineFragment.java
+ * 版权声明:
+ * 本系统的所有内容,包括源码、页面设计,文字、图像以及其他任何信息,
+ * 如未经特殊说明,其版权均属大华技术股份有限公司所有。
+ * Copyright (c) 2015 大华技术股份有限公司
+ * 版权所有
+ */
+package com.lechange.demo.videoplay;
+
+import android.Manifest;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.media.MediaScannerConnection;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.Business.PlayerResultCode;
+import com.lechange.demo.business.Business.RetObject;
+import com.lechange.demo.business.entity.ChannelInfo;
+import com.lechange.demo.business.entity.ChannelPTZInfo;
+import com.lechange.demo.business.util.MediaPlayHelper;
+import com.lechange.demo.business.util.MediaPlayHelper.DHFilesType;
+import com.lechange.demo.common.ProgressDialog;
+import com.lechange.demo.localvideo.RecordListActivity;
+import com.lechange.demo.mediaplay.MediaPlayActivity;
+import com.lechange.opensdk.listener.LCOpenSDK_EventListener;
+import com.lechange.opensdk.listener.LCOpenSDK_TalkerListener;
+import com.lechange.opensdk.media.LCOpenSDK_Talk;
+import com.qw.soul.permission.SoulPermission;
+import com.qw.soul.permission.bean.Permission;
+import com.qw.soul.permission.bean.Permissions;
+import com.qw.soul.permission.callbcak.CheckRequestPermissionsListener;
+import com.yonsz.z1.R;
+import com.yonsz.z1.utils.NetWorkSpeedUtils;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * 描述:实时视频监控 作者: lc
+ */
+public class VideoPlayOnlineFragment extends VideoPlayFragment implements
+ OnClickListener, View.OnLongClickListener {
+
+ protected static final int MediaMain = 0; // 主码流
+ protected static final int MediaAssist = 1; // 辅码流
+ protected static final int RECORDER_TYPE_DAV = 3; // 录制格式DAV
+ protected static final int RECORDER_TYPE_MP4 = 4; // 录制格式MP4
+ private static final String TAG = "MediaPlayOnlineFragment";
+ /**
+ * 描述:开始录制
+ */
+ String path = null;
+ // 状态值
+ private int bateMode = MediaAssist;
+ private AudioTalkStatus mOpenTalk = AudioTalkStatus.talk_close; // 语音对讲状态
+ private boolean isRecord = false; // 正在录制
+ private boolean isOpenSound = false; // 声音打开
+ private boolean isPlaying; // 正在播放
+ private boolean IsPTZOpen = false; // 云台打开
+ private ChannelInfo channelInfo;
+ private LinearLayout mLiveMenu;
+ private TextView mLiveMode;
+ private ImageView mLivePtz;
+ private RelativeLayout rl_live_ptz;
+ private ImageView mLiveSound;
+ private ImageView mLiveScale;
+ private ImageView mLiveStop;
+ private LinearLayout mLiveUseLayout;
+ private LinearLayout mLiveBack;
+ private ImageView mLiveScreenshot;
+ private ImageView mLiveTalk;
+ private ImageView mLiveRecord;
+ private TextView netSpeedTv;
+ private ImageView iv_top, iv_down, iv_left, iv_right;
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case 100:
+ netSpeedTv.setText(msg.obj.toString());
+ break;
+ }
+ super.handleMessage(msg);
+ }
+ };
+
+ private ImageView list_device_localvideo;
+ private ImageView list_device_cloudvideo;
+
+ /**
+ * @param savedInstanceState
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Bundle b = getArguments();
+ if (b != null) {
+ String channelId = b.getString("RESID");
+ channelInfo = Business.getInstance().getChannel(channelId);
+ }
+ if (channelInfo == null) {
+ toast("设备不存在");
+ getActivity().setResult(-1);
+ getActivity().finish();
+ }
+ }
+
+ /**
+ * ViewGroup, Bundle) 描述:
+ *
+ * @return
+ */
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+
+ View mView = inflater.inflate(R.layout.fragment_media_live, container,
+ false);
+ // 必须赋值,父类需要使用到
+ mSurfaceParentView = (ViewGroup) mView.findViewById(R.id.live_window);
+ // 初始化窗口大小
+ LayoutParams mLayoutParams = (LayoutParams) mSurfaceParentView
+ .getLayoutParams();
+ DisplayMetrics metric = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(metric);
+ mLayoutParams.width = metric.widthPixels; // 屏幕宽度(像素)
+ mLayoutParams.height = metric.widthPixels * 9 / 16;
+ mLayoutParams.setMargins(0, 0, 0, 0);
+ mSurfaceParentView.setLayoutParams(mLayoutParams);
+
+ mPlayWin.initPlayWindow(this.getActivity(),
+ (ViewGroup) mView.findViewById(R.id.live_window_content), 0, true);
+
+ mProgressDialog = (ProgressDialog) mView
+ .findViewById(R.id.live_play_load);
+ mReplayTip = (TextView) mView.findViewById(R.id.live_play_pressed);
+
+ iv_top = (ImageView) mView.findViewById(R.id.iv_top);
+ iv_down = (ImageView) mView.findViewById(R.id.iv_down);
+ iv_left = (ImageView) mView.findViewById(R.id.iv_left);
+ iv_right = (ImageView) mView.findViewById(R.id.iv_right);
+ list_device_localvideo = (ImageView) mView.findViewById(R.id.list_device_localvideo);
+ list_device_cloudvideo = (ImageView) mView.findViewById(R.id.list_device_cloudvideo);
+ netSpeedTv = (TextView) mView.findViewById(R.id.tv_net_speed);
+ mLiveMenu = (LinearLayout) mView.findViewById(R.id.live_menu);
+ mLiveMode = (TextView) mView.findViewById(R.id.live_mode);
+ mLivePtz = (ImageView) mView.findViewById(R.id.live_ptz);
+ rl_live_ptz = (RelativeLayout) mView.findViewById(R.id.rl_live_ptz);
+ mLiveSound = (ImageView) mView.findViewById(R.id.live_sound);
+ mLiveUseLayout = (LinearLayout) mView.findViewById(R.id.live_use_layout);
+ mLiveBack = (LinearLayout) mView.findViewById(R.id.live_video_back_layout);
+ mLiveScale = (ImageView) mView.findViewById(R.id.live_scale);
+ mLiveStop = (ImageView) mView.findViewById(R.id.live_stop);
+ mLiveScreenshot = (ImageView) mView.findViewById(R.id.live_screenshot);
+ mLiveTalk = (ImageView) mView.findViewById(R.id.live_talk);
+ mLiveRecord = (ImageView) mView.findViewById(R.id.live_record);
+
+ mReplayTip.setOnClickListener(this);
+ mLiveMode.setOnClickListener(this);
+ mLivePtz.setOnClickListener(this);
+ mLiveSound.setOnClickListener(this);
+ mLiveScale.setOnClickListener(this);
+ mLiveStop.setOnClickListener(this);
+ mLiveScreenshot.setOnClickListener(this);
+ mLiveTalk.setOnClickListener(this);
+ mLiveRecord.setOnClickListener(this);
+ list_device_localvideo.setOnClickListener(this);
+ list_device_cloudvideo.setOnClickListener(this);
+ iv_top.setOnClickListener(this);
+ iv_down.setOnClickListener(this);
+ iv_left.setOnClickListener(this);
+ iv_right.setOnClickListener(this);
+ iv_top.setOnLongClickListener(this);
+ iv_down.setOnLongClickListener(this);
+ iv_left.setOnLongClickListener(this);
+ iv_right.setOnLongClickListener(this);
+
+ new NetWorkSpeedUtils(getContext(), mHandler).startShowNetSpeed();
+ return mView;
+
+ }
+
+ /**
+ * 描述:MediaPlayActivity创建完毕
+ *
+ * @param savedInstanceState
+ */
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ listener = new MyBaseWindowListener();
+ mPlayWin.setWindowListener(listener);
+ mPlayWin.openTouchListener();
+
+ // 开启横竖屏切换
+ startListener();
+
+ // int ability = channelInfo.getAbility();
+ // if ((ability & ChannelInfo.Ability.AudioTalk) == 0) {
+ // if (getActivity().getResources().getConfiguration().orientation ==
+ // Configuration.ORIENTATION_LANDSCAPE) {
+ // mLiveTalk.setOnClickListener(new OnClickListener() {
+ // @Override
+ // public void onClick(View v) {
+ // toast(R.string.video_monitor_unsupport_audio_talk);
+ // }
+ // });
+ // } else if
+ // (getActivity().getResources().getConfiguration().orientation ==
+ // Configuration.ORIENTATION_PORTRAIT) {
+ // mLiveTalk.setOnClickListener(new OnClickListener() {
+ // @Override
+ // public void onClick(View v) {
+ // toast(R.string.video_monitor_unsupport_audio_talk);
+ // }
+ // });
+ // }
+ // }
+ }
+
+ @Override
+ public void onResume() {
+ // TODO Auto-generated method stub
+ super.onResume();
+ play(0);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ // 停止实时视频,无效资源号
+ stop(-1);
+ // 关闭语音对讲
+ if (mOpenTalk == AudioTalkStatus.talk_opening) {
+ stopTalk();
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ // TODO Auto-generated method stub
+ super.onDestroyView();
+ mPlayWin.uninitPlayWindow();// 销毁底层资源
+ }
+
+ /**
+ * 描述:实现个性化界面
+ *
+ * @param mConfiguration
+ */
+ @Override
+ protected void resetViews(Configuration mConfiguration) {
+ super.resetViews(mConfiguration);
+ if (mConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 横屏
+ mLiveUseLayout.setVisibility(View.GONE);
+ mLiveBack.setVisibility(View.GONE);
+ mLiveScale.setTag("LANDSCAPE");
+ mLiveScale.setImageResource(R.drawable.live_btn_smallscreen);
+ } else if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ mLiveUseLayout.setVisibility(View.VISIBLE);
+ mLiveBack.setVisibility(View.VISIBLE);
+ mLiveScale.setTag("PORTRAIT");
+ mLiveScale.setImageResource(R.drawable.live_btn_fullscreen);
+ }
+ }
+
+ private void sendCloudOrder(final Cloud mCloud, final boolean longclick) {
+ if (IsPTZOpen && isPlaying) {
+ // super.sendCloudOrder(mCloud, longclick);
+ Log.d(TAG, "-----is longclick:" + longclick);
+ ChannelPTZInfo.Operation operation = ChannelPTZInfo.Operation.Move;
+ ChannelPTZInfo.Direction direction = null;
+ switch (mCloud) {
+ case up:
+ direction = ChannelPTZInfo.Direction.Up;
+ Log.d(TAG, "-----Up");
+ break;
+ case down:
+ direction = ChannelPTZInfo.Direction.Down;
+ Log.d(TAG, "-----Down");
+ break;
+ case left:// 手势向左, 摄像头向右转
+ direction = ChannelPTZInfo.Direction.Left;
+ Log.d(TAG, "-----case left");
+ break;
+ case right:
+ direction = ChannelPTZInfo.Direction.Right;
+ Log.d(TAG, "-----case right");
+ break;
+ case zoomin:
+ direction = ChannelPTZInfo.Direction.ZoomIn;
+ Log.d(TAG, "-----ZoomIn");
+ break;
+ case zoomout:
+ direction = ChannelPTZInfo.Direction.ZoomOut;
+ Log.d(TAG, "-----ZoomOut");
+ break;
+ case stop:
+ Log.d(TAG, "-----stop");
+ operation = ChannelPTZInfo.Operation.Stop;
+ // direction = ChannelPTZInfo.Direction.Down;
+ break;
+ default:
+ break;
+ }
+ ChannelPTZInfo ptzInfo = new ChannelPTZInfo(operation, direction);
+ ptzInfo.setDuration(ChannelPTZInfo.Duration.Short);
+ if (longclick) {
+ ptzInfo.setDuration(ChannelPTZInfo.Duration.Long);
+ }
+
+ Business.getInstance().AsynControlPtz(channelInfo.getUuid(),
+ ptzInfo, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (!isAdded() || getActivity() == null) {
+ Log.d(TAG, "*******page not exits");
+ return;
+ }
+ // Log.d(TAG,
+ // "-----control callback what:"+msg.what);
+ RetObject retObject = (RetObject) msg.obj;
+ if (msg.what == 0) {
+ Log.d(TAG, "-----control result: true");
+ } else
+ toast(retObject.mMsg);
+ }
+ });
+ }
+ }
+
+ /**
+ * 描述:开始播放
+ */
+ public void play(int strRes) {
+ // if (isPlaying) {
+ stop(-1);
+ // }
+ if (strRes > 0) {
+ showLoading(strRes);
+ } else {
+ showLoading(R.string.common_loading);
+ }
+ mPlayWin.playRtspReal(
+ Business.getInstance().getToken(),
+ channelInfo.getDeviceCode(),
+ channelInfo.getEncryptKey() != null ? channelInfo
+ .getEncryptKey() : channelInfo.getDeviceCode(),
+ channelInfo.getIndex(), bateMode, true);//最后一个参数为true,表示使用长连接
+ }
+
+ /**
+ * 描述:停止播放
+ */
+ public void stop(final int res) {
+ // 关闭播放加载控件
+ mProgressDialog.setStop();
+
+ if (isRecord) {
+ stopRecord();// 关闭录像
+ }
+
+ if (isOpenSound) {
+ closeAudio();// 关闭音频
+ isOpenSound = false;
+ mLiveSound.setImageResource(R.drawable.live_btn_sound_off);
+ }
+ mPlayWin.stopRtspReal(false);// 关闭视频
+ isPlaying = false;
+
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ if (res > 0)
+ showErrorTip(res);
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * 描述:抓拍图像
+ */
+ public String capture() {
+ String captureFilePath = null;
+ // 判断SD卡是否已存在
+ // SD卡容量检查
+ // FIXME 检查设备是否在线
+ // 抓图
+ String channelName = null;
+ if (channelInfo != null) {
+ channelName = channelInfo.getName();
+ } else {
+ channelName = "";
+ }
+
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+
+ captureFilePath = MediaPlayHelper.getCaptureAndVideoPath(
+ DHFilesType.DHImage, channelName);
+ int ret = mPlayWin.snapShot(captureFilePath);
+ if (ret == retOK) {
+ // 扫描到相册中
+ MediaScannerConnection.scanFile(getActivity(),
+ new String[]{captureFilePath}, null, null);
+ Toast.makeText(getActivity(),
+ R.string.video_monitor_image_capture_success,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ captureFilePath = null;
+ Toast.makeText(getActivity(),
+ R.string.video_monitor_image_capture_failed,
+ Toast.LENGTH_SHORT).show();
+ }
+ return captureFilePath;
+ }
+
+ public boolean startRecord() {
+ if (!isPlaying) {
+ toast(R.string.video_monitor_video_record_failed);
+ return false;
+ }
+ // 判断SD卡是否已存在
+ // SD卡容量检查
+
+ // FIXME 要做 ~~~~检查设备是否在线
+
+ // 录像的路径
+ String channelName = null;
+ if (channelInfo != null) {
+ channelName = channelInfo.getName();
+ } else {
+ channelName = "";
+ }
+
+ // 去除通道中在目录中的非法字符
+ channelName = channelName.replace("-", "");
+
+ path = MediaPlayHelper.getCaptureAndVideoPath(DHFilesType.DHVideo,
+ channelName);
+ int recordType = 1;
+ long spaceRemain = 0x7FFFFFFF; //保留字段
+ // 开始录制 1
+ int ret = mPlayWin.startRecord(path, recordType, spaceRemain);
+ if (ret != retOK) {
+ toast(R.string.video_monitor_video_record_failed);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * 关闭录像
+ */
+ public void stopRecord() {
+ mPlayWin.stopRecord();
+ isRecord = false;
+ toast(getString(R.string.video_monitor_video_record_success));
+ mLiveRecord.setImageResource(R.drawable.icon_videotape_nor);
+
+ MediaScannerConnection.scanFile(getActivity(), new String[]{path},
+ null, null);
+ }
+
+ /**
+ * 打开声音
+ */
+ public boolean openAudio() {
+ return mPlayWin.playAudio() == retOK;
+ }
+
+ /**
+ * 关闭声音
+ */
+ public boolean closeAudio() {
+ return mPlayWin.stopAudio() == retOK;
+ }
+
+ /**
+ * 描述:开始对讲
+ */
+ public void startTalk() {
+ if (!isPlaying) {
+ toast(R.string.video_monitor_talk_open_error);
+ return;
+ }
+
+ toastWithImg(getString(R.string.video_monitor_media_talk),
+ R.drawable.live_pic_talkback);
+
+ // 替换图片
+ mLiveTalk.setImageResource(R.drawable.icon_dialogue_pre);
+ mOpenTalk = AudioTalkStatus.talk_opening;
+ // 关闭扬声器 默认为关
+ if (isOpenSound) {
+ closeAudio();
+ mLiveSound.setImageResource(R.drawable.live_btn_sound_off);
+ }
+ mLiveSound.setClickable(false);
+ LCOpenSDK_Talk.setListener(new AudioTalkerListener());
+ LCOpenSDK_Talk.playTalk(
+ Business.getInstance().getToken(),
+ channelInfo.getDeviceCode(),
+ channelInfo.getEncryptKey() != null ? channelInfo
+ .getEncryptKey() : channelInfo.getDeviceCode(), true);//对讲使用长连接
+ }
+
+ /**
+ * 描述:停止对讲
+ */
+ public void stopTalk() {
+ Log.d("playAudio", "stopTalk press");
+ toast(R.string.video_monitor_media_talk_close);
+ // 替换图片
+ mLiveTalk.setImageResource(R.drawable.icon_dialogue_nor);
+ LCOpenSDK_Talk.stopTalk();
+ // 解决gc回收问题
+ LCOpenSDK_Talk.setListener(null);
+ mOpenTalk = AudioTalkStatus.talk_close;
+ // 开启扬声器
+ if (isOpenSound && isPlaying) {
+ openAudio();
+ mLiveSound.setImageResource(R.drawable.live_btn_sound_on);
+ }
+ mLiveSound.setClickable(true);
+ }
+
+ @Override
+ public void onClick(View view) {
+ // TODO Auto-generated method stub
+ switch (view.getId()) {
+ case R.id.live_ptz:
+ if (!isPlaying) {
+ return;
+ }
+ if ((channelInfo.getAbility() & ChannelInfo.Ability.PTZ) != 0) {
+ if (IsPTZOpen) {
+ // 测试专用
+ // mPlayWin.setStreamCallback(0);
+ IsPTZOpen = false;
+ mLivePtz.setImageResource(R.drawable.icon_control_nor);
+ rl_live_ptz.setVisibility(View.GONE);
+ } else {
+ // 测试专用
+ // mPlayWin.setStreamCallback(1);
+ IsPTZOpen = true;
+ mLivePtz.setImageResource(R.drawable.icon_control_pre);
+ rl_live_ptz.setVisibility(View.VISIBLE);
+ }
+ } else {
+ toast(R.string.toast_device_ability_no_ptz);
+ }
+ break;
+ case R.id.live_scale:
+ if ("LANDSCAPE".equals(mLiveScale.getTag())) {
+ mOrientation = ORIENTATION.isPortRait;
+ getActivity().setRequestedOrientation(
+ ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ } else {
+ mOrientation = ORIENTATION.isLandScape;
+ getActivity().setRequestedOrientation(
+ ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ }
+ break;
+ case R.id.live_stop:
+ if (isPlaying) {
+ // 停止实时视频,无效资源号
+ stop(-1);
+ // 关闭语音对讲
+ if (mOpenTalk == AudioTalkStatus.talk_opening) {
+ stopTalk();
+ }
+ } else {
+ play(0);
+ }
+ break;
+ case R.id.live_mode:
+ // if(isPlaying) //播放是个异步的,多次点击会使停止播放顺序乱掉
+ if (mOpenTalk == AudioTalkStatus.talk_opening) {
+ stopTalk();
+ }
+ // 高清切换到流畅
+ if (bateMode == MediaMain) {
+ bateMode = MediaAssist;
+ mLiveMode.setText("流畅");
+ play(R.string.video_monitor_change_stream_normal);
+ }// 流畅切换到高清
+ else if (bateMode == MediaAssist) {
+ bateMode = MediaMain;
+ mLiveMode.setText("高清");
+ play(R.string.video_monitor_change_stream_hd);
+ }
+ break;
+ case R.id.live_talk:
+ switch (mOpenTalk) {
+ case talk_open:
+ case talk_opening:
+ stopTalk();
+ break;
+ case talk_close:
+ SoulPermission.getInstance().checkAndRequestPermissions(
+ Permissions.build(Manifest.permission.RECORD_AUDIO),
+ //if you want do noting or no need all the callbacks you may use SimplePermissionsAdapter instead
+ new CheckRequestPermissionsListener() {
+ @Override
+ public void onAllPermissionOk(Permission[] allPermissions) {
+ startTalk();
+ }
+
+ @Override
+ public void onPermissionDenied(Permission[] refusedPermissions) {
+ Toast.makeText(getContext(), "此功能需要开启麦克风权限", Toast.LENGTH_LONG).show();
+ }
+ });
+ break;
+ default:
+ break;
+ }
+ break;
+ case R.id.live_sound:
+ if (mOpenTalk != AudioTalkStatus.talk_close || !isPlaying) {
+ toast(R.string.video_monitor_load_talk_sound_error);
+ } else {
+ if (isOpenSound) {
+ boolean result = closeAudio();
+ if (result) {
+ mLiveSound
+ .setImageResource(R.drawable.live_btn_sound_off);
+ toast(R.string.video_monitor_sound_close);
+ isOpenSound = false;
+ }
+ } else {
+ boolean result = openAudio();
+ if (result) {
+ mLiveSound
+ .setImageResource(R.drawable.live_btn_sound_on);
+ toast(R.string.video_monitor_sound_open);
+ isOpenSound = true;
+ }
+ }
+ }
+ break;
+ case R.id.live_screenshot:
+ mLiveScreenshot
+ .setImageResource(R.drawable.icon_photograph_pre);
+ capture();
+ mLiveScreenshot
+ .setImageResource(R.drawable.icon_photograph_nor);
+ break;
+ case R.id.live_record:
+ if (!isRecord) {
+ boolean result = startRecord();
+ if (result) {
+ toastWithImg(
+ getString(R.string.video_monitor_media_record),
+ R.drawable.live_pic_record);
+ isRecord = true;
+ mLiveRecord
+ .setImageResource(R.drawable.icon_videotape_pre);
+ }
+ } else {
+ stopRecord();
+ }
+ break;
+ case R.id.live_play_pressed:
+ play(-1);
+ break;
+ case R.id.list_device_cloudvideo:
+ Intent intent = new Intent(getContext(), RecordListActivity.class);
+ intent.putExtra("UUID", getActivity().getIntent().getExtras().get("UUID").toString());
+ intent.putExtra("MEDIA_TITLE", R.string.cloud_records_name);
+ intent.putExtra("TYPE", MediaPlayActivity.IS_VIDEO_REMOTE_CLOUD_RECORD);
+ startActivity(intent);
+ break;
+ case R.id.list_device_localvideo:
+ Intent intent1 = new Intent(getContext(), RecordListActivity.class);
+ intent1.putExtra("UUID", getActivity().getIntent().getExtras().get("UUID").toString());
+ intent1.putExtra("TYPE", MediaPlayActivity.IS_VIDEO_REMOTE_RECORD);
+ intent1.putExtra("MEDIA_TITLE", R.string.local_records_name);
+ startActivity(intent1);
+ break;
+ case R.id.iv_top:
+ sendCloudOrder(Cloud.up, false);
+ break;
+ case R.id.iv_down:
+ sendCloudOrder(Cloud.down, false);
+ break;
+ case R.id.iv_left:
+ sendCloudOrder(Cloud.left, false);
+ break;
+ case R.id.iv_right:
+ sendCloudOrder(Cloud.right, false);
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ switch (v.getId()) {
+ case R.id.iv_top:
+ sendCloudOrder(Cloud.up, false);
+ break;
+ case R.id.iv_down:
+ sendCloudOrder(Cloud.down, false);
+ break;
+ case R.id.iv_left:
+ sendCloudOrder(Cloud.left, false);
+ break;
+ case R.id.iv_right:
+ sendCloudOrder(Cloud.right, false);
+ break;
+ }
+ return false;
+ }
+
+ public enum Cloud {
+ up, down, left, right, leftUp, rightUp, leftDown, RightDown, zoomin, zoomout, stop
+ }
+
+ private enum AudioTalkStatus {
+ talk_close, talk_opening, talk_open
+ }
+
+ class MyBaseWindowListener extends LCOpenSDK_EventListener {
+ @Override
+ public void onPlayerResult(int index, String code, int type) {
+ if (type == Business.RESULT_SOURCE_OPENAPI) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_play_error);
+ }
+ }
+ });
+ }
+ } else {
+ if (code.equals(PlayerResultCode.STATE_PACKET_FRAME_ERROR)
+ || code.equals(PlayerResultCode.STATE_RTSP_TEARDOWN_ERROR)
+ || code.equals(PlayerResultCode.STATE_RTSP_AUTHORIZATION_FAIL)
+ || code.equals(PlayerResultCode.STATE_RTSP_KEY_MISMATCH)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ stop(R.string.video_monitor_play_error);
+ }
+ }
+ });
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onPlayBegan(int index) {
+ // TODO Auto-generated method stub
+ // 显示码率
+ // if (mHander != null) {
+ // mHander.post(MediaPlayOnlineFragment.this);
+ // }
+ isPlaying = true;
+ // 建立码流,自动开启音频
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ @Override
+ public void run() {
+ if (isAdded()) {
+ // showLoading(R.string.video_monitor_data_cache);
+ onClick(mLiveSound);
+ }
+ }
+ });
+ }
+ // 关闭播放加载控件
+ mProgressDialog.setStop();
+ }
+
+ // public void onReceiveData(int len) {
+ // // 流量统计
+ // mTotalFlow += len;
+ // }
+ @Override
+ public void onStreamCallback(int index, byte[] data, int len) {
+ // Log.d(TAG, "LCOpenSDK_EventListener::onStreamCallback-size : " +
+ // len);
+ try {
+ String path = Environment.getExternalStorageDirectory()
+ .getPath() + "/streamCallback.ts";
+ FileOutputStream fout = new FileOutputStream(path, true);
+ fout.write(data);
+ fout.close();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+ @Override
+ public void onWindowLongPressBegin(int index, Direction dir, float dx,
+ float dy) {
+ sendCloudOrder(direction2Cloud(dir), true);
+ }
+
+ @Override
+ public void onWindowLongPressEnd(int index) {
+ sendCloudOrder(Cloud.stop, false);
+ }
+
+ // 电子缩放
+ @Override
+ public void onZooming(int index, float dScale) {
+ if (IsPTZOpen == false) {
+ mPlayWin.doScale(dScale);
+ }
+
+ }
+
+ // 云台缩放
+ @Override
+ public void onZoomEnd(int index, ZoomType zoom) {
+ Log.d(TAG, "onZoomEnd" + zoom);
+ if (IsPTZOpen == false) {
+ return;
+ }
+ // TODO Auto-generated method stub
+ sendCloudOrder(zoom == ZoomType.ZOOM_IN ? Cloud.zoomin
+ : Cloud.zoomout, false);
+ }
+
+ // 滑动开始
+ @Override
+ public boolean onSlipBegin(int index, Direction dir, float dx, float dy) {
+ if (IsPTZOpen == false && mPlayWin.getScale() > 1) {
+ Log.d(TAG, "onflingBegin ");
+ }
+ sendCloudOrder(direction2Cloud(dir), false);
+ return true;
+ }
+
+ // 滑动中
+ @Override
+ public void onSlipping(int index, Direction dir, float prex,
+ float prey, float dx, float dy) {
+ if (IsPTZOpen == false && mPlayWin.getScale() > 1) {
+ Log.d(TAG, "onflingBegin onFlinging");
+ mPlayWin.doTranslate(dx, dy);
+ }
+ }
+
+ // 滑动结束
+ @Override
+ public void onSlipEnd(int index, Direction dir, float dx, float dy) {
+ if (IsPTZOpen == false && mPlayWin.getScale() > 1) {
+ Log.d(TAG, "onflingBegin onFlingEnd");
+ return;
+ }
+
+ // sendCloudOrder(Cloud.stop, false);
+ }
+
+ private Cloud direction2Cloud(Direction dir) {
+ Cloud cloud = null;
+ switch (dir) {
+ case Up:
+ cloud = Cloud.up;
+ break;
+ case Down:
+ cloud = Cloud.down;
+ break;
+ case Left:
+ cloud = Cloud.left;
+ break;
+ case Right:
+ cloud = Cloud.right;
+ break;
+ case Left_up:
+ cloud = Cloud.leftUp;
+ break;
+ case Left_down:
+ cloud = Cloud.leftDown;
+ break;
+ case Right_up:
+ cloud = Cloud.rightUp;
+ break;
+ case Right_down:
+ cloud = Cloud.RightDown;
+ break;
+ default:
+ break;
+ }
+ return cloud;
+ }
+
+ public void onWindowDBClick(int index, float dx, float dy) {
+ // TODO Auto-generated method stub
+ switch (mLiveMenu.getVisibility()) {
+ case View.GONE:
+ mLiveMenu.setVisibility(View.VISIBLE);
+ break;
+ case View.VISIBLE:
+ mLiveMenu.setVisibility(View.GONE);
+ break;
+ default:
+ break;
+ }
+ }
+
+ }
+
+ class AudioTalkerListener extends LCOpenSDK_TalkerListener {
+ /**
+ * 描述:对讲状态获取
+ */
+ @Override
+ public void onTalkResult(String error, int type) {
+ // TODO Auto-generated method stub
+ if (type == Business.RESULT_SOURCE_OPENAPI
+ || error.equals(AUDIO_TALK_ERROR)
+ || error.equals(PlayerResultCode.STATE_PACKET_FRAME_ERROR)
+ || error.equals(PlayerResultCode.STATE_RTSP_TEARDOWN_ERROR)
+ || error.equals(PlayerResultCode.STATE_RTSP_AUTHORIZATION_FAIL)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ // 提示对讲打开失败
+ toast(R.string.video_monitor_talk_open_error);
+ stopTalk();// 关闭播放
+ }
+ }
+ });
+ }
+ } else if (error.equals(PlayerResultCode.STATE_RTSP_PLAY_READY)) {
+ if (mHander != null) {
+ mHander.post(new Runnable() {
+ public void run() {
+ if (isAdded()) {
+ // 提示对讲打开成功
+ toast(R.string.video_monitor_media_talk_ready);
+ }
+ }
+ });
+ }
+ mOpenTalk = AudioTalkStatus.talk_open;
+ }
+
+ }
+
+ @Override
+ public void onTalkPlayReady() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onAudioRecord(byte[] pData, int length, int audioFormat, int sampleRate, int sampleDepth) {
+ super.onAudioRecord(pData, length, audioFormat, sampleRate, sampleDepth);
+ BufferedOutputStream bufferedOutputStream;
+ FileOutputStream fileOutputStream;
+ String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/AudioFile.pcm";
+ File file = new File(filePath);
+ if (file.exists()) {
+ try {
+ fileOutputStream = new FileOutputStream(file, true);
+ bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+ try {
+ bufferedOutputStream.write(pData);
+ bufferedOutputStream.flush();
+ bufferedOutputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } finally {
+
+ }
+ } else {
+ try {
+ file.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void onAudioReceive(byte[] pData, int length, int audioFormat, int sampleRate, int sampleDepth) {
+ super.onAudioReceive(pData, length, audioFormat, sampleRate, sampleDepth);
+ }
+
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/videoplay/VideoRecycler.java b/app/src/main/java/com/lechange/demo/videoplay/VideoRecycler.java
new file mode 100644
index 0000000..e1c006a
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/VideoRecycler.java
@@ -0,0 +1,54 @@
+package com.lechange.demo.videoplay;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+
+import com.yonsz.z1.R;
+
+
+public class VideoRecycler extends RecyclerView {
+
+ public VideoRecycler(Context context) {
+ this(context, null);
+ }
+
+ public VideoRecycler(Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public VideoRecycler(Context context, @Nullable AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ initView();
+ }
+
+ private void initView() {
+ setBackgroundColor(getResources().getColor(R.color.colorAccent));
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+ int width = 0;
+ int height = 0;
+
+ width = widthSize;
+ switch (heightMode) {
+ case MeasureSpec.EXACTLY:
+ height = heightSize;
+ break;
+ default:
+ height = widthSize;
+ break;
+ }
+ if (height > heightSize) {
+ height = heightSize;
+ }
+ setMeasuredDimension(width, height);
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/videoplay/VideoTextureView.java b/app/src/main/java/com/lechange/demo/videoplay/VideoTextureView.java
new file mode 100644
index 0000000..b8e335c
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/videoplay/VideoTextureView.java
@@ -0,0 +1,55 @@
+package com.lechange.demo.videoplay;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.TextureView;
+
+public class VideoTextureView extends TextureView {
+ public String TAG = getClass().getSimpleName();
+
+ public VideoTextureView(Context context) {
+ this(context, null);
+ }
+
+ public VideoTextureView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+ int width = 0;
+ int height = 0;
+ // Log.d(TAG, "onMeasure: widthMode-->" + widthMode + "heightMode-->" + heightMode);
+ // if (widthMode == MeasureSpec.EXACTLY) {
+ // // Parent has told us how big to be. So be it.
+ // width = widthSize;
+ // } else if (widthMode == MeasureSpec.AT_MOST) {
+ // width = 200;
+ // } else {
+ // width = widthSize;
+ // Log.d(TAG, "onMeasure: width else");
+ // }
+ width = widthSize;
+ height = width * 3 / 4;
+ if (height > heightSize) {
+ height = heightSize;
+ }
+
+ // if (heightMode == MeasureSpec.EXACTLY) {
+ // // Parent has told us how big to be. So be it.
+ // height = heightSize;
+ // } else if (widthMode == MeasureSpec.AT_MOST) {
+ // height = width * 3 / 4;
+ // } else {
+ // height = heightSize;
+ // }
+ // Log.d(TAG, "onMeasure: width-->" + width + "height-->" + height);
+ setMeasuredDimension(width, height);
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/view/Direction.java b/app/src/main/java/com/lechange/demo/view/Direction.java
new file mode 100644
index 0000000..aa879f5
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/view/Direction.java
@@ -0,0 +1,9 @@
+package com.lechange.demo.view;
+
+/**
+ * 云台移动方向 8个方向
+ */
+
+public enum Direction {
+ Up, Down, Left, Right, Left_up, Left_down, Right_up, Right_down
+}
diff --git a/app/src/main/java/com/lechange/demo/view/LcCloudRudderView.java b/app/src/main/java/com/lechange/demo/view/LcCloudRudderView.java
new file mode 100644
index 0000000..14ca4c6
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/view/LcCloudRudderView.java
@@ -0,0 +1,437 @@
+package com.lechange.demo.view;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PaintFlagsDrawFilter;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import com.yonsz.z1.R;
+
+
+/**
+ * 云台控制面板
+ */
+@SuppressLint("DrawAllocation")
+public class LcCloudRudderView extends View {
+ private Point mRockerPosition;
+ private final Point mCtrlPoint = new Point(100, 100);
+ private float mSolidRudderRadius = 60;
+ private float mChangeRudderRadius = 60;
+ private int mWheelRadius = 100;
+ private RudderListener listener = null;
+ private int mDownState;
+ private int firstX, firstY;
+ private int dCtrlPointx, dCtrlPointy;
+ private static Bitmap mBigCircleBg;
+ private static Bitmap mBigCircleBg_h;
+ private static Bitmap mSmallCircleBg;
+ private static Bitmap mBigCircleLandScapeBg;
+ private static Bitmap mBigCircleLandScapeBg_h;
+ private static Bitmap mSmallCircleLandScapeBg;
+ private float mAngle;
+ private boolean mShowDirectPic;
+ private boolean mCanTouch = true;
+ private boolean mLandScapeOnly = false;
+ //支持四方向
+ private boolean mSupportFourDirection=true;
+
+
+ public LcCloudRudderView(Context context) {
+ super(context);
+ init();
+ }
+
+ public LcCloudRudderView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setAttribute(context, attrs);
+ init();
+ }
+
+ private void setAttribute(Context context, AttributeSet attrs) {
+ if (attrs != null) {
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.LcCloudRudderView);
+ mLandScapeOnly = array.getBoolean(R.styleable.LcCloudRudderView_landscape_only, false);
+ array.recycle();
+ }
+ }
+
+ private void init() {
+ setBackgroundColor(Color.TRANSPARENT);
+ this.setKeepScreenOn(true);
+ mCanTouch = true;
+ Paint mPaint = new Paint();
+ mPaint.setColor(Color.GREEN);
+ mPaint.setAntiAlias(true);
+ mRockerPosition = new Point(mCtrlPoint);
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+
+ if (mBigCircleBg == null) {
+ mBigCircleBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_cloudstage_direction_default);
+ }
+
+ if (mBigCircleBg_h == null) {
+ mBigCircleBg_h = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_cloudstage_direction_up);
+ }
+
+ if (mSmallCircleBg == null) {
+ mSmallCircleBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_cloudstage_direction_button);
+ }
+ if (mBigCircleLandScapeBg == null) {
+ mBigCircleLandScapeBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_video_cloudstage_direction_default);
+ }
+
+ if (mBigCircleLandScapeBg_h == null) {
+ mBigCircleLandScapeBg_h = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_video_cloudstage_direction_up);
+ }
+
+ if (mSmallCircleLandScapeBg == null) {
+ mSmallCircleLandScapeBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_video_cloudstage_direction_button);
+ }
+ mSolidRudderRadius = (float) (mSmallCircleBg.getHeight() / 2.0);
+ }
+
+ /**
+ * 重置云台背景图,为了区分4方向和8方向
+ */
+ public void resetCircleBg() {
+ if (mSupportFourDirection) {
+ if (mBigCircleBg != null) {
+ mBigCircleBg.recycle();
+ mBigCircleBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_cloudstage_direction_default_four);
+ }
+ if (mBigCircleLandScapeBg != null) {
+ mBigCircleLandScapeBg.recycle();
+ mBigCircleLandScapeBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_video_cloudstage_direction_default_four);
+ }
+ } else {
+ if (mBigCircleBg != null) {
+ mBigCircleBg.recycle();
+ mBigCircleBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_cloudstage_direction_default);
+ }
+ if (mBigCircleLandScapeBg != null) {
+ mBigCircleLandScapeBg.recycle();
+ mBigCircleLandScapeBg = BitmapFactory.decodeResource(getResources(), R.mipmap.play_module_video_cloudstage_direction_default);
+ }
+ }
+ invalidate();
+ }
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ Bitmap bigCirclebg = mLandScapeOnly ? mBigCircleLandScapeBg : mBigCircleBg;
+ if (bigCirclebg == null || bigCirclebg.isRecycled()) {
+ return;
+ }
+
+ try {
+ canvas.save();
+ canvas.translate(mCtrlPoint.x, mCtrlPoint.y);
+ canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
+
+ Paint paint = new Paint();
+ paint.setAntiAlias(true);
+ Rect srcRect = new Rect(0, 0, bigCirclebg.getWidth(), bigCirclebg.getHeight());
+ RectF dstRcctF = new RectF(-mWheelRadius, -mWheelRadius, mWheelRadius, mWheelRadius);
+ canvas.drawBitmap(bigCirclebg, srcRect, dstRcctF, paint);
+ canvas.restore();
+
+ if (mShowDirectPic) {
+
+ Bitmap bigCircleBg_h = mLandScapeOnly ? mBigCircleLandScapeBg_h : mBigCircleBg_h;
+ canvas.save();
+ canvas.translate(mCtrlPoint.x, mCtrlPoint.y);
+ canvas.rotate(mAngle);
+ Rect srcRect2 = new Rect(0, 0, bigCircleBg_h.getWidth(), bigCircleBg_h.getHeight());
+ RectF dstRcctF2 = new RectF(-mWheelRadius, -mWheelRadius, mWheelRadius, mWheelRadius);
+ canvas.drawBitmap(bigCircleBg_h, srcRect2, dstRcctF2, paint);
+ canvas.restore();
+ }
+
+ Bitmap smallCircleBg = mLandScapeOnly ? mSmallCircleLandScapeBg : mSmallCircleBg;
+ Rect srcRect3 = new Rect(0, 0, smallCircleBg.getWidth(), smallCircleBg.getHeight());
+ RectF dstRcctF3 = new RectF(mRockerPosition.x - mChangeRudderRadius, mRockerPosition.y - mChangeRudderRadius, mRockerPosition.x + mChangeRudderRadius, mRockerPosition.y + mChangeRudderRadius);
+ canvas.drawBitmap(smallCircleBg, srcRect3, dstRcctF3, paint);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+
+ }
+ }
+
+
+ public void setRudderListener(RudderListener rockerListener) {
+ listener = rockerListener;
+ }
+
+ public boolean isSupportFourDirection() {
+ return mSupportFourDirection;
+ }
+
+ /**
+ * 设置是否支持四方向云台
+ *
+ * @param supportFourDirection
+ */
+ public void setSupportFourDirection(boolean supportFourDirection) {
+ this.mSupportFourDirection = supportFourDirection;
+ resetCircleBg();
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!mCanTouch) {
+ return true;
+ }
+ int len = (int) Math.sqrt(Math.pow(mCtrlPoint.x - event.getX(), 2) + Math.pow(mCtrlPoint.y - event.getY(), 2));
+ switch (event.getAction() & MotionEvent.ACTION_MASK) {
+ case MotionEvent.ACTION_DOWN:
+ if (len < mWheelRadius / 2) {
+ if (listener != null) {
+ listener.onSteeringWheelChangedBegin();
+ }
+ mDownState = 1;
+ firstX = (int) event.getX();
+ firstY = (int) event.getY();
+ dCtrlPointx = firstX - mCtrlPoint.x;
+ dCtrlPointy = firstY - mCtrlPoint.y;
+ } else if (len >= (mWheelRadius / 2) && len <= mWheelRadius) {
+ if (listener != null) {
+ listener.onSteeringWheelChangedBegin();
+ }
+ mDownState = 2;
+ mShowDirectPic = true;
+ firstX = (int) event.getX();
+ firstY = (int) event.getY();
+ dCtrlPointx = firstX - mCtrlPoint.x;
+ dCtrlPointy = firstY - mCtrlPoint.y;
+ float radian = getRadian(mCtrlPoint, new Point((int) event.getX(), (int) event.getY()));
+ int angle = LcCloudRudderView.this.getAngleConvert(radian);
+ Direction direction = directConvert(angle);
+ if (listener != null) {
+ listener.onSteeringWheelChangedSingle(direction);
+ }
+ }
+ invalidate();
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (mDownState == 1) {
+ int dragLen = (int) Math.sqrt(Math.pow(firstX - event.getX(), 2) + Math.pow(firstY - event.getY(), 2));
+ if (dragLen <= mWheelRadius - mChangeRudderRadius / 2) {
+ mRockerPosition.set((int) event.getX() - dCtrlPointx, (int) event.getY() - dCtrlPointy);
+ } else {
+ int cutRadius = (int) (mWheelRadius - mChangeRudderRadius / 2);
+ float radian = getRadian(mCtrlPoint, new Point((int) event.getX() - (firstX - mCtrlPoint.x), (int) event.getY() - (firstY - mCtrlPoint.y)));
+ mRockerPosition = new Point(mCtrlPoint.x + (int) (cutRadius * Math.cos(radian)), mCtrlPoint.y + (int) (cutRadius * Math.sin(radian)));
+
+ }
+ float radian = getRadian(mCtrlPoint, new Point((int) event.getX(), (int) event.getY()));
+ int angle = LcCloudRudderView.this.getAngleConvert(radian);
+ Direction direction = directConvert(angle);
+ if (dragLen >= (mWheelRadius / 2)) {//超过 边界再发送命令
+ mShowDirectPic = true;
+ if (listener != null) {
+ listener.onSteeringWheelChangedContinue(direction);
+ }
+ } else {//未超过边界,发送停止命令,图标不显示按下
+ mShowDirectPic = false;
+ if (listener != null) {
+ listener.onSteeringWheelChangedContinue(null);
+ }
+ }
+ } else if (mDownState == 2) {
+ if (listener != null) {
+ if (len >= (mWheelRadius / 2) && len <= mWheelRadius) {
+ mShowDirectPic = true;
+ float radian = getRadian(mCtrlPoint, new Point((int) event.getX(), (int) event.getY()));
+ int angle = LcCloudRudderView.this.getAngleConvert(radian);
+ directConvert(angle);
+ } else {
+ mShowDirectPic = false;
+ }
+ }
+
+ }
+ invalidate();
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ if (mDownState == 1) {
+ mShowDirectPic = false;
+ mRockerPosition = new Point(mCtrlPoint);
+ if (listener != null) {
+ listener.onSteeringWheelChangedContinue(null);
+ listener.onSteeringWheelChangedEnd();
+ }
+
+ } else if (mDownState == 2) {
+ mShowDirectPic = false;
+ float radian = getRadian(mCtrlPoint, new Point((int) event.getX(), (int) event.getY()));
+ int angle = LcCloudRudderView.this.getAngleConvert(radian);
+ Direction direction = directConvert(angle);
+ mRockerPosition = new Point(mCtrlPoint);
+ if (listener != null) {
+ //listener.onSteeringWheelChangedSingle(direction);
+ listener.onSteeringWheelChangedEnd();
+ }
+ }
+ firstX = 0;
+ firstY = 0;
+ mDownState = 0;
+ invalidate();
+ break;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ private static float getRadian(Point a, Point b) {
+ float lenA = b.x - a.x;
+ float lenB = b.y - a.y;
+ float lenC = (float) Math.sqrt(lenA * lenA + lenB * lenB);
+ float ang = (float) Math.acos(lenA / lenC);
+ ang = ang * (b.y < a.y ? -1 : 1);
+ return ang;
+ }
+
+ private Direction directConvert(int angle) {
+ Direction direction = Direction.Left;
+ if (mSupportFourDirection) {
+ if (angle <= 45 || angle > 315) {
+ direction = Direction.Right;
+ mAngle = 90;
+ } else if (angle > 45 && angle <= 135) {
+ direction = Direction.Up;
+ mAngle = 0;
+ } else if (angle > 135 && angle <= 225) {
+ direction = Direction.Left;
+ mAngle = 270;
+ } else if (angle > 225 && angle <= 315) {
+ direction = Direction.Down;
+ mAngle = 180;
+ }
+
+ } else {
+
+ if (angle <= 22.5 || angle > 337.5) {
+ direction = Direction.Right;
+ mAngle = 90;
+ } else if (angle > 22.5 && angle <= 67.5) {
+ direction = Direction.Right_up;
+ mAngle = 45;
+ } else if (angle > 67.5 && angle <= 112.5) {
+ direction = Direction.Up;
+ mAngle = 0;
+ } else if (angle > 112.5 && angle <= 157.5) {
+ direction = Direction.Left_up;
+ mAngle = 315;
+ } else if (angle > 157.5 && angle <= 202.5) {
+ direction = Direction.Left;
+ mAngle = 270;
+ } else if (angle > 202.5 && angle <= 247.5) {
+ direction = Direction.Left_down;
+ mAngle = 225;
+ } else if (angle > 247.5 && angle <= 292.5) {
+ direction = Direction.Down;
+ mAngle = 180;
+ } else if (angle > 292.5 && angle <= 337.5) {
+ direction = Direction.Right_down;
+ mAngle = 135;
+ }
+ }
+
+ return direction;
+ }
+
+ private int getAngleConvert(float radian) {
+ int tmp = (int) Math.round(radian / Math.PI * 180);
+ if (tmp < 0) {
+ return -tmp;
+ } else {
+ return 180 + (180 - tmp);
+ }
+ }
+
+ public interface RudderListener {
+ void onSteeringWheelChangedBegin();
+
+ void onSteeringWheelChangedContinue(Direction direction);
+
+ void onSteeringWheelChangedSingle(Direction direction);
+
+ void onSteeringWheelChangedEnd();
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ int len = Math.min(w, h) / 2;
+ mWheelRadius = (int) (len - mSolidRudderRadius / 2);
+ mChangeRudderRadius = mWheelRadius * 17 / 40;
+
+ mCtrlPoint.set(w / 2, h / 2);
+ mRockerPosition.set(w / 2, h / 2);
+ postInvalidate();
+ }
+
+ public void enable(boolean enabled) {
+ if (mCanTouch && !enabled) {
+ mShowDirectPic = false;
+ mRockerPosition = new Point(mCtrlPoint);
+ invalidate();
+ if (listener != null) {
+ listener.onSteeringWheelChangedContinue(null);
+ listener.onSteeringWheelChangedEnd();
+ }
+ }
+ setEnabled(enabled);
+ setAlpha(enabled ? 1f : 0.5f);
+ mCanTouch = enabled;
+ }
+
+ public void unit() {
+ Bitmap bigCirclebg = mLandScapeOnly ? mBigCircleLandScapeBg : mBigCircleBg;
+ Bitmap bigCircleBg_h = mLandScapeOnly ? mBigCircleLandScapeBg_h : mBigCircleBg_h;
+ Bitmap smallCircleBg = mLandScapeOnly ? mSmallCircleLandScapeBg : mSmallCircleBg;
+ if (bigCirclebg != null) {
+ bigCirclebg.recycle();
+ if (mLandScapeOnly) {
+ mBigCircleLandScapeBg = null;
+ } else {
+ mBigCircleBg = null;
+ }
+ }
+ if (bigCircleBg_h != null) {
+ bigCircleBg_h.recycle();
+ if (mLandScapeOnly) {
+ mBigCircleLandScapeBg_h = null;
+ } else {
+ mBigCircleBg_h = null;
+ }
+ }
+ if (smallCircleBg != null) {
+ smallCircleBg.recycle();
+ if (mLandScapeOnly) {
+ mSmallCircleLandScapeBg = null;
+ } else {
+ mSmallCircleBg = null;
+ }
+ }
+ listener = null;
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/view/LcPopupWindow.java b/app/src/main/java/com/lechange/demo/view/LcPopupWindow.java
new file mode 100644
index 0000000..b9b8227
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/view/LcPopupWindow.java
@@ -0,0 +1,63 @@
+package com.lechange.demo.view;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.PopupWindow;
+
+import com.common.openapi.entity.DeviceDetailListData;
+import com.lechange.demo.adapter.PixelListAdapter;
+import com.yonsz.z1.R;
+
+import java.util.List;
+
+/**
+ * 显示支持分辨率的弹框
+ */
+public class LcPopupWindow extends PopupWindow {
+
+ private RecyclerView pixelRecycle;
+// private ArrayList mData = new ArrayList<>();
+ private PixelListAdapter mPixelAdapter;
+
+ public LcPopupWindow(Context context, List dataList) {
+ super(context);
+ setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
+ setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
+ setOutsideTouchable(true);
+ setFocusable(true);
+ setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ View contentView = LayoutInflater.from(context).inflate(R.layout.view_pixel_popwindow,
+ null, false);
+ pixelRecycle = contentView.findViewById(R.id.pixel_recycle);
+ pixelRecycle.setLayoutManager(new LinearLayoutManager(context));
+ mPixelAdapter = new PixelListAdapter(context,dataList);
+ pixelRecycle.setAdapter(mPixelAdapter);
+ setContentView(contentView);
+ }
+
+ public void setPixelRecycleListener(onRecyclerViewItemClickListener listener){
+ mPixelAdapter.setOnItemClickListener(listener);
+ }
+
+ @SuppressWarnings("ResourceType")
+ public int makeDropDownMeasureSpec(int measureSpec) {
+ int mode;
+ if (measureSpec == ViewGroup.LayoutParams.WRAP_CONTENT) {
+ mode = View.MeasureSpec.UNSPECIFIED;
+ } else {
+ mode = View.MeasureSpec.EXACTLY;
+ }
+ return View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.getSize(measureSpec), mode);
+ }
+
+ public interface onRecyclerViewItemClickListener{
+ void onItemClick(RecyclerView parent, View view, int position, String name, int imageSize, int streamType);
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/view/LcProgressBar.java b/app/src/main/java/com/lechange/demo/view/LcProgressBar.java
new file mode 100644
index 0000000..bcc5542
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/view/LcProgressBar.java
@@ -0,0 +1,68 @@
+package com.lechange.demo.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.widget.ProgressBar;
+
+import com.yonsz.z1.R;
+
+
+public class LcProgressBar extends ProgressBar {
+
+ private final Paint progressPaint = new Paint();
+ private Context context;
+ private String content = getResources().getString(R.string.lc_demo_device_update);
+ private int textColor = getResources().getColor(R.color.lc_demo_color_0B8C0D);
+
+ public LcProgressBar(Context context) {
+ this(context, null);
+ }
+
+ public LcProgressBar(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public LcProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ this.context = context;
+ init();
+ }
+
+ private void init() {
+ progressPaint.setStrokeWidth(4);
+ progressPaint.setStyle(Paint.Style.FILL);
+ progressPaint.setColor(textColor);
+ progressPaint.setTextSize(dip2Px(context.getResources().getDimensionPixelSize(R.dimen.x12)));
+ progressPaint.setTextAlign(Paint.Align.CENTER);
+ progressPaint.setAntiAlias(true);
+ }
+
+ private int dip2Px(int dip) {
+ float density = context.getResources().getDisplayMetrics().density;
+ int px = (int) (dip * density + 0.5f);
+ return px;
+ }
+
+ @Override
+ protected synchronized void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ Rect rect = new Rect();
+ progressPaint.getTextBounds(this.content, 0, this.content.length(), rect);
+ int x = (getWidth() / 2) ;
+ int y = (getHeight() / 2) - rect.centerY();
+ canvas.drawText(this.content, x, y, this.progressPaint);
+ }
+
+ public void setText(String text) {
+ this.content = text;
+ postInvalidate();
+ }
+ public void setTextColor(int color) {
+ this.textColor = color;
+ progressPaint.setColor(textColor);
+ postInvalidate();
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/view/LcPullToRefreshRecyclerView.java b/app/src/main/java/com/lechange/demo/view/LcPullToRefreshRecyclerView.java
new file mode 100644
index 0000000..ae71ac2
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/view/LcPullToRefreshRecyclerView.java
@@ -0,0 +1,87 @@
+package com.lechange.demo.view;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.lechange.pulltorefreshlistview.Mode;
+import com.lechange.pulltorefreshlistview.Orientation;
+import com.lechange.pulltorefreshlistview.PullToRefreshBase;
+
+public class LcPullToRefreshRecyclerView extends PullToRefreshBase {
+ public LcPullToRefreshRecyclerView(Context context) {
+ super(context);
+ }
+
+ public LcPullToRefreshRecyclerView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public LcPullToRefreshRecyclerView(Context context, Mode mode) {
+ super(context, mode);
+ }
+
+ @Override
+ public Orientation getPullToRefreshScrollDirection() {
+ return Orientation.VERTICAL;
+ }
+
+ @Override
+ protected RecyclerView createRefreshableView(Context context, AttributeSet attrs) {
+ RecyclerView recyclerView = new RecyclerView(context);
+ return recyclerView;
+ }
+
+
+ @Override
+ protected boolean isReadyForPullStart() {
+ return isFirstItemVisible();
+ }
+
+ public boolean isFirstItemVisible() {
+ final RecyclerView.Adapter> adapter = getRefreshableView().getAdapter();
+
+ //如果未设置Adapter或者Adpter没有数据可以下拉刷新
+ if(null == adapter || adapter.getItemCount() == 0){
+ return true;
+ }else{
+ if(getFristVisiblePosition() == 0){
+ return mRefreshableView.getChildAt(0).getTop() >= mRefreshableView.getTop();
+ }
+ }
+
+ return false;
+ }
+
+ public int getFristVisiblePosition() {
+ View firstVisibleChild = mRefreshableView.getChildAt(0);
+ return firstVisibleChild != null ? mRefreshableView.getChildPosition(firstVisibleChild) : -1;
+ }
+
+ @Override
+ protected boolean isReadyForPullEnd() {
+ return isLastItemVisible();
+ }
+
+ public boolean isLastItemVisible() {
+ final RecyclerView.Adapter> adapter = getRefreshableView().getAdapter();
+
+ //如果未设置Adapter或者Adpter没有数据可以下拉刷新
+ if(null == adapter || adapter.getItemCount() == 0){
+ return true;
+ }else{
+ if(getLastVisiblePosition() == adapter.getItemCount() - 1){
+ return mRefreshableView.getChildAt(mRefreshableView.getChildCount() - 1).getBottom() <= mRefreshableView.getBottom();
+ }
+ }
+
+ return false;
+ }
+
+ public int getLastVisiblePosition() {
+ View lastVisibleChild = mRefreshableView.getChildAt(mRefreshableView.getChildCount() - 1);
+ return lastVisibleChild != null ? mRefreshableView.getChildPosition(lastVisibleChild) : -1;
+ }
+
+}
diff --git a/app/src/main/java/com/lechange/demo/view/RecoderSeekBar.java b/app/src/main/java/com/lechange/demo/view/RecoderSeekBar.java
new file mode 100644
index 0000000..a398043
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/view/RecoderSeekBar.java
@@ -0,0 +1,34 @@
+package com.lechange.demo.view;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+public class RecoderSeekBar extends android.support.v7.widget.AppCompatSeekBar {
+
+ private boolean canTouchAble = true;
+
+ public RecoderSeekBar(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public RecoderSeekBar(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public RecoderSeekBar(Context context) {
+ super(context);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!canTouchAble) {
+ return true;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ public void setCanTouchAble(boolean canTouchAble) {
+ this.canTouchAble = canTouchAble;
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/view/SpacesItemDecoration.java b/app/src/main/java/com/lechange/demo/view/SpacesItemDecoration.java
new file mode 100644
index 0000000..9512d00
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/view/SpacesItemDecoration.java
@@ -0,0 +1,23 @@
+package com.lechange.demo.view;
+
+import android.graphics.Rect;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
+ private int space;
+
+ public SpacesItemDecoration(int space) {
+ this.space = space;
+ }
+
+ @Override
+ public void getItemOffsets(Rect outRect, View view,
+ RecyclerView parent, RecyclerView.State state) {
+
+ // Add top margin only for the first item to avoid double space between items
+ if (parent.getChildPosition(view) != 0){
+ outRect.left = space;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/yonsz/AddCompleteAndRenameActivity.java b/app/src/main/java/com/lechange/demo/yonsz/AddCompleteAndRenameActivity.java
new file mode 100644
index 0000000..ef687b2
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/yonsz/AddCompleteAndRenameActivity.java
@@ -0,0 +1,345 @@
+package com.lechange.demo.yonsz;
+
+import android.os.Bundle;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSON;
+import com.yonsz.z1.R;
+import com.yonsz.z1.activity.BaseActivity;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.net.NetWorkUrl;
+import com.yonsz.z1.net.NetWorkUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.utils.ToastUtil;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import static com.yonsz.z1.net.Constans.UPDATE_BLINDENTITY_NAME_FAIL;
+import static com.yonsz.z1.net.Constans.UPDATE_BLINDENTITY_NAME_SUCCESS;
+
+/**
+ * Created by Administrator on 2019/2/27.
+ */
+
+
+public class AddCompleteAndRenameActivity extends BaseActivity implements CompoundButton.OnCheckedChangeListener {
+ private TitleView mTitleView;
+ private Button nextConfig;
+
+ private CheckBox[] timeCheckBox = new CheckBox[14];
+ private List positionIds = new ArrayList<>();
+ private CompoundButton lastTimeCheckBox;
+ private String deviceAddress = "1";
+ private List condition = new ArrayList<>();
+ private String addressId;
+ private TextView deviceName;
+ private ImageView cleanIv;
+
+ public void onEventMainThread(EventBusEntity event) {
+ String msg = event.getMsg();
+ Log.e("nettyUtil", msg);
+ finish();
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_modify_camera_name);
+ initView();
+ initListener();
+ }
+
+ private void initView() {
+ addressId = deviceAddress;
+ cleanIv = (ImageView) findViewById(R.id.iv_clean);
+ cleanIv.setOnClickListener(this);
+ deviceName = (TextView) findViewById(R.id.edit_device_name);
+ nextConfig = (Button) findViewById(R.id.bt_sure_config);
+ nextConfig.setOnClickListener(this);
+ mTitleView = (TitleView) findViewById(R.id.title_switcher_two);
+ mTitleView.setHead(R.string.add_device);
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ finish();
+ }
+
+ @Override
+ public void onFunction() {
+
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+
+ positionIds.add(R.id.cb_position0);
+ positionIds.add(R.id.cb_position1);
+ positionIds.add(R.id.cb_position2);
+ positionIds.add(R.id.cb_position3);
+ positionIds.add(R.id.cb_position4);
+ positionIds.add(R.id.cb_position5);
+ positionIds.add(R.id.cb_position6);
+ positionIds.add(R.id.cb_position7);
+ positionIds.add(R.id.cb_position8);
+ positionIds.add(R.id.cb_position9);
+ positionIds.add(R.id.cb_position10);
+ positionIds.add(R.id.cb_position11);
+ positionIds.add(R.id.cb_position12);
+ positionIds.add(R.id.cb_position13);
+ for (int i = 0; i < positionIds.size(); i++) {
+ timeCheckBox[i] = (CheckBox) findViewById(positionIds.get(i));
+ timeCheckBox[i].setOnCheckedChangeListener(this);
+ }
+
+ switch (deviceAddress) {
+ case "0":
+ timeCheckBox[13].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position13);
+ condition.add("13");
+ break;
+ case "1":
+ timeCheckBox[0].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position0);
+ condition.add("0");
+ break;
+ case "2":
+ timeCheckBox[1].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position1);
+ condition.add("1");
+ break;
+ case "3":
+ timeCheckBox[2].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position2);
+ condition.add("2");
+ break;
+ case "4":
+ timeCheckBox[3].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position3);
+ condition.add("3");
+ break;
+ case "5":
+ timeCheckBox[4].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position4);
+ condition.add("4");
+ break;
+ case "6":
+ timeCheckBox[5].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position5);
+ condition.add("5");
+ break;
+ case "7":
+ timeCheckBox[6].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position6);
+ condition.add("6");
+ break;
+ case "8":
+ timeCheckBox[7].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position7);
+ condition.add("7");
+ break;
+ case "9":
+ timeCheckBox[8].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position8);
+ condition.add("8");
+ break;
+ case "10":
+ timeCheckBox[9].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position9);
+ condition.add("9");
+ break;
+ case "11":
+ timeCheckBox[10].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position10);
+ condition.add("10");
+ break;
+ case "12":
+ timeCheckBox[11].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position11);
+ condition.add("11");
+ break;
+ case "13":
+ timeCheckBox[12].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position12);
+ condition.add("12");
+ break;
+ }
+
+ // deviceName.setText(AddressNameUtil.getAddressName(localAddAddressId) + "摄像头");
+ deviceName.setText("摄像头");
+ }
+
+ private void modifyDevice(String addressId) {
+ NetWorkUtil util = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ /*if (addressId.equals("13")) {
+ map.put("addressId", "0");
+ } else {
+ map.put("addressId", String.valueOf(Integer.valueOf(addressId) + 1));
+ }*/
+ // map.put("addressId", localAddAddressId);
+ map.put("deviceId", getIntent().getExtras().get("deviceSN").toString());
+ map.put("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ map.put("deviceName", deviceName.getText().toString().trim());
+ util.requestPostByAsynewApi(NetWorkUrl.MODIFY_DEVICE, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("updateBlindEntityName", "ShareDeviceActivity onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ Message msg = mHandler.obtainMessage(UPDATE_BLINDENTITY_NAME_SUCCESS);
+ msg.obj = obj;
+ mHandler.sendMessage(msg);
+ } else {
+ Message msg = mHandler.obtainMessage(UPDATE_BLINDENTITY_NAME_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ Message msg = mHandler.obtainMessage(UPDATE_BLINDENTITY_NAME_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ }
+
+ private void initListener() {
+
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.bt_sure_config:
+ modifyDevice(addressId);
+ break;
+ case R.id.iv_clean:
+ deviceName.setText("");
+ break;
+ }
+ }
+
+ @Override
+ public void callBackUiThread(Message msg) {
+ switch (msg.what) {
+ case UPDATE_BLINDENTITY_NAME_SUCCESS:
+ Toast.makeText(AddCompleteAndRenameActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ finish();
+ }
+ }, 2000);
+ break;
+ case UPDATE_BLINDENTITY_NAME_FAIL:
+ ToastUtil.show(this, (String) msg.obj);
+ break;
+ }
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ int id = buttonView.getId();
+ //如果是时间筛选
+ if (positionIds.contains(id)) {
+ if (isChecked) {
+ if (lastTimeCheckBox != null) {
+ lastTimeCheckBox.setChecked(false);
+ }
+ lastTimeCheckBox = buttonView;
+ } else {
+ boolean isForceCheck = true;
+ for (int i = 0; i < timeCheckBox.length; i++) {
+ if (timeCheckBox[i].isChecked()) {
+ isForceCheck = false;
+ }
+ }
+ if (isForceCheck) {
+ buttonView.setChecked(true);
+ }
+ }
+ }
+ switch (id) {
+ case R.id.cb_position0:
+ if (isChecked)
+ addressId = "0";
+ break;
+ case R.id.cb_position1:
+ if (isChecked)
+ addressId = "1";
+ break;
+ case R.id.cb_position2:
+ if (isChecked)
+ addressId = "2";
+ break;
+ case R.id.cb_position3:
+ if (isChecked)
+ addressId = "3";
+ break;
+ case R.id.cb_position4:
+ if (isChecked)
+ addressId = "4";
+ break;
+ case R.id.cb_position5:
+ if (isChecked)
+ addressId = "5";
+ break;
+ case R.id.cb_position6:
+ if (isChecked)
+ addressId = "6";
+ break;
+ case R.id.cb_position7:
+ if (isChecked)
+ addressId = "7";
+ break;
+ case R.id.cb_position8:
+ if (isChecked)
+ addressId = "8";
+ break;
+ case R.id.cb_position9:
+ if (isChecked)
+ addressId = "9";
+ break;
+ case R.id.cb_position10:
+ if (isChecked)
+ addressId = "10";
+ break;
+ case R.id.cb_position11:
+ if (isChecked)
+ addressId = "11";
+ break;
+ case R.id.cb_position12:
+ if (isChecked)
+ addressId = "12";
+ break;
+ case R.id.cb_position13:
+ if (isChecked)
+ addressId = "13";
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/yonsz/CameraDetailActivity.java b/app/src/main/java/com/lechange/demo/yonsz/CameraDetailActivity.java
new file mode 100644
index 0000000..753c783
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/yonsz/CameraDetailActivity.java
@@ -0,0 +1,603 @@
+package com.lechange.demo.yonsz;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSON;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.entity.ChannelInfo;
+import com.yonsz.z1.R;
+import com.yonsz.z1.activity.BaseActivity;
+import com.yonsz.z1.createfamily.floor.ChooseRoomInFloorActivity;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.mine.aboutversion.customview.ConfirmDialog;
+import com.yonsz.z1.mine.aboutversion.feature.Callback;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.net.NetWorkUtil;
+import com.yonsz.z1.utils.AddressNameUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.utils.ToastUtil;
+import com.yonsz.z1.version5.ModifyRoomActivity;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.HashMap;
+
+import de.greenrobot.event.EventBus;
+
+import static com.yonsz.z1.net.Constans.CAMERA_TAG;
+import static com.yonsz.z1.net.Constans.CHECK_USER_BIND_FAIL;
+import static com.yonsz.z1.net.Constans.FIND_DEVICES_FAIL;
+import static com.yonsz.z1.net.Constans.FIND_DEVICES_SUCCESS;
+import static com.yonsz.z1.net.Constans.GET_SWITCHER_CHANGE_INFO;
+import static com.yonsz.z1.net.Constans.MODIFY_ALARM_STATUS_SUCCESS;
+import static com.yonsz.z1.net.Constans.MODIFY_DEVICE_NAME;
+import static com.yonsz.z1.net.Constans.deviceNumListPosition;
+import static com.yonsz.z1.net.Constans.homeListEntity;
+import static com.yonsz.z1.net.NetWorkUrl.DEVICE_LIST;
+import static com.yonsz.z1.net.NetWorkUrl.MODIFY_ALARM_STATUS;
+import static com.yonsz.z1.net.NetWorkUrl.UNBIND_DEVICE;
+import static com.yonsz.z1.version5.MainFragment5.isRefreshCamera;
+
+/**
+ * Created by Administrator on 2019/2/27.
+ */
+
+public class CameraDetailActivity extends BaseActivity {
+ private TitleView mTitleView;
+ private TextView deleteDevice;
+ private RelativeLayout rl_device_storage, rl_alarm;
+ private String mChannelUUID = null;
+ private CheckBox cb_camera_reverse, cb_device_light, cb_device_check, cb_device_alarm;
+ private TextView tv_wifi_name, tv_device_name, tv_device_version;
+ private ImageView iv_last_pic;
+ private LinearLayout ll_device_detail_top;
+ private ChannelInfo channel;
+ private TextView tv_device_address;
+ private String devicePosition = "1";
+ private String deviceCode;
+
+ public void onEventMainThread(ChooseHomeEvent event) {
+ String msg = event.getMsg();
+ Log.e("nettyUtil", msg);
+ if (msg.equals("1") || msg.equals("3") || msg.equals("2") || msg.equals("5")) {
+
+ } else {
+ tv_device_name.setText(msg);
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_camera_detail);
+ initView();
+ initListener();
+ }
+
+ private void initView() {
+ mChannelUUID = getIntent().getStringExtra("UUID"); // 获取通道的UUID
+ ll_device_detail_top = (LinearLayout) findViewById(R.id.ll_device_detail_top);
+ tv_device_name = (TextView) findViewById(R.id.tv_device_name);
+ tv_device_version = (TextView) findViewById(R.id.tv_device_version);
+ iv_last_pic = (ImageView) findViewById(R.id.iv_last_pic);
+ tv_wifi_name = (TextView) findViewById(R.id.tv_wifi_name);
+ cb_camera_reverse = (CheckBox) findViewById(R.id.cb_camera_reverse);
+ cb_device_light = (CheckBox) findViewById(R.id.cb_device_light);
+ cb_device_check = (CheckBox) findViewById(R.id.cb_device_check);
+ cb_device_alarm = (CheckBox) findViewById(R.id.cb_device_alarm);
+ rl_device_storage = (RelativeLayout) findViewById(R.id.rl_device_storage);
+ rl_alarm = (RelativeLayout) findViewById(R.id.rl_alarm);
+ deleteDevice = (TextView) findViewById(R.id.tv_delete_device);
+ tv_device_address = (TextView) findViewById(R.id.tv_device_address);
+ mTitleView = (TitleView) findViewById(R.id.title_device_detail);
+ mTitleView.setHead("设备详情");
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ finish();
+ }
+
+ @Override
+ public void onFunction() {
+
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+ //获取设备基本信息
+ channel = Business.getInstance().getChannel(mChannelUUID);
+ // String deviceName = channel.getDeviceName();
+ // final String backgroudImgURL = channel.getBackgroudImgURL();
+ deviceCode = channel.getDeviceCode();
+ if (channel.getDeviceName().contains("的")) {
+ devicePosition = channel.getDeviceName().substring(0, channel.getDeviceName().indexOf("的"));
+ tv_device_address.setText(devicePosition);
+ }
+ tv_device_name.setText(channel.getName());
+ tv_device_version.setText(channel.getDeviceModel());
+ /*if (backgroudImgURL != null && backgroudImgURL.length() > 0) {
+ //下载 注:由于有些请求的图片是经过加密处理的,所以需要使用带有解密功能的接口,默认密码为设备序列号
+ ImageHelper.loadCacheImage(backgroudImgURL, deviceCode, deviceCode, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ // TODO Auto-generated method stub
+ super.handleMessage(msg);
+ if (backgroudImgURL.hashCode() == msg.what && msg.obj != null) {
+ // mBgDevice.setBackgroundDrawable((Drawable) msg.obj);
+ iv_last_pic.setImageDrawable((Drawable) msg.obj);
+ }
+ }
+ });
+ }*/
+ /*new AsyncTask() {
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+ }
+
+ @Override
+ protected Object doInBackground(Object[] objects) {
+ //获取当前网络
+ currentDeviceWifi();
+ //获取设备指示灯状态
+ breathingLightStatus();
+ //获取摄像头翻转状态
+ frameReverseStatus();
+ return null;
+ }
+
+ @Override
+ protected void onProgressUpdate(Object[] values) {
+ super.onProgressUpdate(values);
+ }
+
+ @Override
+ protected void onPostExecute(Object o) {
+ super.onPostExecute(o);
+ }
+ }.execute();*/
+ //获取当前网络
+ getLcDeviceList();
+ }
+
+ private void initListener() {
+ rl_device_storage.setOnClickListener(this);
+ cb_camera_reverse.setOnClickListener(this);
+ cb_device_light.setOnClickListener(this);
+ cb_device_check.setOnClickListener(this);
+ cb_device_alarm.setOnClickListener(this);
+ deleteDevice.setOnClickListener(this);
+ ll_device_detail_top.setOnClickListener(this);
+ tv_device_address.setOnClickListener(this);
+
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.rl_device_storage:
+ Intent intent = new Intent(CameraDetailActivity.this, RecoverSDCardActivity.class);
+ intent.putExtra("UUID", mChannelUUID);
+ startActivity(intent);
+ break;
+ case R.id.cb_camera_reverse:
+ if (cb_camera_reverse.isChecked()) {
+ modifyFrameReverseStatus("reverse");
+ } else {
+ modifyFrameReverseStatus("normal");
+ }
+ break;
+ case R.id.cb_device_light:
+ if (cb_device_light.isChecked()) {
+ modifyBreathingLight("on");
+ } else {
+ modifyBreathingLight("off");
+ }
+ break;
+ case R.id.cb_device_check:
+ if (cb_device_check.isChecked()) {
+ modifyAlarmPlan(true);
+ } else {
+ modifyAlarmPlan(false);
+ }
+ break;
+ case R.id.cb_device_alarm:
+ if (cb_device_alarm.isChecked()) {
+ modifyAlarmStatus("1");
+ } else {
+ modifyAlarmStatus("0");
+ }
+ break;
+ case R.id.tv_delete_device:
+ ConfirmDialog dialog = new ConfirmDialog(this, new Callback() {
+ @Override
+ public void callback(int position) {
+ switch (position) {
+ case 0:
+ break;
+ case 1:
+ unBindDevice();
+ break;
+ }
+ }
+ });
+ dialog.setContent("是否删除摄像头?");
+ dialog.setCancleBtn(R.string.cancel);
+ dialog.setSureBtn(R.string.sure);
+ dialog.setCancelable(false);
+ dialog.show();
+ break;
+ case R.id.ll_device_detail_top:
+ Intent intent1 = new Intent(CameraDetailActivity.this, CameraNameDetailActivity.class);
+ intent1.putExtra("UUID", mChannelUUID);
+ startActivity(intent1);
+ break;
+ case R.id.tv_device_address:
+ Intent intent2;
+
+ if (null != homeListEntity && !TextUtils.isEmpty(homeListEntity.getData().get(deviceNumListPosition).getFloorList())) {
+ intent2 = new Intent(this, ChooseRoomInFloorActivity.class);
+ intent2.putExtra("floorList", homeListEntity.getData().get(deviceNumListPosition).getFloorList());
+ intent2.putExtra("houseTypeName", "房间选择");
+ intent2.putExtra("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+
+ intent2.putExtra("deviceId", channel.getDeviceCode());
+ intent2.putExtra("ziId", "");
+ intent2.putExtra("deviceType", "102");
+ intent2.putExtra("deviceModel", "0");
+ intent2.putExtra("addressId", AddressNameUtil.getAddressId(devicePosition));
+ intent2.putExtra("deviceAddress", AddressNameUtil.getAddressId(devicePosition));
+ startActivityForResult(intent2, MODIFY_DEVICE_NAME);
+ } else {
+ /*intent = new Intent(getActivity(), ModifyRoomActivity.class);
+ intent.putExtra("ziId", ziId);
+ intent.putExtra("deviceType", "000");
+ intent.putExtra("deviceModel", "0");
+ intent.putExtra("addressId", AddressNameUtil.getAddressId(devicePositionTv.getText().toString()));
+ intent.putExtra("deviceId", ziId);
+ startActivityForResult(intent, MODIFY_DEVICE_NAME);*/
+
+ intent2 = new Intent(CameraDetailActivity.this, ModifyRoomActivity.class);
+ intent2.putExtra("deviceAddress", AddressNameUtil.getAddressId(devicePosition));
+ intent2.putExtra("deviceId", channel.getDeviceCode());
+
+ intent2.putExtra("ziId", "");
+ intent2.putExtra("deviceType", CAMERA_TAG);
+ intent2.putExtra("deviceModel", "0");
+ intent2.putExtra("addressId", AddressNameUtil.getAddressId(devicePosition));
+ startActivityForResult(intent2, GET_SWITCHER_CHANGE_INFO);
+ }
+
+ break;
+ }
+ }
+
+ private void modifyAlarmStatus(String state) {
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ // map.put("deviceId", "4K0586CPAJ58121");
+ map.put("deviceId", channel.getDeviceCode());
+ map.put("alarmStatus", state);
+ netWorkUtil.requestPostByAsynewApi(MODIFY_ALARM_STATUS, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("modifyAlarmStatus", "onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ Message msg = mHandler.obtainMessage(MODIFY_ALARM_STATUS_SUCCESS);
+ msg.obj = obj;
+ mHandler.sendMessage(msg);
+ } else {
+ Message msg = mHandler.obtainMessage(CHECK_USER_BIND_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ android.os.Message msg = mHandler.obtainMessage(CHECK_USER_BIND_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ private void unBindDevice() {
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ // map.put("deviceId", "4K0586CPAJ58121");
+ map.put("deviceId", channel.getDeviceCode());
+ netWorkUtil.requestPostByAsynewApi(UNBIND_DEVICE, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+
+ /*mChannelInfoList.remove(mChannelInfoList.get(lechengPosition));
+ mHorizontalAdapter.notifyDataSetChanged();*/
+ // getLcDeviceList();
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ isRefreshCamera = true;
+ Log.i("unBindDevice", "onSuccess()" + respone);
+ EventBus.getDefault().post(
+ new EventBusEntity("关闭"));
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("2"));
+ finish();
+ } else {
+ Message msg = mHandler.obtainMessage(CHECK_USER_BIND_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ android.os.Message msg = mHandler.obtainMessage(CHECK_USER_BIND_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ private void currentDeviceWifi() {
+ Business.getInstance().currentDeviceWifi(mChannelUUID, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ final String obj = (String) msg.obj;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ tv_wifi_name.setText(obj);
+ //获取设备指示灯状态
+ breathingLightStatus();
+ }
+ });
+ } else {
+ /*Toast.makeText(
+ CameraDetailActivity.this,
+ R.string.toast_storagestrategy_update_failed,
+ Toast.LENGTH_SHORT).show();*/
+
+ }
+ }
+ });
+ }
+
+ private void breathingLightStatus() {
+ Business.getInstance().breathingLightStatus(mChannelUUID, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ final int arg1 = msg.arg1;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (arg1 == 1) {
+ cb_device_light.setChecked(true);
+ } else {
+ cb_device_light.setChecked(false);
+ }
+ //获取摄像头翻转状态
+ frameReverseStatus();
+ }
+ });
+
+ } else {
+ /*Toast.makeText(
+ CameraDetailActivity.this,
+ R.string.toast_storagestrategy_update_failed,
+ Toast.LENGTH_SHORT).show();*/
+
+ }
+ }
+ });
+ }
+
+ /**
+ * 修改动检计划状态
+ *
+ * @param enable 动检计划开启与否
+ */
+ private void modifyAlarmPlan(final boolean enable) {
+ Business.getInstance().modifyAlarmStatus(enable, mChannelUUID,
+ new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(CameraDetailActivity.this,
+ R.string.toast_alarmplan_modifyalarmstatus_success,
+ Toast.LENGTH_LONG).show();
+ if (enable) {
+ rl_alarm.setVisibility(View.VISIBLE);
+ } else {
+ rl_alarm.setVisibility(View.GONE);
+ }
+ } else {
+ Toast.makeText(CameraDetailActivity.this,
+ R.string.toast_alarmplan_modifyalarmstatus_failed,
+ Toast.LENGTH_LONG).show();
+ }
+ }
+
+ });
+ }
+
+
+ private void modifyBreathingLight(String state) {
+ Business.getInstance().modifyBreathingLight(state, mChannelUUID, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(
+ CameraDetailActivity.this,
+ "修改成功",
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(
+ CameraDetailActivity.this,
+ "修改失败",
+ Toast.LENGTH_SHORT).show();
+
+ }
+ }
+ });
+ }
+
+ private void frameReverseStatus() {
+ Business.getInstance().frameReverseStatus(mChannelUUID, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ final int obj = msg.arg1;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (obj == 1) {
+ cb_camera_reverse.setChecked(true);
+ } else {
+ cb_camera_reverse.setChecked(false);
+ }
+ getAlarmStatus();
+ }
+ });
+ } else {
+
+ }
+ }
+ });
+ }
+
+ private void getAlarmStatus() {
+ Business.getInstance().getAlarmStatus(mChannelUUID, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ final int obj = msg.arg1;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (obj == 1) {
+ cb_device_check.setChecked(true);
+ rl_alarm.setVisibility(View.VISIBLE);
+ } else {
+ cb_device_check.setChecked(false);
+ rl_alarm.setVisibility(View.GONE);
+ }
+ }
+ });
+ } else {
+
+ }
+ }
+ });
+ }
+
+ private void modifyFrameReverseStatus(String state) {
+ Business.getInstance().modifyFrameReverseStatus(state, mChannelUUID, new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (0 == msg.what) {
+ Toast.makeText(
+ CameraDetailActivity.this,
+ "修改成功",
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(
+ CameraDetailActivity.this,
+ "修改失败",
+ Toast.LENGTH_SHORT).show();
+
+ }
+ }
+ });
+ }
+
+ @Override
+ public void callBackUiThread(Message msg) {
+ switch (msg.what) {
+ case FIND_DEVICES_SUCCESS:
+ LcListEntity obj = (LcListEntity) msg.obj;
+ for (int i = 0; i < obj.getData().size(); i++) {
+ if (deviceCode.equals(obj.getData().get(i).getDeviceId())) {
+ tv_device_version.setText(obj.getData().get(i).getVersion());
+ if (obj.getData().get(i).getAlarmStatus().equals("1")) {
+ cb_device_alarm.setChecked(true);
+ } else {
+ cb_device_alarm.setChecked(false);
+ }
+ }
+ }
+ currentDeviceWifi();
+ break;
+ case CHECK_USER_BIND_FAIL:
+ ToastUtil.show(this, (String) msg.obj);
+ break;
+ case MODIFY_ALARM_STATUS_SUCCESS:
+ ToastUtil.show(this, "修改报警消息提醒成功");
+ break;
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case GET_SWITCHER_CHANGE_INFO:
+ case MODIFY_DEVICE_NAME:
+ if (data != null && data.getExtras().get("addressId") != null) {
+ String addressId = data.getExtras().get("addressId").toString();
+ tv_device_address.setText(AddressNameUtil.getAddressName(addressId));
+ // addressId = data.getExtras().get("addressId").toString();
+ }
+ break;
+ }
+ }
+
+ private synchronized void getLcDeviceList() {
+ NetWorkUtil netWorkUtil = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ netWorkUtil.requestPostByAsynewApi(DEVICE_LIST, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("findDevices", "onSuccess()" + respone);
+ LcListEntity obj = JSON.parseObject(respone, LcListEntity.class);
+ if (1 == obj.getFlag()) {
+ android.os.Message msg = mHandler.obtainMessage(FIND_DEVICES_SUCCESS);
+ msg.obj = obj;
+ mHandler.sendMessage(msg);
+ } else {
+ android.os.Message msg = mHandler.obtainMessage(FIND_DEVICES_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ android.os.Message msg = mHandler.obtainMessage(FIND_DEVICES_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/yonsz/CameraNameDetailActivity.java b/app/src/main/java/com/lechange/demo/yonsz/CameraNameDetailActivity.java
new file mode 100644
index 0000000..2f40ee2
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/yonsz/CameraNameDetailActivity.java
@@ -0,0 +1,171 @@
+package com.lechange.demo.yonsz;
+
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSON;
+import com.lechange.demo.business.Business;
+import com.lechange.demo.business.entity.ChannelInfo;
+import com.yonsz.z1.R;
+import com.yonsz.z1.activity.BaseActivity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.database.entity.entity4.ChooseHomeEvent;
+import com.yonsz.z1.listener.NoDoubleClickListener;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.mine.aboutversion.customview.RenameNameDialog;
+import com.yonsz.z1.mine.aboutversion.feature.Callback1;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.net.NetWorkUrl;
+import com.yonsz.z1.net.NetWorkUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.HashMap;
+
+import de.greenrobot.event.EventBus;
+
+import static com.yonsz.z1.UniKongApp.getActivity;
+import static com.yonsz.z1.net.Constans.UPDATE_BLINDENTITY_NAME_FAIL;
+import static com.yonsz.z1.net.Constans.UPDATE_BLINDENTITY_NAME_SUCCESS;
+import static com.yonsz.z1.net.Constans.deviceNumListPosition;
+import static com.yonsz.z1.net.Constans.homeListEntity;
+
+/**
+ * Created by Administrator on 2019/3/12.
+ */
+
+public class CameraNameDetailActivity extends BaseActivity {
+ private TitleView mTitleView;
+ private String mChannelUUID;
+ private ChannelInfo channel;
+ private TextView tv_device_name, tv_device_type, tv_device_code, tv_device_code_copy;
+ private ImageView ImageView01_name_edit;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_camera_name);
+ initView();
+ }
+
+ private void initView() {
+ mChannelUUID = getIntent().getStringExtra("UUID"); // 获取通道的UUID
+ channel = Business.getInstance().getChannel(mChannelUUID);
+ mTitleView = (TitleView) findViewById(R.id.title_camera_name);
+ mTitleView.setHead("设备详情");
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ finish();
+ }
+
+ @Override
+ public void onFunction() {
+
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+ tv_device_name = (TextView) findViewById(R.id.tv_device_name);
+ tv_device_type = (TextView) findViewById(R.id.tv_device_type);
+ tv_device_code = (TextView) findViewById(R.id.tv_device_code);
+ tv_device_code_copy = (TextView) findViewById(R.id.tv_device_code_copy);
+ ImageView01_name_edit = (ImageView) findViewById(R.id.ImageView01_name_edit);
+ tv_device_name.setText(channel.getName());
+ tv_device_type.setText(channel.getDeviceModel());
+ tv_device_code.setText(channel.getDeviceCode());
+ tv_device_code_copy.setOnClickListener(new NoDoubleClickListener() {
+ @Override
+ protected void onNoDoubleClick(View v) {
+ ClipboardManager cmb = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
+ cmb.setText(tv_device_code.getText()); //将内容放入粘贴管理器,在别的地方长按选择"粘贴"即可
+ cmb.getText();//获取粘贴信息
+ Toast.makeText(CameraNameDetailActivity.this, "复制成功!", Toast.LENGTH_SHORT).show();
+ }
+ });
+ ImageView01_name_edit.setOnClickListener(new NoDoubleClickListener() {
+ @Override
+ protected void onNoDoubleClick(View v) {
+ RenameNameDialog dialog = new RenameNameDialog(CameraNameDetailActivity.this, new Callback1() {
+ @Override
+ public void callback(int position, String positioName) {
+ switch (position) {
+ case 0:
+ break;
+ case 1:
+ if (TextUtils.isEmpty(positioName.trim())) {
+ return;
+ }
+ modifyDevice(positioName);
+ break;
+ }
+ }
+ });
+ dialog.setOldName(channel.getName());
+ dialog.setContent("修改摄像机名称");
+ dialog.setCancleBtn(R.string.cancel);
+ dialog.setSureBtn(R.string.save);
+ dialog.setCancelable(false);
+ dialog.show();
+ }
+ });
+
+ }
+
+ private void modifyDevice(final String deviceName) {
+ NetWorkUtil util = NetWorkUtil.instans();
+ HashMap map = new HashMap<>();
+ map.put("deviceId", channel.getDeviceCode());
+ map.put("houseId", SharedpreferencesUtil.get(Constans.HOUSEID, ""));
+ map.put("deviceName", deviceName);
+ util.requestPostByAsynewApi(NetWorkUrl.MODIFY_DEVICE, map, new NetWorkUtil.ReqCallBack() {
+ @Override
+ public void onSuccess(String respone) {
+ Log.i("updateBlindEntityName", "ShareDeviceActivity onSuccess()" + respone);
+ SimpleEntty obj = JSON.parseObject(respone, SimpleEntty.class);
+ if (1 == obj.getFlag()) {
+ Message msg = mHandler.obtainMessage(UPDATE_BLINDENTITY_NAME_SUCCESS);
+ msg.obj = deviceName;
+ mHandler.sendMessage(msg);
+ } else {
+ Message msg = mHandler.obtainMessage(UPDATE_BLINDENTITY_NAME_FAIL);
+ msg.obj = obj.getMsg();
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onFail(String message) {
+ Message msg = mHandler.obtainMessage(UPDATE_BLINDENTITY_NAME_FAIL);
+ msg.obj = message;
+ mHandler.sendMessage(msg);
+ }
+ });
+ }
+
+ @Override
+ public void callBackUiThread(Message msg) {
+ switch (msg.what) {
+ case UPDATE_BLINDENTITY_NAME_SUCCESS:
+ String obj = (String) msg.obj;
+ tv_device_name.setText(obj);
+ channel.setDeviceName(obj);
+ EventBus.getDefault().post(
+ new ChooseHomeEvent(obj));
+ EventBus.getDefault().post(
+ new ChooseHomeEvent("2"));
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/yonsz/CustomSnapHelper.java b/app/src/main/java/com/lechange/demo/yonsz/CustomSnapHelper.java
new file mode 100644
index 0000000..511bedf
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/yonsz/CustomSnapHelper.java
@@ -0,0 +1,87 @@
+package com.lechange.demo.yonsz;
+
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.LinearSnapHelper;
+import android.support.v7.widget.OrientationHelper;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+import com.yonsz.z1.listener.OnRecyclerScrollListener;
+
+/**
+ * Created by loonggg on 2017/2/6.
+ */
+
+public class CustomSnapHelper extends LinearSnapHelper {
+ private OrientationHelper mHorizontalHelper;
+ private OnRecyclerScrollListener mRecyclerScrollListener;
+
+ @Override
+ public int[] calculateDistanceToFinalSnap(RecyclerView.LayoutManager layoutManager, View targetView) {
+ int[] out = new int[2];
+ //判断支持水平滚动,修改水平方向的位置,是修改的out[0]的值
+ if (layoutManager.canScrollHorizontally()) {
+ out[0] = distanceToStart(targetView, getHorizontalHelper(layoutManager));
+ } else {
+ out[0] = 0;
+ }
+ return out;
+ }
+
+ private int distanceToStart(View targetView, OrientationHelper helper) {
+ return helper.getDecoratedStart(targetView) - helper.getStartAfterPadding();
+ }
+
+ @Override
+ public View findSnapView(RecyclerView.LayoutManager layoutManager) {
+ return findStartView(layoutManager, getHorizontalHelper(layoutManager));
+ }
+
+ private View findStartView(RecyclerView.LayoutManager layoutManager,
+ OrientationHelper helper) {
+
+ if (layoutManager instanceof LinearLayoutManager) {
+ int firstChild = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
+ int lastChild = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
+ if (firstChild == RecyclerView.NO_POSITION) {
+ return null;
+ }
+ //这行的作用是如果是最后一个,翻到最后一条,解决显示不全的问题
+ /*if (lastChild == layoutManager.getItemCount() - 1) {
+ return layoutManager.findViewByPosition(lastChild);
+ }*/
+
+ View child = layoutManager.findViewByPosition(firstChild);
+ if (mRecyclerScrollListener != null) {
+ if (helper.getDecoratedEnd(child) >= helper.getDecoratedMeasurement(child) / 2 && helper.getDecoratedEnd(child) > 0) {
+ mRecyclerScrollListener.onScroll(firstChild);
+
+ } else {
+ mRecyclerScrollListener.onScroll(firstChild + 1);
+
+ }
+ }
+ //获取偏左显示的Item
+ if (helper.getDecoratedEnd(child) >= helper.getDecoratedMeasurement(child) / 2
+ && helper.getDecoratedEnd(child) > 0) {
+ return child;
+ } else {
+ return layoutManager.findViewByPosition(firstChild + 1);
+ }
+ }
+
+ return super.findSnapView(layoutManager);
+ }
+
+ public void setmOnItemScrollListener(OnRecyclerScrollListener mRecyclerScrollListener) {
+ this.mRecyclerScrollListener = mRecyclerScrollListener;
+ }
+
+ private OrientationHelper getHorizontalHelper(
+ RecyclerView.LayoutManager layoutManager) {
+ if (mHorizontalHelper == null) {
+ mHorizontalHelper = OrientationHelper.createHorizontalHelper(layoutManager);
+ }
+ return mHorizontalHelper;
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/yonsz/LcDataListEntity.java b/app/src/main/java/com/lechange/demo/yonsz/LcDataListEntity.java
new file mode 100644
index 0000000..a835a8c
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/yonsz/LcDataListEntity.java
@@ -0,0 +1,173 @@
+package com.lechange.demo.yonsz;
+
+import com.common.openapi.entity.DeviceDetailListData;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2019/3/2.
+ */
+
+public class LcDataListEntity {
+
+ /**
+ * data : [{"addressId":"3","deviceId":"4K0586CPAJ58121","deviceModel":"deviceModel","deviceProvider":"lc","deviceType":1,"houseId":"de37c4cef269487ab09af03fd5bbc721","id":1,"thirdDeviceAccountId":2,"userId":"c8971e8ea0654c429c89cb486d259357"}]
+ * flag : 1
+ * msg : success
+ */
+
+ private int flag;
+ private String msg;
+ private List data;
+
+ public int getFlag() {
+ return flag;
+ }
+
+ public void setFlag(int flag) {
+ this.flag = flag;
+ }
+
+ public String getMsg() {
+ return msg == null ? "" : msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public List getData() {
+ if (data == null) {
+ return new ArrayList<>();
+ }
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public static class DataBean {
+ /**
+ * addressId : 3
+ * deviceId : 4K0586CPAJ58121
+ * deviceModel : deviceModel
+ * deviceProvider : lc
+ * deviceType : 1
+ * houseId : de37c4cef269487ab09af03fd5bbc721
+ * id : 1
+ * thirdDeviceAccountId : 2
+ * userId : c8971e8ea0654c429c89cb486d259357
+ */
+
+ private String addressId;
+ private String deviceId;
+ private String deviceModel;
+ private String deviceProvider;
+ private int deviceType;
+ private String houseId;
+ private int id;
+ private int thirdDeviceAccountId;
+ private String userId;
+ private String deviceName;
+ private String version;
+ private String alarmStatus;
+
+ public String getAlarmStatus() {
+ return alarmStatus == null ? "" : alarmStatus;
+ }
+
+ public void setAlarmStatus(String alarmStatus) {
+ this.alarmStatus = alarmStatus;
+ }
+
+ public String getVersion() {
+ return version == null ? "" : version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getDeviceName() {
+ return deviceName == null ? "" : deviceName;
+ }
+
+ public void setDeviceName(String deviceName) {
+ this.deviceName = deviceName;
+ }
+
+ public String getAddressId() {
+ return addressId == null ? "" : addressId;
+ }
+
+ public void setAddressId(String addressId) {
+ this.addressId = addressId;
+ }
+
+ public String getDeviceId() {
+ return deviceId == null ? "" : deviceId;
+ }
+
+ public void setDeviceId(String deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ public String getDeviceModel() {
+ return deviceModel == null ? "" : deviceModel;
+ }
+
+ public void setDeviceModel(String deviceModel) {
+ this.deviceModel = deviceModel;
+ }
+
+ public String getDeviceProvider() {
+ return deviceProvider == null ? "" : deviceProvider;
+ }
+
+ public void setDeviceProvider(String deviceProvider) {
+ this.deviceProvider = deviceProvider;
+ }
+
+ public int getDeviceType() {
+ return deviceType;
+ }
+
+ public void setDeviceType(int deviceType) {
+ this.deviceType = deviceType;
+ }
+
+ public String getHouseId() {
+ return houseId == null ? "" : houseId;
+ }
+
+ public void setHouseId(String houseId) {
+ this.houseId = houseId;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getThirdDeviceAccountId() {
+ return thirdDeviceAccountId;
+ }
+
+ public void setThirdDeviceAccountId(int thirdDeviceAccountId) {
+ this.thirdDeviceAccountId = thirdDeviceAccountId;
+ }
+
+ public String getUserId() {
+ return userId == null ? "" : userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/yonsz/LcListEntity.java b/app/src/main/java/com/lechange/demo/yonsz/LcListEntity.java
new file mode 100644
index 0000000..395ccfb
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/yonsz/LcListEntity.java
@@ -0,0 +1,171 @@
+package com.lechange.demo.yonsz;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2019/3/2.
+ */
+
+public class LcListEntity {
+
+ /**
+ * data : [{"addressId":"3","deviceId":"4K0586CPAJ58121","deviceModel":"deviceModel","deviceProvider":"lc","deviceType":1,"houseId":"de37c4cef269487ab09af03fd5bbc721","id":1,"thirdDeviceAccountId":2,"userId":"c8971e8ea0654c429c89cb486d259357"}]
+ * flag : 1
+ * msg : success
+ */
+
+ private int flag;
+ private String msg;
+ private List data;
+
+ public int getFlag() {
+ return flag;
+ }
+
+ public void setFlag(int flag) {
+ this.flag = flag;
+ }
+
+ public String getMsg() {
+ return msg == null ? "" : msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public List getData() {
+ if (data == null) {
+ return new ArrayList<>();
+ }
+ return data;
+ }
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public static class DataBean {
+ /**
+ * addressId : 3
+ * deviceId : 4K0586CPAJ58121
+ * deviceModel : deviceModel
+ * deviceProvider : lc
+ * deviceType : 1
+ * houseId : de37c4cef269487ab09af03fd5bbc721
+ * id : 1
+ * thirdDeviceAccountId : 2
+ * userId : c8971e8ea0654c429c89cb486d259357
+ */
+
+ private String addressId;
+ private String deviceId;
+ private String deviceModel;
+ private String deviceProvider;
+ private int deviceType;
+ private String houseId;
+ private int id;
+ private int thirdDeviceAccountId;
+ private String userId;
+ private String deviceName;
+ private String version;
+ private String alarmStatus;
+
+ public String getAlarmStatus() {
+ return alarmStatus == null ? "" : alarmStatus;
+ }
+
+ public void setAlarmStatus(String alarmStatus) {
+ this.alarmStatus = alarmStatus;
+ }
+
+ public String getVersion() {
+ return version == null ? "" : version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getDeviceName() {
+ return deviceName == null ? "" : deviceName;
+ }
+
+ public void setDeviceName(String deviceName) {
+ this.deviceName = deviceName;
+ }
+
+ public String getAddressId() {
+ return addressId == null ? "" : addressId;
+ }
+
+ public void setAddressId(String addressId) {
+ this.addressId = addressId;
+ }
+
+ public String getDeviceId() {
+ return deviceId == null ? "" : deviceId;
+ }
+
+ public void setDeviceId(String deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ public String getDeviceModel() {
+ return deviceModel == null ? "" : deviceModel;
+ }
+
+ public void setDeviceModel(String deviceModel) {
+ this.deviceModel = deviceModel;
+ }
+
+ public String getDeviceProvider() {
+ return deviceProvider == null ? "" : deviceProvider;
+ }
+
+ public void setDeviceProvider(String deviceProvider) {
+ this.deviceProvider = deviceProvider;
+ }
+
+ public int getDeviceType() {
+ return deviceType;
+ }
+
+ public void setDeviceType(int deviceType) {
+ this.deviceType = deviceType;
+ }
+
+ public String getHouseId() {
+ return houseId == null ? "" : houseId;
+ }
+
+ public void setHouseId(String houseId) {
+ this.houseId = houseId;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getThirdDeviceAccountId() {
+ return thirdDeviceAccountId;
+ }
+
+ public void setThirdDeviceAccountId(int thirdDeviceAccountId) {
+ this.thirdDeviceAccountId = thirdDeviceAccountId;
+ }
+
+ public String getUserId() {
+ return userId == null ? "" : userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+ }
+}
diff --git a/app/src/main/java/com/lechange/demo/yonsz/LcModifyNameActivity.java b/app/src/main/java/com/lechange/demo/yonsz/LcModifyNameActivity.java
new file mode 100644
index 0000000..e885279
--- /dev/null
+++ b/app/src/main/java/com/lechange/demo/yonsz/LcModifyNameActivity.java
@@ -0,0 +1,332 @@
+package com.lechange.demo.yonsz;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.yonsz.z1.R;
+import com.yonsz.z1.activity.BaseActivity;
+import com.yonsz.z1.database.entity.EventBusEntity;
+import com.yonsz.z1.database.entity.SimpleEntty;
+import com.yonsz.z1.listener.OnTitleItemClickListener;
+import com.yonsz.z1.net.Constans;
+import com.yonsz.z1.net.NetWorkUrl;
+import com.yonsz.z1.net.NetWorkUtil;
+import com.yonsz.z1.utils.SharedpreferencesUtil;
+import com.yonsz.z1.version4.fragment.CurtainFragment;
+import com.yonsz.z1.view.TitleView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import static com.yonsz.z1.net.Constans.GET_SWITCHER_CHANGE_INFO;
+import static com.yonsz.z1.net.Constans.UPDATE_BLINDENTITY_NAME_FAIL;
+import static com.yonsz.z1.net.Constans.UPDATE_BLINDENTITY_NAME_SUCCESS;
+import static com.yonsz.z1.net.Constans.deviceNumListPosition;
+import static com.yonsz.z1.net.Constans.homeListEntity;
+
+/**
+ * Created by Administrator on 2019/3/16.
+ */
+
+public class LcModifyNameActivity extends BaseActivity implements CompoundButton.OnCheckedChangeListener {
+ private TitleView mTitleView;
+ private Button nextConfig;
+
+ private CheckBox[] timeCheckBox = new CheckBox[14];
+ private List positionIds = new ArrayList<>();
+ private CompoundButton lastTimeCheckBox;
+ private String deviceAddress = "0";
+ private List condition = new ArrayList<>();
+ private String addressId;
+ private TextView tv_curtain_step_two;
+
+ public void onEventMainThread(EventBusEntity event) {
+ String msg = event.getMsg();
+ Log.e("nettyUtil", msg);
+ finish();
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_curtain_two);
+ initView();
+ initListener();
+ }
+
+ private void initView() {
+ deviceAddress = getIntent().getExtras().get("deviceAddress").toString();
+ addressId = deviceAddress;
+ tv_curtain_step_two = (TextView) findViewById(R.id.tv_curtain_step_two);
+ tv_curtain_step_two.setVisibility(View.GONE);
+ nextConfig = (Button) findViewById(R.id.bt_sure_config);
+ nextConfig.setOnClickListener(this);
+ nextConfig.setText("确定");
+ nextConfig.setVisibility(View.VISIBLE);
+ mTitleView = (TitleView) findViewById(R.id.title_switcher_two);
+ mTitleView.setHead("修改摄像头位置信息");
+ mTitleView.setTitleListener(new OnTitleItemClickListener() {
+ @Override
+ public void onBack() {
+ finish();
+ }
+
+ @Override
+ public void onFunction() {
+
+ }
+
+ @Override
+ public void onFunctionText() {
+
+ }
+ });
+
+ positionIds.add(R.id.cb_position0);
+ positionIds.add(R.id.cb_position1);
+ positionIds.add(R.id.cb_position2);
+ positionIds.add(R.id.cb_position3);
+ positionIds.add(R.id.cb_position4);
+ positionIds.add(R.id.cb_position5);
+ positionIds.add(R.id.cb_position6);
+ positionIds.add(R.id.cb_position7);
+ positionIds.add(R.id.cb_position8);
+ positionIds.add(R.id.cb_position9);
+ positionIds.add(R.id.cb_position10);
+ positionIds.add(R.id.cb_position11);
+ positionIds.add(R.id.cb_position12);
+ positionIds.add(R.id.cb_position13);
+ for (int i = 0; i < positionIds.size(); i++) {
+ timeCheckBox[i] = (CheckBox) findViewById(positionIds.get(i));
+ timeCheckBox[i].setOnCheckedChangeListener(this);
+ }
+
+ switch (deviceAddress) {
+ case "0":
+ timeCheckBox[13].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position13);
+ condition.add("13");
+ break;
+ case "1":
+ timeCheckBox[0].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position0);
+ condition.add("0");
+ break;
+ case "2":
+ timeCheckBox[1].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position1);
+ condition.add("1");
+ break;
+ case "3":
+ timeCheckBox[2].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position2);
+ condition.add("2");
+ break;
+ case "4":
+ timeCheckBox[3].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position3);
+ condition.add("3");
+ break;
+ case "5":
+ timeCheckBox[4].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position4);
+ condition.add("4");
+ break;
+ case "6":
+ timeCheckBox[5].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position5);
+ condition.add("5");
+ break;
+ case "7":
+ timeCheckBox[6].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position6);
+ condition.add("6");
+ break;
+ case "8":
+ timeCheckBox[7].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position7);
+ condition.add("7");
+ break;
+ case "9":
+ timeCheckBox[8].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position8);
+ condition.add("8");
+ break;
+ case "10":
+ timeCheckBox[9].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position9);
+ condition.add("9");
+ break;
+ case "11":
+ timeCheckBox[10].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position10);
+ condition.add("10");
+ break;
+ case "12":
+ timeCheckBox[11].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position11);
+ condition.add("11");
+ break;
+ case "13":
+ timeCheckBox[12].setChecked(true);
+ lastTimeCheckBox = (CompoundButton) findViewById(R.id.cb_position12);
+ condition.add("12");
+ break;
+ }
+ }
+
+ private void modifyDevice() {
+ NetWorkUtil util = NetWorkUtil.instans();
+ HashMap