Kaynağa Gözat

commit by xulin
20190315

lyn 6 yıl önce
ebeveyn
işleme
8f7ca90d16
29 değiştirilmiş dosya ile 648 ekleme ve 77 silme
  1. 5 3
      app/build.gradle
  2. 1 1
      app/release/output.json
  3. 118 0
      app/src/main/java/com/hc/webapp/BToast.java
  4. 6 1
      app/src/main/java/com/hc/webapp/BaseApp.java
  5. 215 21
      app/src/main/java/com/hc/webapp/MainActivity.java
  6. 7 7
      app/src/main/java/com/hc/webapp/NetworkConnectChangedReceiver.java
  7. 0 1
      app/src/main/java/com/hc/webapp/video/VideoControlDelegate.java
  8. 102 15
      app/src/main/java/com/hc/webapp/web/AndroidToJS.java
  9. 31 7
      app/src/main/java/com/hc/webapp/web/BaseWebActivity.java
  10. 5 0
      app/src/main/res/drawable/toast_back.xml
  11. 1 0
      app/src/main/res/layout/activity_main.xml
  12. 21 0
      app/src/main/res/layout/toast_layout.xml
  13. 2 0
      lib/src/main/java/com/hc/lib/video/IVideoPlayer.java
  14. 45 20
      lib/src/main/java/com/hc/lib/video/MVideoPlayer.java
  15. 11 0
      lib/src/main/res/drawable/my_progressbar.xml
  16. 11 0
      lib/src/main/res/drawable/my_ring.xml
  17. 1 0
      lib/src/main/res/layout/layout_m_player.xml
  18. 1 0
      lib/src/main/res/values-hdpi/dimens.xml
  19. 1 0
      lib/src/main/res/values-ldpi/dimens.xml
  20. 1 0
      lib/src/main/res/values-mdpi-1280x720/dimens.xml
  21. 1 0
      lib/src/main/res/values-mdpi-1920x1080/dimens.xml
  22. 1 0
      lib/src/main/res/values-xhdpi/dimens.xml
  23. 1 0
      lib/src/main/res/values-xxhdpi/dimens.xml
  24. 1 0
      lib/src/main/res/values-xxxhdpi/dimens.xml
  25. 15 0
      model/src/main/java/com/hc/request/Config.java
  26. 3 0
      model/src/main/java/com/hc/request/core/CallServer.java
  27. 39 0
      model/src/main/java/com/hc/request/core/parse/FastGetRequest.java
  28. 1 0
      model/src/main/java/com/hc/request/core/parse/FastJsonRequest.java
  29. 1 1
      model/src/main/java/com/hc/viewmodel/SingleLiveEvent.java

+ 5 - 3
app/build.gradle

@@ -14,8 +14,8 @@ android {
         applicationId "com.hc.webapp"
         minSdkVersion versions.minSdk
         targetSdkVersion versions.targetSdk
-        versionCode 6
-        versionName "v2.0.1"
+        versionCode 10
+        versionName "v2.0.5"
         ndk {
             //APP的build.gradle设置支持的SO库架构
             abiFilters 'armeabi', 'armeabi-v7a'
@@ -24,12 +24,13 @@ android {
     }
     buildTypes {
         debug {
-            buildConfigField "Boolean", "isDebug", "true"
+            buildConfigField "Boolean", "isDebug", "false"
 //            zipAlignEnabled true
 //            shrinkResources true
 //            debuggable true
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.config
         }
         release {
             buildConfigField "Boolean", "isDebug", "false"
@@ -64,4 +65,5 @@ dependencies {
     implementation('com.jewel.lib:JLib:1.0.9') {
         exclude group: "com.android.support"
     }
+    implementation 'com.android.volley:volley:1.1.1'
 }

+ 1 - 1
app/release/output.json

@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":6,"versionName":"v2.0.1","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":10,"versionName":"v2.0.5","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]

+ 118 - 0
app/src/main/java/com/hc/webapp/BToast.java

@@ -0,0 +1,118 @@
+package com.hc.webapp;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class BToast extends Toast {
+
+    /**
+     * Toast单例
+     */
+    private static BToast toast;
+
+
+    /**
+     * Construct an empty Toast object.  You must call {@link #setView} before you
+     * can call {@link #show}.
+     *
+     * @param context The context to use.  Usually your {@link Application}
+     *                or {@link Activity} object.
+     */
+    public BToast(Context context) {
+        super(context);
+    }
+
+    /**
+     * 隐藏当前Toast
+     */
+    public static void cancelToast() {
+        if (toast != null) {
+            toast.cancel();
+        }
+    }
+
+    public void cancel() {
+        try {
+            super.cancel();
+        } catch (Exception e) {
+
+        }
+    }
+
+    @Override
+    public void show() {
+        try {
+            super.show();
+        } catch (Exception e) {
+
+        }
+    }
+
+    private static void initToast(Context context, CharSequence text) {
+        try {
+            cancelToast();
+
+            toast = new BToast(context);
+
+            // 获取LayoutInflater对象
+            LayoutInflater inflater =
+                    (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+            // 由layout文件创建一个View对象
+            View layout = inflater.inflate(R.layout.toast_layout, null);
+
+
+            // 吐司上的文字
+            TextView toast_text = (TextView) layout.findViewById(R.id.toast_text);
+            toast_text.setText(text);
+            toast.setView(layout);
+            toast.setGravity(Gravity.CENTER, 0, 240);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 图标状态 不显示图标
+     */
+    private static final int TYPE_HIDE = -1;
+    /**
+     * 图标状态 显示√
+     */
+    private static final int TYPE_TRUE = 0;
+    /**
+     * 图标状态 显示×
+     */
+    private static final int TYPE_FALSE = 1;
+
+    /**
+     * 显示Toast
+     *
+     * @param context 上下文
+     * @param text    显示的文本
+     * @param time    显示时长
+     * @param imgType 图标状态
+     */
+    public static void showToast(Context context, CharSequence text, int time) {
+        // 初始化一个新的Toast对象
+        initToast(context, text);
+
+        // 设置显示时长
+        if (time == Toast.LENGTH_LONG) {
+            toast.setDuration(Toast.LENGTH_LONG);
+        } else {
+            toast.setDuration(Toast.LENGTH_SHORT);
+        }
+
+
+        // 显示Toast
+        toast.show();
+    }
+}

+ 6 - 1
app/src/main/java/com/hc/webapp/BaseApp.java

@@ -61,7 +61,12 @@ public class BaseApp extends Application {
 
     private void initLogger() {
         FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder().tag(getApplicationContext().getPackageName()).build();
-        com.orhanobut.logger.Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
+        com.orhanobut.logger.Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy){
+            @Override
+            public boolean isLoggable(int priority, String tag) {
+                return BuildConfig.isDebug;
+            }
+        });
     }
 
     private void initVideo() {

Dosya farkı çok büyük olduğundan ihmal edildi
+ 215 - 21
app/src/main/java/com/hc/webapp/MainActivity.java


+ 7 - 7
app/src/main/java/com/hc/webapp/NetworkConnectChangedReceiver.java

@@ -45,11 +45,11 @@ public class NetworkConnectChangedReceiver extends BroadcastReceiver {
 
     @Override
     public void onReceive(Context context, Intent intent) {
-        //MyToast("action:" + intent.getAction());
+        //BToast("action:" + intent.getAction());
         /*if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {// 监听wifi的打开与关闭,与wifi的连接无关
             int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
             Log.e(TAG, "wifiState:" + wifiState);
-            MyToast("wifiState:" + wifiState);
+            BToast("wifiState:" + wifiState);
             switch (wifiState) {
                 case WifiManager.WIFI_STATE_DISABLED:
                     Log.d(TAG,"WIFI_STATE_DISABLED");
@@ -71,7 +71,7 @@ public class NetworkConnectChangedReceiver extends BroadcastReceiver {
                 //判断网络是否已经连接
                 boolean isConnected = state == NetworkInfo.State.CONNECTED;
                 Log.e(TAG, "isConnected:" + isConnected);
-                MyToast("isConnected:" + isConnected);
+                BToast("isConnected:" + isConnected);
                 if (isConnected) {
                 } else {
 
@@ -89,11 +89,11 @@ public class NetworkConnectChangedReceiver extends BroadcastReceiver {
                     if (info.getType() == ConnectivityManager.TYPE_WIFI
                             || info.getType() == ConnectivityManager.TYPE_MOBILE) {
                         Log.i(TAG, getConnectionType(info.getType()) + "连上");
-                        MyToast(getConnectionType(info.getType()) + "连上");
+                        BToast(getConnectionType(info.getType()) + "连上");
                     }
                 } else {
                     Log.i(TAG, getConnectionType(info.getType()) + "断开");
-                   MyToast(getConnectionType(info.getType()) + "断开");
+                   BToast(getConnectionType(info.getType()) + "断开");
                 }
             }
 
@@ -101,10 +101,10 @@ public class NetworkConnectChangedReceiver extends BroadcastReceiver {
 
         boolean isConnected = isNetworkAvailable(context);
         if(isConnected){
-            //MyToast("连上");
+            //BToast("连上");
             networkConnectChangedListener.onConnected();
         }else {
-            //MyToast("断开");
+            //BToast("断开");
             networkConnectChangedListener.onDisConnected();
         }
     }

+ 0 - 1
app/src/main/java/com/hc/webapp/video/VideoControlDelegate.java

@@ -125,7 +125,6 @@ public class VideoControlDelegate implements VideoPauseDialog.OnPlayItemSelected
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
             playResume(false);
-
         }
         else {
             videoPlayer.onKeyDown(keyCode, event);

+ 102 - 15
app/src/main/java/com/hc/webapp/web/AndroidToJS.java

@@ -15,18 +15,25 @@ import android.webkit.JavascriptInterface;
 import android.webkit.WebView;
 import android.widget.TextView;
 
+import com.alibaba.fastjson.JSON;
 import com.hc.lib.DownloadUtils;
 import com.hc.lib.MacUtil;
+import com.hc.model.BaseResponse;
 import com.hc.model.YNYD.YNYDContentProvider;
 import com.hc.model.YNYD.YNYDService;
 import com.hc.request.Config;
+import com.hc.request.core.CallServer;
 import com.hc.request.core.DefaultCallback;
+import com.hc.request.core.parse.FastGetRequest;
+import com.hc.request.core.parse.FastJsonRequest;
 import com.hc.webapp.BuildConfig;
 import com.jewel.lib.java.StringUtil;
 import com.orhanobut.logger.Logger;
+import com.yanzhenjie.nohttp.rest.Request;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Method;
 import java.util.regex.Pattern;
 
 import static com.hc.lib.video.IVideoPlayer.PLAY_TIME_NO_LIMIT;
@@ -39,6 +46,8 @@ public class AndroidToJS {
     public static final String JS_EVENT_PLAY_FINISH = "javascript:onPlayBackEvent()";
     private static final String JS_EVENT_AUTH_RESULT = "javascript:onAuthResult(%s, %s)";
     public static final String JS_EVENT_PLAY_NEXT = "javascript:onPlayNextEvent()";
+    public static final String JS_PAY_BACK = "javascript:onPayBack()";
+    public static final String WEB_REQUEST_RESPONSE = "javascript:onWebRequestResponse()";
 
     private static final String HAD_FLOAT_VIDEO = "1"; // 当前H5页面存在小窗视频
     private static final String NEED_MUTE = "0";
@@ -50,7 +59,7 @@ public class AndroidToJS {
     /**
      * JS调用类型
      */
-    @StringDef({JS_EVENT_BACK, JS_EVENT_PLAY_FINISH, JS_EVENT_PLAY_NEXT})
+    @StringDef({JS_EVENT_BACK, JS_EVENT_PLAY_FINISH, JS_EVENT_PLAY_NEXT,JS_PAY_BACK,WEB_REQUEST_RESPONSE})
     @Retention(RetentionPolicy.SOURCE)
     private @interface JsEvent {
 
@@ -63,11 +72,35 @@ public class AndroidToJS {
     private PlayVideoListener playVideoListener;
     private long playTime = PLAY_TIME_NO_LIMIT;
 
+    //陕西广电盒子参数
+    String stbId = "";
+    String token = "";
+    String userName = "";
+    String cardId="";
+    String versionType="";
+    String mac ="";
+
     public AndroidToJS(Context context, WebView webView) {
         this.context = context;
         this.webView = webView;
         contentProvider = new YNYDContentProvider(context);
         service = new YNYDService(context);
+        getDeviceInfo();
+    }
+
+    public void getDeviceInfo(){
+        try{
+            Method localMethod = Class.forName("android.os.SystemProperties").getMethod("get", new Class[] { String.class });
+            stbId = (String)localMethod.invoke(null, new Object[] { "ro.di.stb_id" });
+            token = (String)localMethod.invoke(null, new Object[] { "sys.auth.AAAtoken" });
+            userName = (String)localMethod.invoke(null, new Object[] { "sys.auth.username" });
+            cardId = (String)localMethod.invoke(null, new Object[] { "sys.ca.cardid" });
+            versionType = (String)localMethod.invoke(null, new Object[] { "ro.di.hw_version" });
+            mac=(String)localMethod.invoke(null, new Object[] { "ro.di.mac" });
+            Log.d("android_js","token:" + token + "; versionType:" + versionType);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
     }
 
     public void setPlayVideoListener(PlayVideoListener playVideoListener) {
@@ -84,7 +117,7 @@ public class AndroidToJS {
      */
     @JavascriptInterface
     public void playFull(String url, String sourceId, String title, String time, String hadFloatVideo, String isNextVideo, String showCompleteDialog) {
-        Logger.d("调用全屏播放。源ID(%s),标题(%s),播放地址(%s)", sourceId, title, url);
+        //Logger.d("调用全屏播放。源ID(%s),标题(%s),播放地址(%s)", sourceId, title, url);
         if (playVideoListener != null) {
 
             playTime = PLAY_TIME_NO_LIMIT;
@@ -94,7 +127,7 @@ public class AndroidToJS {
             boolean hadFloat = TextUtils.equals(HAD_FLOAT_VIDEO, hadFloatVideo);
             boolean isCurrentNextVideo = TextUtils.equals(HAD_FLOAT_VIDEO, isNextVideo);
             boolean isShowCompleteDialog = TextUtils.equals(HAD_FLOAT_VIDEO, showCompleteDialog);
-            Logger.d("调用全屏播放。有小窗(%s),当前为非初始视频(%s),显示结束弹窗(%s)", hadFloat, isCurrentNextVideo, isShowCompleteDialog);
+            //Logger.d("调用全屏播放。有小窗(%s),当前为非初始视频(%s),显示结束弹窗(%s)", hadFloat, isCurrentNextVideo, isShowCompleteDialog);
             ((Activity) context).runOnUiThread(() -> playFull(url, sourceId, title, playTime, hadFloat, isCurrentNextVideo, isShowCompleteDialog, 0));
         }
     }
@@ -110,7 +143,7 @@ public class AndroidToJS {
      */
     @JavascriptInterface
     public void playFull(String url, String sourceId, String title, String time, String hadFloatVideo, String isNextVideo, String showCompleteDialog, int seekTime) {
-        Logger.d("调用全屏播放。源ID(%s),标题(%s),播放地址(%s)", sourceId, title, url);
+        //Logger.d("调用全屏播放。源ID(%s),标题(%s),播放地址(%s)", sourceId, title, url);
         if (playVideoListener != null) {
 
             playTime = PLAY_TIME_NO_LIMIT;
@@ -120,7 +153,7 @@ public class AndroidToJS {
             boolean hadFloat = TextUtils.equals(HAD_FLOAT_VIDEO, hadFloatVideo);
             boolean isCurrentNextVideo = TextUtils.equals(HAD_FLOAT_VIDEO, isNextVideo);
             boolean isShowCompleteDialog = TextUtils.equals(HAD_FLOAT_VIDEO, showCompleteDialog);
-            Logger.d("调用全屏播放。有小窗(%s),当前为非初始视频(%s),显示结束弹窗(%s),快进时间(%s)", hadFloat, isCurrentNextVideo, isShowCompleteDialog, seekTime);
+            //Logger.d("调用全屏播放。有小窗(%s),当前为非初始视频(%s),显示结束弹窗(%s),快进时间(%s)", hadFloat, isCurrentNextVideo, isShowCompleteDialog, seekTime);
             ((Activity) context).runOnUiThread(() -> playFull(url, sourceId, title, playTime, hadFloat, isCurrentNextVideo, isShowCompleteDialog, seekTime));
         }
     }
@@ -147,10 +180,10 @@ public class AndroidToJS {
     @JavascriptInterface
     public void playFloat(String url, String sourceId, String title,
                           final String x, final String y, final String width, final String height, String needMute) {
-        Logger.d("调用小窗口播放。播放地址(%s), 源ID(%s),标题(%s)", url, sourceId, title);
-        Logger.d("调用小窗口播放。坐标(%s, %s),宽高(%s, %s)", x, y, width, height);
+        //Logger.d("调用小窗口播放。播放地址(%s), 源ID(%s),标题(%s)", url, sourceId, title);
+        //Logger.d("调用小窗口播放。坐标(%s, %s),宽高(%s, %s)", x, y, width, height);
         boolean isMute = TextUtils.equals(NEED_MUTE, needMute);
-        Logger.d("调用小窗口播放。需要静音:%s", isMute);
+        //Logger.d("调用小窗口播放。需要静音:%s", isMute);
         if (isDigitsOnly(x) && isDigitsOnly(y) && isDigitsOnly(width) && isDigitsOnly(height) && playVideoListener != null) {
             ((Activity) context).runOnUiThread(() -> playFloat(url, sourceId, title,
                     (int) Float.parseFloat(x),
@@ -171,7 +204,7 @@ public class AndroidToJS {
      */
     @JavascriptInterface
     public void closeFloat() {
-        Logger.d("关闭小窗口播放。");
+        //Logger.d("关闭小窗口播放。");
         if (playVideoListener != null) {
             playVideoListener.stopFloatVideo();
         }
@@ -204,8 +237,15 @@ public class AndroidToJS {
     }
 
     @JavascriptInterface
+    public void webRequest(String tag,String url){
+       playVideoListener.webRequest(tag,url);
+    }
+
+
+
+    @JavascriptInterface
     public String getUser() {
-        return contentProvider.getUserName();
+        return userName;
     }
 
     @JavascriptInterface
@@ -219,8 +259,18 @@ public class AndroidToJS {
     }
 
     @JavascriptInterface
+    public String getStbId() {
+        return stbId;
+    }
+
+    @JavascriptInterface
     public String getToken() {
-        return contentProvider.getToken();
+        return token;
+    }
+
+    @JavascriptInterface
+    public String getCardId() {
+        return cardId;
     }
 
     @JavascriptInterface
@@ -240,11 +290,28 @@ public class AndroidToJS {
 
     @JavascriptInterface
     public String getMac() {
-        return MacUtil.getMac(context);
+        return mac;
+    }
+
+    @JavascriptInterface
+    public String getVersionType() {
+        return versionType;
+    }
+
+    @JavascriptInterface
+    public void toast(String msg){
+        playVideoListener.Toast(msg);
+    }
+
+    @JavascriptInterface
+    public void pay(String orderNum) {
+        Log.d("SXGD","pay, num:" + orderNum);
+        playVideoListener.pay(orderNum);
     }
 
     @JavascriptInterface
-    public void pay() {
+    public void reLogin() {
+        playVideoListener.reLogin();
     }
 
     @JavascriptInterface
@@ -316,7 +383,7 @@ public class AndroidToJS {
      * 调用js事件
      *
      * @param webView webView
-     * @param script  {@link AndroidToJS#JS_EVENT_BACK}、{@link AndroidToJS#JS_EVENT_PLAY_FINISH}
+     * @param script  {@link AndroidToJS#JS_EVENT_BACK}、{@link AndroidToJS#JS_EVENT_PLAY_FINISH}、{@link AndroidToJS#JS_PAY_BACK、{@link AndroidToJS#WEB_REQUEST_RESPONSE}
      */
     public static void evaluateJavascript(WebView webView, @JsEvent String script) {
         if (webView == null) {
@@ -378,7 +445,7 @@ public class AndroidToJS {
          * @param sourceId      源ID
          * @param playTime      可播放时间。如果为{@link com.hc.lib.video.IVideoPlayer#PLAY_TIME_NO_LIMIT},代表无限制播放
          * @param hadFloatVideo 当前H5页面是否有小窗
-         * @param seekTime 全屏时需要快进的时间
+         * @param seekTime      全屏时需要快进的时间
          */
         void playFullVideo(String url, String title, String uid, String sourceId, long playTime, boolean hadFloatVideo, boolean showCompleteDialog, int seekTime);
 
@@ -386,5 +453,25 @@ public class AndroidToJS {
          * 结束小窗播放
          */
         void stopFloatVideo();
+
+        /*
+        * 支付
+        * */
+        void pay(String orderNum);
+
+        /*
+         * 前端网络访问;
+         * */
+        void webRequest(String tag,String url);
+
+        /*
+         * 提示;
+         * */
+        void Toast(String msg);
+
+        /*
+         * 重新令牌登陆
+         * */
+        void reLogin();
     }
 }

+ 31 - 7
app/src/main/java/com/hc/webapp/web/BaseWebActivity.java

@@ -23,8 +23,11 @@ import android.webkit.WebViewClient;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
+import android.widget.Toast;
 
+import com.hc.webapp.BToast;
 import com.hc.webapp.BuildConfig;
+import com.hc.webapp.MainActivity;
 import com.hc.webapp.NetworkConnectChangedListener;
 import com.hc.webapp.NetworkConnectChangedReceiver;
 import com.hc.webapp.R;
@@ -42,7 +45,9 @@ public abstract class BaseWebActivity extends AppCompatActivity {
     private ImageView noticeImage;
     protected FrameLayout webViewContainer;
     protected boolean hasShowWebView = false;
-    protected boolean hasOneFloatViewToShow = true;
+    protected boolean hasOneFloatViewToShow = false;
+    private boolean isShowNoNet = false;
+
     /**
      * JS调用对象名
      */
@@ -111,12 +116,20 @@ public abstract class BaseWebActivity extends AppCompatActivity {
 
     }
 
+    protected void GdToast(final String msg){
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                BToast.showToast(BaseWebActivity.this,msg,Toast.LENGTH_SHORT);
+            }
+        });
+    }
+
     //检查网络是否可用,add by 许林2018/12/5
     public boolean isNetworkAvailable(Context context) {
         ConnectivityManager manager = (ConnectivityManager) context
                 .getApplicationContext().getSystemService(
                         Context.CONNECTIVITY_SERVICE);
-
         if (manager == null) {
             return false;
         }
@@ -206,10 +219,10 @@ public abstract class BaseWebActivity extends AppCompatActivity {
 
     private void CheckNetWorkLoop(CheckNetWorkListener listener){
         if(!isNetworkAvailable(this)){
-            showNoNetImage();
             new Timer().schedule(new TimerTask() {
                 @Override
                 public void run() {
+                    showNoNetImage();
                     CheckNetWorkLoop(listener);
                 }
             },5000);
@@ -228,17 +241,15 @@ public abstract class BaseWebActivity extends AppCompatActivity {
         super.onCreate(savedInstanceState);
 
         setContentView(R.layout.activity_main);
-        //hasOneFloatViewToShow = true;
+        hasOneFloatViewToShow = true;
         if (getIntent() != null) {
             handleIntent(getIntent());
         }
 
-
         webViewContainer = findViewById(R.id.webview_container);
         background = findViewById(R.id.background);
         noticeImage = findViewById(R.id.notice_image);
 
-
         webView = new WebView(this);
         webView.setBackgroundColor(ContextCompat.getColor(this, android.R.color.transparent));
 //        webView.setBackgroundResource(R.drawable.img_start_bg);
@@ -257,6 +268,7 @@ public abstract class BaseWebActivity extends AppCompatActivity {
                         BaseWebActivity.this.runOnUiThread(new Runnable() {
                             @Override
                             public void run() {
+                                Log.d("SXYD","load url 1");
                                 webView.loadUrl(getIndexURL());
                                 registerReceiver();
                             }
@@ -268,12 +280,17 @@ public abstract class BaseWebActivity extends AppCompatActivity {
             });
         }else{
             setShouldOverrideBackPressToJS(true);
+            Log.d("SXYD","load url 2");
             webView.loadUrl(getIndexURL());
             registerReceiver();
         }
 
     }
 
+    private void checkLoop(){
+
+    }
+
     /*
     * add by xulin 20181221 start
     * */
@@ -298,6 +315,7 @@ public abstract class BaseWebActivity extends AppCompatActivity {
                 destroyWebView();
                 destroyVideoView();
                 noticeImage.setVisibility(View.VISIBLE);
+                isShowNoNet = true;
             }
         });
     };
@@ -314,7 +332,10 @@ public abstract class BaseWebActivity extends AppCompatActivity {
         BaseWebActivity.this.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                reloadWebView();
+                if(isShowNoNet){
+                    reloadWebView();
+                }
+                isShowNoNet = false;
                 noticeImage.setVisibility(View.VISIBLE);
             }
         });
@@ -322,6 +343,7 @@ public abstract class BaseWebActivity extends AppCompatActivity {
 
     private void reloadWebView(){
         webView.setVisibility(View.VISIBLE);
+        Log.d("SXYD","load url 3");
         webView.loadUrl(getIndexURL());
     }
 
@@ -369,11 +391,13 @@ public abstract class BaseWebActivity extends AppCompatActivity {
                 webView.setVisibility(View.VISIBLE);
                 if(hasOneFloatViewToShow){
                     delayShowFloatView();
+                    hasOneFloatViewToShow = false;
                 }
             }
 
             @Override
             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
+                GdToast("网络连接异常,请检查网络或联系96766");
             }
         });
 

+ 5 - 0
app/src/main/res/drawable/toast_back.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+    <corners android:radius="12dp" />
+    <solid android:color="#b2000000"/>
+</shape>

+ 1 - 0
app/src/main/res/layout/activity_main.xml

@@ -22,4 +22,5 @@
             android:src="@drawable/notice"
             android:visibility="invisible"/>
     </RelativeLayout>
+
 </FrameLayout>

+ 21 - 0
app/src/main/res/layout/toast_layout.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/toast_back"
+    android:gravity="center_vertical"
+    android:padding="16dp"
+    android:orientation="vertical" >
+
+    <TextView
+        android:id="@+id/toast_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:textColor="#FFFFFF"
+        android:gravity="center"
+        android:textSize="30sp" />
+
+</LinearLayout>

+ 2 - 0
lib/src/main/java/com/hc/lib/video/IVideoPlayer.java

@@ -42,4 +42,6 @@ public interface IVideoPlayer {
     void onVideoDestroy();
 
     void restart();
+
+    boolean getIsPrepared();
 }

+ 45 - 20
lib/src/main/java/com/hc/lib/video/MVideoPlayer.java

@@ -21,7 +21,6 @@ import com.jewel.mplayer.CoreVideoView;
 import com.jewel.mplayer.OnVideoChangeListener;
 import com.jewel.mplayer.content.VideoData;
 import com.jewel.mplayer.system.SystemVideoView;
-import com.orhanobut.logger.Logger;
 
 import java.util.Calendar;
 import java.util.Timer;
@@ -45,10 +44,6 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
     private boolean needSeek = false;
 
 
-    //private ErrorLisenter errorLisenter;
-
-
-
     private VideoHideControlViewRunnable videoHideControlViewRunnable;
     private OnPlayerPausedListener onPlayerPausedListener;
 
@@ -76,6 +71,7 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
 
 
 
+
     public void setMargins (int l, int t, int r, int b) {
         if (videoView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
             ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) videoView.getLayoutParams();
@@ -84,6 +80,8 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
         }
     }
 
+
+
     public MVideoPlayer(Context context) {
         super(context);
 
@@ -113,7 +111,7 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                     mProgress = progress;
                 }*/
                 mProgress = progress;
-                Log.d(TAG,"progress:" + progress);
+                ////Log.d(TAG,"progress:" + progress);
                 percentText.setText(mProgress/10 + "%");
 
                 if(progress<=0){
@@ -176,7 +174,7 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                     if (seekTime >= duration) {
                         return;
                     }
-                    Logger.d("视频开始播放时快进时长:%s秒", seekTime);
+                    //Logger.d("视频开始播放时快进时长:%s秒", seekTime);
                     videoView.seekTo(seekTime);
                 }
             }
@@ -210,12 +208,11 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                 if(videoView == null || videoView.getVideo() == null) {
                     return;
                 }
-                Logger.d("视频结束播放,时长(%s秒), 视频id(%s)", videoView.getVideo().getCurrentPosition(), videoView.getVideo().getId());
+                //Logger.d("视频结束播放,时长(%s秒), 视频id(%s)", videoView.getVideo().getCurrentPosition(), videoView.getVideo().getId());
             }
 
             @Override
             public void onVideoError(CoreVideoView coreVideoView, int errorCode, String msg) {
-                //errorLisenter.onError();
             }
         });
     }
@@ -235,6 +232,9 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                 showControlWidget();
             }
         }
+        if(layoutLoading != null){
+            layoutLoading.setVisibility(VISIBLE);
+        }
     }
 
     public void start() {
@@ -297,7 +297,7 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
      */
     private void initTimer(){
         if(mainActivity == null){
-            Log.d(TAG,"请向播放器传递activity实例");
+            ////Log.d(TAG,"请向播放器传递activity实例");
             return;
         }
         if(timer == null){
@@ -312,8 +312,13 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                         long myCurrentTime = Calendar.getInstance().getTimeInMillis();
                         if(myCurrentTime - currentTime > 3){
                             int position = seekBar.getProgress();
-                            position = position* getDuration()/1000;
-                            Log.d(TAG,"finally seek position:" + position);
+                            ////Log.d(TAG,"seek bar progress:" + position);
+                            int duration = getDuration();
+                            ////Log.d(TAG,"duration:" + duration);
+                            float fPostion = position;
+                            float fDuration = duration;
+                            position = (int)(fPostion*fDuration/1000);
+                            ////Log.d(TAG,"finally seek position:" + position);
                             seekTo(position);
                             seekContainer.setVisibility(GONE);
                         }
@@ -334,7 +339,7 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
-        Logger.d("HCVideoPlayer onKeyDown start: %s, %s", keyCode, event.getAction());
+        //Logger.d("HCVideoPlayer onKeyDown start: %s, %s", keyCode, event.getAction());
         switch (keyCode) {
             case KeyEvent.KEYCODE_DPAD_LEFT:
                 /*if (event.getAction() == KeyEvent.ACTION_DOWN) {
@@ -376,18 +381,22 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                 break;
             case KeyEvent.KEYCODE_DPAD_CENTER:
                 if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                    pauseOrPlay(false);
+                    if(videoView.isPlaying()){
+                        pauseOrPlay(false);
+                    }
                 }
                 break;
             case KeyEvent.KEYCODE_ENTER:
                 if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                    pauseOrPlay(false);
+                    if(videoView.isPlaying()){
+                        pauseOrPlay(false);
+                    }
                 }
                 break;
             default:
                 break;
         }
-        Logger.d("HCVideoPlayer onKeyDown end: %s", keyCode);
+        //Logger.d("HCVideoPlayer onKeyDown end: %s", keyCode);
         return super.onKeyDown(keyCode, event);
     }
 
@@ -405,7 +414,12 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                 public void run() {
                     hideAllWidget();
                     seekContainer.setVisibility(VISIBLE);
-                    int position = (videoView.getCurrentPositionWhenPlaying() * 1000)/ videoView.getDuration();
+                    int currentPos = videoView.getCurrentPositionWhenPlaying();
+                    //Log.d(TAG,"seekBack currentPos:" + currentPos);
+                    int durationSec = videoView.getDuration()/1000;
+                    //Log.d(TAG,"durationSec:" + durationSec);
+                    int position = currentPos/ durationSec;
+                    //Log.d(TAG,"seekBack back position:" + position);
                     seekBar.setProgress(position);
                     currentTime =Calendar.getInstance().getTimeInMillis();
                 }
@@ -430,7 +444,13 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
                 public void run() {
                     hideAllWidget();
                     seekContainer.setVisibility(VISIBLE);
-                    int position = (videoView.getCurrentPositionWhenPlaying() * 1000)/ videoView.getDuration();
+                    //float currentPos = (float)videoView.getCurrentPositionWhenPlaying()*1000;
+                    int currentPos = videoView.getCurrentPositionWhenPlaying();
+                    //Log.d(TAG,"seekForward currentPos:" + currentPos);
+                    int durationSec = videoView.getDuration()/1000;
+                    //Log.d(TAG,"durationSec:" + durationSec);
+                    int position = currentPos/ durationSec;
+                    //Log.d(TAG,"seekForward forward position:" + position);
                     seekBar.setProgress(position);
                     currentTime =Calendar.getInstance().getTimeInMillis();
                 }
@@ -438,7 +458,7 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
         }
 
         int position = seekBar.getProgress() + seekPercent* 10;
-        Log.d(TAG,"seek position:" + position);
+        ////Log.d(TAG,"seek position:" + position);
         seek(position);
     }
 
@@ -526,8 +546,10 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
     }
 
     @Override
-    public void pauseOrPlay(boolean play) {
+    public boolean getIsPrepared(){return this.isPrepared;}
 
+    @Override
+    public void pauseOrPlay(boolean play) {
         if (videoView.isPlaying() && play) { //已是播放状态,忽略
             return;
         }
@@ -546,6 +568,9 @@ public class MVideoPlayer extends FrameLayout implements IVideoPlayer{
         }
     }
 
+
+
+
     @Override
     public void onVideoResume() {
         videoView.resume();

+ 11 - 0
lib/src/main/res/drawable/my_progressbar.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <rotate
+            android:drawable="@drawable/my_ring"
+            android:pivotX="50%"
+            android:pivotY="50%"
+            android:fromDegrees="0"
+            android:toDegrees="1080"/>
+    </item>
+</layer-list>

+ 11 - 0
lib/src/main/res/drawable/my_ring.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="ring"
+    android:thickness="@dimen/ring_width"
+    android:useLevel="false" >
+    <gradient
+        android:endColor="#888888"
+        android:startColor="#cccccc"
+        android:type="sweep"
+        android:useLevel="false" />
+</shape>

+ 1 - 0
lib/src/main/res/layout/layout_m_player.xml

@@ -26,6 +26,7 @@
             android:id="@+id/loading_animation"
             android:layout_width="@dimen/player_loading_image_width"
             android:layout_height="@dimen/player_loading_image_height"
+            android:indeterminateDrawable="@drawable/my_progressbar"
             android:layout_gravity="center" />
     </FrameLayout>
 

+ 1 - 0
lib/src/main/res/values-hdpi/dimens.xml

@@ -707,4 +707,5 @@
     <dimen name="video_bottom_padding">50.0dp</dimen>
 
     <dimen name="video_bottom_text_margin">5.0dp</dimen>
+    <dimen name="ring_width">5.0dp</dimen>
 </resources>

+ 1 - 0
lib/src/main/res/values-ldpi/dimens.xml

@@ -707,4 +707,5 @@
     <dimen name="video_bottom_padding">100.0dp</dimen>
 
     <dimen name="video_bottom_text_margin">10.0dp</dimen>
+    <dimen name="ring_width">10.0dp</dimen>
 </resources>

+ 1 - 0
lib/src/main/res/values-mdpi-1280x720/dimens.xml

@@ -707,4 +707,5 @@
     <dimen name="video_bottom_padding">50.0dp</dimen>
 
     <dimen name="video_bottom_text_margin">5.0dp</dimen>
+    <dimen name="ring_width">5.0dp</dimen>
 </resources>

+ 1 - 0
lib/src/main/res/values-mdpi-1920x1080/dimens.xml

@@ -707,4 +707,5 @@
     <dimen name="video_bottom_padding">75.0dp</dimen>
 
     <dimen name="video_bottom_text_margin">7.5dp</dimen>
+    <dimen name="ring_width">7.5dp</dimen>
 </resources>

+ 1 - 0
lib/src/main/res/values-xhdpi/dimens.xml

@@ -707,4 +707,5 @@
     <dimen name="video_bottom_padding">37.5dp</dimen>
 
     <dimen name="video_bottom_text_margin">3.75dp</dimen>
+    <dimen name="ring_width">3.75dp</dimen>
 </resources>

+ 1 - 0
lib/src/main/res/values-xxhdpi/dimens.xml

@@ -707,4 +707,5 @@
     <dimen name="video_bottom_padding">25.0dp</dimen>
 
     <dimen name="video_bottom_text_margin">2.5dp</dimen>
+    <dimen name="ring_width">2.5dp</dimen>
 </resources>

+ 1 - 0
lib/src/main/res/values-xxxhdpi/dimens.xml

@@ -707,4 +707,5 @@
     <dimen name="video_bottom_padding">18.75dp</dimen>
 
     <dimen name="video_bottom_text_margin">1.875dp</dimen>
+    <dimen name="ring_width">1.875dp</dimen>
 </resources>

+ 15 - 0
model/src/main/java/com/hc/request/Config.java

@@ -40,6 +40,11 @@ public final class Config {
          * 删除观看历史,我的收藏
          */
         public static final String COLLECT_CANCEL = BASE + "/index.php?m=Home&c=TvApi&a=delWatchCollectLog";
+
+        /**
+         * 更新支付状态
+         */
+        public static final String NOTIFY_PAY = BASE + "/index.php?m=Home&c=TvApi&a=OnNotify";
     }
 
     /**
@@ -60,6 +65,16 @@ public final class Config {
          * 请求为{@link URL#COLLECT}时,对应值为{@link VALUES#COLLECT_TYPE_COLLECTION}和{@link VALUES#COLLECT_TYPE_HISTORY}
          */
         public static final String TYPE = "type";
+
+        /**
+         * 订单号
+         */
+        public static final String ORDER_NUM = "orderNum";
+
+        /**
+         * 计费结果状态
+         */
+        public static final String STATUS= "status";
     }
 
     /**

+ 3 - 0
model/src/main/java/com/hc/request/core/CallServer.java

@@ -1,6 +1,7 @@
 package com.hc.request.core;
 
 import android.support.annotation.NonNull;
+import android.util.Log;
 
 import com.yanzhenjie.nohttp.NoHttp;
 import com.yanzhenjie.nohttp.rest.OnResponseListener;
@@ -59,6 +60,8 @@ public class CallServer {
                     return;
                 }
                 T result = response.get();
+                Log.d("SXGD","response get:" + response.get());
+                Log.d("SXGD","response:" + response.toString());
                 if (result == null) {
                     callback.onFail(what, "返回数据为空");
                     return;

+ 39 - 0
model/src/main/java/com/hc/request/core/parse/FastGetRequest.java

@@ -0,0 +1,39 @@
+package com.hc.request.core.parse;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.hc.model.BaseResponse;
+import com.yanzhenjie.nohttp.Headers;
+import com.yanzhenjie.nohttp.RequestMethod;
+import com.yanzhenjie.nohttp.rest.Request;
+import com.yanzhenjie.nohttp.rest.StringRequest;
+
+import java.lang.reflect.Type;
+
+/**
+ * @author Jewel
+ * @version 1.0
+ * @since 2018/04/02
+ */
+public class FastGetRequest<T> extends Request<BaseResponse<T>> {
+
+    private Class<T> clz;
+    private final Type type ;
+
+    public FastGetRequest(String url, Class<T> clz) {
+        this(url, RequestMethod.GET, clz);
+    }
+
+    public FastGetRequest(String url, RequestMethod requestMethod, Class<T> clz) {
+        super(url, requestMethod);
+        setAccept(Headers.HEAD_VALUE_CONTENT_TYPE_URLENCODED);
+        type = new TypeReference<BaseResponse<T>>(clz){}.getType();
+    }
+
+
+    @Override
+    public BaseResponse<T> parseResponse(Headers responseHeaders, byte[] responseBody) {
+        String result = StringRequest.parseResponseString(responseHeaders, responseBody);
+        return JSON.parseObject(result, type);
+    }
+}

+ 1 - 0
model/src/main/java/com/hc/request/core/parse/FastJsonRequest.java

@@ -30,6 +30,7 @@ public class FastJsonRequest<T> extends Request<BaseResponse<T>> {
         type = new TypeReference<BaseResponse<T>>(clz){}.getType();
     }
 
+
     @Override
     public BaseResponse<T> parseResponse(Headers responseHeaders, byte[] responseBody) {
         String result = StringRequest.parseResponseString(responseHeaders, responseBody);

+ 1 - 1
model/src/main/java/com/hc/viewmodel/SingleLiveEvent.java

@@ -28,7 +28,7 @@ public class SingleLiveEvent<T> extends MutableLiveData<T> {
     @Override
     public void observe(@NonNull LifecycleOwner owner, @NonNull final Observer<T> observer) {
         if (hasActiveObservers()) {
-            Log.w(TAG, "Multiple observers registered but only one will be notified of changes.");
+            //Log.w(TAG, "Multiple observers registered but only one will be notified of changes.");
         }
         super.observe(owner, new Observer<T>() {
                     @Override