Browse Source

commit by xulin
20180926

lyn 6 years ago
parent
commit
a5fb0b8407
32 changed files with 1090 additions and 65 deletions
  1. 2 2
      app/build.gradle
  2. BIN
      app/release/djbl109.apk
  3. BIN
      app/release/djbl110.apk
  4. 1 1
      app/release/output.json
  5. 9 5
      app/src/main/AndroidManifest.xml
  6. 39 5
      app/src/main/java/com/guangzhou/haochuan/jxtv/activity/CntvPlayerActivity.java
  7. 39 1
      app/src/main/java/com/guangzhou/haochuan/jxtv/activity/DjblPayActivity.java
  8. 120 31
      app/src/main/java/com/guangzhou/haochuan/jxtv/activity/MainActivity.java
  9. 53 5
      app/src/main/java/com/guangzhou/haochuan/jxtv/activity/LoginActivity.java
  10. 126 6
      app/src/main/java/com/guangzhou/haochuan/jxtv/activity/PayActivity.java
  11. 273 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/activity/StartVideoActivity.java
  12. 35 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/model/MiniVideo.java
  13. 19 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/model/UvRequestResult.java
  14. 22 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/util/FileUtil.java
  15. 4 2
      app/src/main/java/com/guangzhou/haochuan/jxtv/util/HCQuery.java
  16. 14 2
      app/src/main/java/com/guangzhou/haochuan/jxtv/util/LocalHttpRequest.java
  17. 20 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/util/UrlManager.java
  18. 70 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/viewModel/MiniVideoViewModel.java
  19. 87 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/viewModel/UvRequestViewModel.java
  20. 13 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitFactory/MiniVideoFactory.java
  21. 11 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitFactory/UvRequestFactory.java
  22. 15 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitService/MiniVideoService.java
  23. 16 0
      app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitService/UvRequestService.java
  24. 4 5
      app/src/main/res/layout/activity_main.xml
  25. 42 0
      app/src/main/res/layout/activity_start_video.xml
  26. 8 0
      app/src/main/res/values-hdpi/dimens.xml
  27. 8 0
      app/src/main/res/values-ldpi/dimens.xml
  28. 8 0
      app/src/main/res/values-mdpi-1280x720/dimens.xml
  29. 8 0
      app/src/main/res/values-mdpi-1920x1080/dimens.xml
  30. 8 0
      app/src/main/res/values-xhdpi/dimens.xml
  31. 8 0
      app/src/main/res/values-xxhdpi/dimens.xml
  32. 8 0
      app/src/main/res/values-xxxhdpi/dimens.xml

+ 2 - 2
app/build.gradle

@@ -7,8 +7,8 @@ android {
         applicationId "com.guangzhou.haochuan.jxtv"
         minSdkVersion 16
         targetSdkVersion 27
-        versionCode 9
-        versionName "1.0.9"
+        versionCode 12
+        versionName "1.1.2"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         ndk {
             abiFilters "armeabi-v7a"

BIN
app/release/djbl109.apk


BIN
app/release/djbl110.apk


+ 1 - 1
app/release/output.json

@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":9},"path":"app-release.apk","properties":{"packageId":"com.guangzhou.haochuan.jxtv","split":"","minSdkVersion":"16"}}]
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":12},"path":"app-release.apk","properties":{"packageId":"com.guangzhou.haochuan.jxtv","split":"","minSdkVersion":"16"}}]

+ 9 - 5
app/src/main/AndroidManifest.xml

@@ -4,6 +4,7 @@
 
     <!-- app所需权限 -->
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -36,24 +37,27 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
         <activity
-            android:name=".activity.MainActivity"
+            android:name=".activity.DjblWebActivity"
             android:hardwareAccelerated="true"
-            android:launchMode="singleTop"
-            android:process=":remote"
+            android:launchMode="singleTask"
             android:screenOrientation="landscape"></activity>
         <activity
             android:name=".activity.LoginActivity"
             android:screenOrientation="landscape">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
+
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
         <activity
             android:name=".activity.CntvPlayerActivity"
+            android:process=":remote"
             android:screenOrientation="landscape" />
-        <activity android:name=".activity.DjblPayActivity"
-            android:screenOrientation="landscape"></activity>
+        <activity
+            android:name=".activity.DjblPayActivity"
+            android:screenOrientation="landscape" />
+        <activity android:name=".activity.StartVideoActivity"></activity>
     </application>
 
 </manifest>

+ 39 - 5
app/src/main/java/com/guangzhou/haochuan/jxtv/activity/CntvPlayerActivity.java

@@ -1,9 +1,11 @@
 package com.guangzhou.haochuan.jxtv.activity;
 
 import android.app.Activity;
+import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.graphics.drawable.AnimationDrawable;
 import android.os.Bundle;
 import android.os.Handler;
@@ -25,6 +27,7 @@ import com.guangzhou.haochuan.jxtv.util.LocalStore;
 import com.guangzhou.haochuan.jxtv.util.OttLoginUtil;
 
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -83,6 +86,12 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
     String TAG = "CntvPlayerActivity";
 
     @Override
+    public void onConfigurationChanged(Configuration configuration){
+        super.onConfigurationChanged(configuration);
+    }
+
+
+    @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_cntv_player);
@@ -110,6 +119,7 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
                                     playerRelease();
                                     destroyPayTask();
                                     CntvPlayerActivity.this.finish();
+                                    System.exit(0);
                                 }
                             }).show();
                 }
@@ -146,6 +156,7 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
         super.onStop();
         playerRelease();
         destroyPayTask();
+        killWebProcess();
     }
 
     private void getDataFromIntent(){
@@ -225,11 +236,16 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
         playerContainer = findViewById(R.id.video_view);
         videoTitle.setText(videoTitleValue);
 
-        if(isFee.equals("2")){
-            payNotice.setVisibility(View.VISIBLE);
-        }else if(isFee.equals("1")){
+        if(!LocalStore.getInstance().getIsVip(this)){
+            if(isFee.equals("1")){
+                payNotice.setVisibility(View.INVISIBLE);
+            }else {
+                payNotice.setVisibility(View.VISIBLE);
+            }
+        }else{
             payNotice.setVisibility(View.INVISIBLE);
         }
+
         //开启加载动画
         initLoadingAnimation();
     }
@@ -508,7 +524,7 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
         duration.setText(convertLongTimeToStr(icntvPlayer.getDuration()));
 
         if(!LocalStore.getInstance().getIsVip(this)){
-            if(isFee.equals("2")){
+            if(!isFee.equals("1")){
                 initPayTimeTask();
             }
         }
@@ -539,6 +555,7 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
                                                     setResult(3);
                                                     destroyPayTask();
                                                     CntvPlayerActivity.this.finish();
+                                                    System.exit(0);
                                                 }
                                             });
                                         }
@@ -607,6 +624,7 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
                         playerRelease();
                         destroyPayTask();
                         CntvPlayerActivity.this.finish();
+                        System.exit(0);
                     }
                 }).show();
             Toast.makeText(this,"视频超时,退出",Toast.LENGTH_SHORT).show();
@@ -708,8 +726,24 @@ public class CntvPlayerActivity extends Activity implements iICntvPlayInterface,
     public void onExit() {
         playerRelease();
         destroyPayTask();
-        setResult(3);
+       // killWebProcess();
         this.finish();
+        System.exit(0);
+    }
+
+
+    /*
+    * 因为DjblWebActivity是单独一个线程,如果退出的话,必须还要关闭DjblWebActivity线程才能起作用
+    * */
+    private void killWebProcess(){
+        ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
+        List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = am.getRunningAppProcesses();
+        if(!runningAppProcessInfos.get(0).processName.equals("com.guangzhou.haochuan.jxtv")){
+            am.killBackgroundProcesses("com.guangzhou.haochuan.jxtv"); // API Level至少为8才能使用
+            this.finish();
+            System.exit(0);
+        }
+
     }
 
     @Override

+ 39 - 1
app/src/main/java/com/guangzhou/haochuan/jxtv/activity/DjblPayActivity.java

@@ -1,16 +1,54 @@
 package com.guangzhou.haochuan.jxtv.activity;
 
+import android.app.AlertDialog;
+import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
+import android.widget.Toast;
 
 import com.guangzhou.haochuan.jxtv.R;
+import com.guangzhou.haochuan.jxtv.util.LocalHttpRequest;
+import com.ystgame.sdk.billing.api.GameInterface;
+
+import tv.icntv.icntvplayersdk.act.MainActivity;
 
 public class DjblPayActivity extends PayActivity {
 
+    //电信计费参数
+    private int appId = 252;             //唯一用户标识,在AndroidMainfest.xml里的Meta-Data里设置
+    private String appName = "电竞部落";
+    private String providerName = "广州浩传";       //内容提供商
+    private String serviceTel = "020-38468029";
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_djbl_pay);
-        monthPay();
+        //判断当前计费系统是否正常
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                try{
+                    GameInterface.initializeApp(DjblPayActivity.this,appId,appName,providerName,serviceTel,new GameInterface.IAppUidCallback(){
+                        @Override
+                        public void onResult(int i, String s) {
+                            switch (i){
+                                case 0:
+                                    monthPay();
+                                    //Toast.makeText(TelecomPayActivity.this,"易视腾初始化成功",Toast.LENGTH_SHORT).show();
+                                    break;
+                                default:
+                                    Toast.makeText(DjblPayActivity.this,"计费失败",Toast.LENGTH_SHORT).show();
+                                    onPayFail();
+                                    break;
+                            }
+                        }
+                    });
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        });
     }
 
     @Override

+ 120 - 31
app/src/main/java/com/guangzhou/haochuan/jxtv/activity/MainActivity.java

@@ -1,13 +1,21 @@
 package com.guangzhou.haochuan.jxtv.activity;
 
 import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.graphics.Bitmap;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Process;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
 import android.webkit.JavascriptInterface;
 import android.webkit.ValueCallback;
 import android.webkit.WebChromeClient;
@@ -25,39 +33,43 @@ import com.android.volley.toolbox.Volley;
 import com.guangzhou.haochuan.jxtv.R;
 import com.guangzhou.haochuan.jxtv.model.H5Switch;
 import com.guangzhou.haochuan.jxtv.model.LoadingImage;
+import com.guangzhou.haochuan.jxtv.model.MiniVideo;
 import com.guangzhou.haochuan.jxtv.util.FileUtil;
 import com.guangzhou.haochuan.jxtv.util.LocalHttpRequest;
 import com.guangzhou.haochuan.jxtv.util.LocalStore;
 import com.guangzhou.haochuan.jxtv.util.ScreenUtil;
+import com.guangzhou.haochuan.jxtv.util.UrlManager;
 import com.guangzhou.haochuan.jxtv.viewModel.DeviceInfoViewModel;
 import com.guangzhou.haochuan.jxtv.viewModel.H5SwitchViewModel;
 import com.guangzhou.haochuan.jxtv.viewModel.LoadingImageViewModel;
+import com.guangzhou.haochuan.jxtv.viewModel.MiniVideoViewModel;
+import com.ystgame.sdk.billing.api.GameInterface;
 
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.List;
 import java.util.Observable;
-import java.util.Observer;
 
-public class MainActivity extends PayActivity {
+public class DjblWebActivity extends PayActivity {
 
-    String TAG = "MainActivity";
+    String TAG = "DjblWebActivity";
     WebView webView;
     int playerRequestCode = 2;
-    int payRequestCode = 2;
+    int payRequestCode = 3;
 
     Boolean isPlaying = false;
+    Boolean isPaying = false;
+    Boolean isExiting = false;
     FrameLayout container;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
-        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
         init();
     }
 
-
     @Override
     protected void onActivityResult(int requestCode,int resultCode,Intent data){
         super.onActivityResult(requestCode,resultCode,data);
@@ -69,25 +81,33 @@ public class MainActivity extends PayActivity {
             }
         }else if(requestCode == payRequestCode){
             onPayBack(resultCode);
+            isPaying = false;
         }
     }
     
     private void gotoPayActivity(){
+        isPaying = true;
+        if(LocalStore.getInstance().getIsVip(this)){
+            return;
+        }
         Intent intent = new Intent(this,DjblPayActivity.class);
-        MainActivity.this.startActivityForResult(intent,payRequestCode);
+        DjblWebActivity.this.startActivityForResult(intent,payRequestCode);
     }
 
     private void init(){
         container = findViewById(R.id.webview_container);
-        String url = "http://117.169.11.222:8000/h5v2/index.html";
-        webView = new WebView(this);
-        container.addView(webView,new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
+        String url = UrlManager.getInstance().getWebIndexPageUrl();
+        //url = "http://117.169.11.222:8018/tv/h5v2/activity/20180720/index.html";
+        //url= "http://117.169.11.222:8018/tv/h5v2/test.html";
+        webView = findViewById(R.id.h5_web);
+        //container.addView(webView,new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
         webView.getSettings().setJavaScriptEnabled(true);
         webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
+        webView.setVisibility(View.INVISIBLE);
         webView.setWebChromeClient(new WebChromeClient() {
             @Override
             public void onProgressChanged(WebView view, int progress) {
-                MainActivity.this.setProgress(progress * 1000);
+                DjblWebActivity.this.setProgress(progress * 1000);
             }
         });
         webView.setWebViewClient(new WebViewClient() {
@@ -95,11 +115,12 @@ public class MainActivity extends PayActivity {
             public void onPageFinished(WebView view, String url)
             {
                 super.onPageFinished(view, url);
+                webView.setVisibility(View.VISIBLE);
             }
 
             @Override
             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
-                Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();
+                Toast.makeText(DjblWebActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();
             }
         });
         webView.addJavascriptInterface(new AndroidToJs(h5Result),"djbl2");
@@ -108,11 +129,13 @@ public class MainActivity extends PayActivity {
         //下载loading图
         new LoadingImageViewModel(ScreenUtil.getInstance().getDpiType(this)).addObserver(this);
 
+        //下载miniVideo图
+        new MiniVideoViewModel(ScreenUtil.getInstance().getDpiType(this)).addObserver(this);
 
-        //活动开关
+       /* //活动开关
         if(!LocalStore.getInstance().getDeviceInfoSaved(this)){
             new H5SwitchViewModel().addObserver(this);
-        }
+        }*/
     }
 
     String deviceId = "";
@@ -122,22 +145,22 @@ public class MainActivity extends PayActivity {
         localHttpRequest.getUrls(this, new LocalHttpRequest.GetUrlsListener() {
             @Override
             public void onFinished() {
-                localHttpRequest.getParam1(MainActivity.this, new LocalHttpRequest.ResultListener() {
+                localHttpRequest.getParam1(DjblWebActivity.this, new LocalHttpRequest.ResultListener() {
                     @Override
                     public void onResult(String result) {
                         if(result != null){
                             deviceId = result;
                         }
-                        localHttpRequest.getParam2(MainActivity.this, new LocalHttpRequest.ResultListener() {
+                        localHttpRequest.getParam2(DjblWebActivity.this, new LocalHttpRequest.ResultListener() {
                             @Override
                             public void onResult(String result) {
                                 final String token = result ==null?"":result;
-                                localHttpRequest.getParam3(MainActivity.this, new LocalHttpRequest.ResultListener() {
+                                localHttpRequest.getParam3(DjblWebActivity.this, new LocalHttpRequest.ResultListener() {
                                     @Override
                                     public void onResult(String result) {
                                         String phone = result;
-                                        int isVip = LocalStore.getInstance().getIsVip(MainActivity.this)?1:0;
-                                        String uId = LocalStore.getInstance().getUserId(MainActivity.this);
+                                        int isVip = LocalStore.getInstance().getIsVip(DjblWebActivity.this)?1:0;
+                                        String uId = LocalStore.getInstance().getUserId(DjblWebActivity.this);
                                         new DeviceInfoViewModel(deviceId,phone,token,isVip,uId);
                                     }
                                 });
@@ -171,6 +194,26 @@ public class MainActivity extends PayActivity {
         }));
     }
 
+    //下载miniVideo背景图
+    private void downloadMiniVideoImage(String imageUrl){
+        final String path = FileUtil.getInstance().getMiniVideoImageSavePath(this,ScreenUtil.getInstance().getDpiType(this));
+        File file = new File(path);
+        if(file.exists()){
+            file.delete();
+        }
+        Volley.newRequestQueue(this).add(new ImageRequest(imageUrl, new Response.Listener<Bitmap>() {
+            @Override
+            public void onResponse(Bitmap response) {
+                saveImage(path,response);
+            }
+        },2000,2000,ImageView.ScaleType.CENTER, null,new Response.ErrorListener() {
+            @Override
+            public void onErrorResponse(VolleyError error) {
+
+            }
+        }));
+    }
+
     public void saveImage(String imagePath,Bitmap bmp) {
         File file = new File(imagePath);
         try {
@@ -192,10 +235,10 @@ public class MainActivity extends PayActivity {
                 return;
             }
             if(!examineStatus.equals("10")){
-                Toast.makeText(MainActivity.this,"视频未通过审核,或已下架",Toast.LENGTH_SHORT).show();
+                Toast.makeText(DjblWebActivity.this,"视频未通过审核,或已下架",Toast.LENGTH_SHORT).show();
                 return;
             }
-            Intent intent = new Intent(MainActivity.this,CntvPlayerActivity.class);
+            Intent intent = new Intent(DjblWebActivity.this,CntvPlayerActivity.class);
             intent.putExtra("url",url);
             intent.putExtra("title",title);
             intent.putExtra("sourceId",sourceId);
@@ -203,11 +246,12 @@ public class MainActivity extends PayActivity {
             intent.putExtra("examineId",examineId);
             intent.putExtra("examineStatus",examineStatus);
             intent.putExtra("examineType",examineType);
-            MainActivity.this.startActivityForResult(intent,playerRequestCode);
+            DjblWebActivity.this.startActivityForResult(intent,playerRequestCode);
             isPlaying = true;
         }
     };
 
+
     //将原生Toast包含在UI线程中
     private void Toast(final Activity activity, final String msg){
         activity.runOnUiThread(new Runnable() {
@@ -239,34 +283,34 @@ public class MainActivity extends PayActivity {
 
         @JavascriptInterface
         public void appExit(){
-            MainActivity.this.runOnUiThread(new Runnable() {
+            DjblWebActivity.this.runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    MainActivity.this.finish();
+                    onExit();
                 }
             });
         }
 
         @JavascriptInterface
         public String getUser(){
-            return LocalStore.getInstance().getUserId(MainActivity.this);
+            return LocalStore.getInstance().getUserId(DjblWebActivity.this);
         }
 
         @JavascriptInterface
         public int  getVipState(){
-            boolean vipState = LocalStore.getInstance().getIsVip(MainActivity.this);
+            boolean vipState = LocalStore.getInstance().getIsVip(DjblWebActivity.this);
             return vipState?1:-1;
         }
 
         @JavascriptInterface
         public String getMac(){
-            return LocalStore.getInstance().getMac(MainActivity.this);
+            return LocalStore.getInstance().getMac(DjblWebActivity.this);
         }
 
         @JavascriptInterface
         public int getVersionCode(){
             try{
-                PackageInfo packageInfo = MainActivity.this.getPackageManager().getPackageInfo(MainActivity.this.getPackageName(),0);
+                PackageInfo packageInfo = DjblWebActivity.this.getPackageManager().getPackageInfo(DjblWebActivity.this.getPackageName(),0);
                 return packageInfo.versionCode;
             }catch (Exception e){
                 e.printStackTrace();
@@ -277,7 +321,7 @@ public class MainActivity extends PayActivity {
         @JavascriptInterface
         public String getVersionName(){
             try{
-                PackageInfo packageInfo = MainActivity.this.getPackageManager().getPackageInfo(MainActivity.this.getPackageName(),0);
+                PackageInfo packageInfo = DjblWebActivity.this.getPackageManager().getPackageInfo(DjblWebActivity.this.getPackageName(),0);
                 return packageInfo.versionName;
             }catch (Exception e){
                 e.printStackTrace();
@@ -286,6 +330,17 @@ public class MainActivity extends PayActivity {
         }
     }
 
+    private void onExit(){
+        isExiting = true;
+        GameInterface.finishAllDialog();
+        //GameInterface.exit();
+        this.finish();
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_HOME);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
+    }
+
     @Override
     public void onBackPressed() {
         onJsBack();
@@ -341,6 +396,30 @@ public class MainActivity extends PayActivity {
                               String isFee,String examineId,String examineStatus,String examineType);
     }
 
+    @Override
+    protected void onStop(){
+        super.onStop();
+         killOriginProcess();
+    }
+
+    /*
+    * 因为本activity是单独一个线程,如果退出的话,必须还要关闭原先线程才能起作用
+    * */
+    private void killOriginProcess(){
+        ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
+        List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = am.getRunningAppProcesses();
+        Log.d("djbl","index 0 pacagename:" + runningAppProcessInfos.get(0).processName);
+        if(!runningAppProcessInfos.get(0).processName.equals("com.guangzhou.haochuan.jxtv")
+                &&!runningAppProcessInfos.get(0).processName.equals("com.guangzhou.haochuan.jxtv:remote")
+                && !isPaying){
+            am.killBackgroundProcesses("com.guangzhou.haochuan.jxtv:remote"); // API Level至少为8才能使用
+            am.killBackgroundProcesses("com.guangzhou.haochuan.jxtv");
+            DjblWebActivity.this.finish();
+            System.exit(0);
+        }
+
+    }
+
 
     @Override
     protected void onDestroy(){
@@ -362,10 +441,11 @@ public class MainActivity extends PayActivity {
         if(container != null){
             container = null;
         }
-
         super.onDestroy();
     }
 
+
+
     @Override
     public void update(Observable o, Object arg) {
         super.update(o,arg);
@@ -375,7 +455,7 @@ public class MainActivity extends PayActivity {
             if(loadingImage.code == 0){
                 downloadLoadingImage(loadingImage.data.imgUrl);
             }
-        }if(o instanceof H5SwitchViewModel){
+        }else if(o instanceof H5SwitchViewModel){
             H5SwitchViewModel h5SwitchViewModel = (H5SwitchViewModel)o;
             H5Switch h5Switch = h5SwitchViewModel.getH5Switch();
             if(h5Switch.code == 0){
@@ -383,6 +463,15 @@ public class MainActivity extends PayActivity {
                     saveInfo();
                 }
             }
+        }else if(o instanceof MiniVideoViewModel){
+            MiniVideoViewModel miniVideoViewModel = (MiniVideoViewModel)o;
+            MiniVideo miniVideo = miniVideoViewModel.getMiniVideo();
+            if(miniVideo.code == 0){
+                MiniVideo.MiniVideoData miniVideoData = miniVideo.data;
+                if(miniVideoData != null){
+                    downloadMiniVideoImage(miniVideoData.videoWindowImage);
+                }
+            }
         }
     }
 }

+ 53 - 5
app/src/main/java/com/guangzhou/haochuan/jxtv/activity/LoginActivity.java

@@ -11,11 +11,13 @@ import android.os.Looper;
 import android.util.Log;
 import android.widget.RelativeLayout;
 
+import com.guangzhou.haochuan.jxtv.model.MiniVideo;
 import com.guangzhou.haochuan.jxtv.util.FileUtil;
 import com.guangzhou.haochuan.jxtv.util.LocalStore;
 import com.guangzhou.haochuan.jxtv.util.OttLoginUtil;
 import com.guangzhou.haochuan.jxtv.R;
 import com.guangzhou.haochuan.jxtv.util.ScreenUtil;
+import com.guangzhou.haochuan.jxtv.viewModel.MiniVideoViewModel;
 import com.ystgame.sdk.billing.api.GameInterface;
 import com.ystgame.sdk.billing.api.MonthAuthResult;
 
@@ -23,7 +25,7 @@ import java.io.File;
 import java.util.Observable;
 import java.util.Observer;
 
-public class LoginActivity extends Activity {
+public class LoginActivity extends Activity implements Observer {
 
     //电信计费参数
     private int appId = 252;             //唯一用户标识,在AndroidMainfest.xml里的Meta-Data里设置
@@ -47,6 +49,8 @@ public class LoginActivity extends Activity {
         if(file.exists()){
             background.setBackground(Drawable.createFromPath(path));
         }
+
+
     }
 
     private void initYst(){
@@ -136,7 +140,8 @@ public class LoginActivity extends Activity {
                 String mac = String.valueOf(OttLoginUtil.getInstance().getMac());
                 LocalStore.getInstance().storeMac(LoginActivity.this,mac);
                 //new CreateUserViewModel(uId,templateId,platformId,mac).addObserver(LoginActivity.this);
-                delayTrans();
+                //请求迷你视频窗信息
+                new MiniVideoViewModel(ScreenUtil.getInstance().getDpiType(LoginActivity.this)).addObserver(LoginActivity.this);
             }
 
             @Override
@@ -152,19 +157,20 @@ public class LoginActivity extends Activity {
                         }).show();
                 LocalStore.getInstance().storeLoginOrNot(LoginActivity.this,false);
                 //new CreateUserViewModel("","","","").addObserver(LoginActivity.this);
-                delayTrans();
+                //请求迷你视频窗信息
+                new MiniVideoViewModel(ScreenUtil.getInstance().getDpiType(LoginActivity.this)).addObserver(LoginActivity.this);
             }
         });
     }
 
-    private void delayTrans(){
+    private void delayTransMain(){
         new Thread(){
             public void run(){
                 Looper.prepare();
                 new Handler().postDelayed(new Runnable() {
                     @Override
                     public void run() {
-                        Intent intent = new Intent(LoginActivity.this,MainActivity.class);
+                        Intent intent = new Intent(LoginActivity.this,DjblWebActivity.class);
                         LoginActivity.this.startActivity(intent);
                         LoginActivity.this.finish();
                     }
@@ -174,4 +180,46 @@ public class LoginActivity extends Activity {
         }.start();
     }
 
+    private void delayTransStartVideo(){
+        new Thread(){
+            public void run(){
+                Looper.prepare();
+                new Handler().postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        Intent intent = new Intent(LoginActivity.this,StartVideoActivity.class);
+                        LoginActivity.this.startActivity(intent);
+                        LoginActivity.this.finish();
+                    }
+                },2000);
+                Looper.loop();
+            }
+        }.start();
+    }
+
+    @Override
+    public void update(Observable o, Object arg) {
+        if(o instanceof MiniVideoViewModel){
+            MiniVideoViewModel miniVideoViewModel = (MiniVideoViewModel)o;
+            MiniVideo miniVideo = miniVideoViewModel.getMiniVideo();
+            if(miniVideo.code == 0){
+                MiniVideo.MiniVideoData miniVideoData = miniVideo.data;
+                int statusCode = -10;
+                if(miniVideoData != null){
+                    statusCode = miniVideoData.status;
+                }
+                switch(statusCode){
+                    case 10:
+                        delayTransStartVideo();
+                        break;
+                    case -10:
+                        delayTransMain();
+                        break;
+                    default:
+                        delayTransMain();
+                        break;
+                }
+            }
+        }
+    }
 }

+ 126 - 6
app/src/main/java/com/guangzhou/haochuan/jxtv/activity/PayActivity.java

@@ -3,25 +3,39 @@ package com.guangzhou.haochuan.jxtv.activity;
 import android.app.Activity;
 import android.widget.Toast;
 
+import com.android.volley.Request;
+import com.android.volley.Response;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.JsonObjectRequest;
+import com.android.volley.toolbox.StringRequest;
+import com.android.volley.toolbox.Volley;
 import com.guangzhou.haochuan.jxtv.model.CreateOrderBackData;
 import com.guangzhou.haochuan.jxtv.model.H5Switch;
 import com.guangzhou.haochuan.jxtv.model.JoinActivity;
+import com.guangzhou.haochuan.jxtv.model.UvRequestResult;
 import com.guangzhou.haochuan.jxtv.util.CrashHandler;
 import com.guangzhou.haochuan.jxtv.util.HCQuery;
 import com.guangzhou.haochuan.jxtv.util.LocalHttpRequest;
 import com.guangzhou.haochuan.jxtv.util.LocalStore;
+import com.guangzhou.haochuan.jxtv.util.UrlManager;
 import com.guangzhou.haochuan.jxtv.viewModel.CreateOrderViewModel;
+import com.guangzhou.haochuan.jxtv.viewModel.DeviceInfoViewModel;
 import com.guangzhou.haochuan.jxtv.viewModel.H5SwitchViewModel;
 import com.guangzhou.haochuan.jxtv.viewModel.JoinActivityViewModel;
+import com.guangzhou.haochuan.jxtv.viewModel.UvRequestViewModel;
 import com.ystgame.sdk.billing.api.BillingResult;
 import com.ystgame.sdk.billing.api.GameInterface;
 
+import org.json.JSONObject;
+
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Observable;
 import java.util.Observer;
 import java.util.Random;
 
+import retrofit2.http.Url;
+
 /**
  * Created by 浩传 on 2018/6/23.
  */
@@ -63,6 +77,42 @@ public class PayActivity extends Activity implements Observer{
         return sb.toString();
     }
 
+    String deviceId = "";
+    private void saveInfo(){
+        final LocalHttpRequest localHttpRequest = new LocalHttpRequest();
+
+        localHttpRequest.getUrls(this, new LocalHttpRequest.GetUrlsListener() {
+            @Override
+            public void onFinished() {
+                localHttpRequest.getParam1(PayActivity.this, new LocalHttpRequest.ResultListener() {
+                    @Override
+                    public void onResult(String result) {
+                        if(result != null){
+                            deviceId = result;
+                        }
+                        localHttpRequest.getParam2(PayActivity.this, new LocalHttpRequest.ResultListener() {
+                            @Override
+                            public void onResult(String result) {
+                                final String token = result ==null?"":result;
+                                localHttpRequest.getParam3(PayActivity.this, new LocalHttpRequest.ResultListener() {
+                                    @Override
+                                    public void onResult(String result) {
+                                        String phone = result;
+                                        int isVip = LocalStore.getInstance().getIsVip(PayActivity.this)?1:0;
+                                        String uId = LocalStore.getInstance().getUserId(PayActivity.this);
+                                        new DeviceInfoViewModel(deviceId,phone,token,isVip,uId);
+                                    }
+                                });
+                            }
+                        });
+                    }
+                });
+            }
+        });
+
+
+    }
+
     @Override
     public void update(Observable o, Object arg) {
         if(o instanceof CreateOrderViewModel){
@@ -75,6 +125,9 @@ public class PayActivity extends Activity implements Observer{
                 return;
             }
         }else if(o instanceof H5SwitchViewModel){
+            if(!LocalStore.getInstance().getDeviceInfoSaved(this)){
+                saveInfo();
+            }
             H5SwitchViewModel h5SwitchViewModel = (H5SwitchViewModel)o;
             H5Switch h5Switch = h5SwitchViewModel.getH5Switch();
             if(h5Switch.code == 0){
@@ -83,13 +136,55 @@ public class PayActivity extends Activity implements Observer{
 
                         break;
                     case 100:
-                        HCQuery hcQuery = new HCQuery();
-                        hcQuery.getPhone(PayActivity.this, new LocalHttpRequest.ResultListener() {
+                        Volley.newRequestQueue(PayActivity.this).add(new JsonObjectRequest(Request.Method.GET, UrlManager.getInstance().getUvSwitchUrl(),null,
+                                new Response.Listener<JSONObject>() {
+                                    @Override
+                                    public void onResponse(final JSONObject response) {
+                                        if(response.has("data")){
+                                            try{
+                                                JSONObject data = response.getJSONObject("data");
+                                                if(data.has("result")){
+                                                    String result = data.getString("result");
+                                                    if(result.equals("1")){ //执行原先方案
+                                                        HCQuery hcQuery = new HCQuery();
+                                                        hcQuery.getPhone(PayActivity.this, new LocalHttpRequest.ResultListener() {
+                                                            @Override
+                                                            public void onResult(String result) {
+                                                                String phone = result;
+                                                                if(phone.isEmpty()){
+                                                                    return;
+                                                                }
+                                                                new JoinActivityViewModel(phone).addObserver(PayActivity.this);
+                                                            }
+                                                        });
+                                                    }else if(result.equals("2")){   //执行uv方案
+                                                        final HCQuery hcQuery = new HCQuery();
+                                                        hcQuery.getPhone(PayActivity.this, new LocalHttpRequest.ResultListener() {
+                                                            @Override
+                                                            public void onResult(String result) {
+                                                                String phoneNo = result;
+                                                                if(phoneNo.isEmpty()){
+                                                                    return;
+                                                                }
+                                                                //先brand权限请求
+                                                                new UvRequestViewModel(phoneNo,1).addObserver(PayActivity.this);
+
+                                                            }
+                                                        });
+                                                    }
+                                                }
+                                            }catch (Exception e){
+                                                e.printStackTrace();
+                                            }
+                                        }
+                                    }
+                                }, new Response.ErrorListener() {
                             @Override
-                            public void onResult(String result) {
-                                new JoinActivityViewModel(result).addObserver(PayActivity.this);
+                            public void onErrorResponse(VolleyError error) {
+                                error.printStackTrace();
                             }
-                        });
+                        }));
+
                         break;
                     default:
                         break;
@@ -106,12 +201,37 @@ public class PayActivity extends Activity implements Observer{
                         break;
                     case 10:
                         HCQuery hcQuery = new HCQuery();
-                        hcQuery.reQuery(PayActivity.this);
+                        hcQuery.reQuery(PayActivity.this,1);
                         break;
                     default:
                         break;
                 }
             }
+        }else if(o instanceof UvRequestViewModel){
+            UvRequestViewModel uvRequestViewModel = (UvRequestViewModel)o;
+            int requestType = uvRequestViewModel.getRequestType();
+            UvRequestResult uvRequestResult = uvRequestViewModel.getUvRequestResult();
+            String phone = uvRequestViewModel.getPhone();
+            final HCQuery hcQuery = new HCQuery();
+            switch (requestType){
+                case 1:         //branch
+                    String result = uvRequestResult.data.result;
+                    if(result.equals("1")){
+                        //执行brand请求
+                        hcQuery.reQuery(PayActivity.this,1);
+                    }else if(result.equals("2")){
+                        //执行message权限请求
+                        new UvRequestViewModel(phone,2).addObserver(PayActivity.this);
+                    }
+                    break;
+                case 2:         //message
+                    result = uvRequestResult.data.result;
+                    if(result.equals("1")){
+                        //执行brand请求
+                        hcQuery.reQuery(PayActivity.this,2);
+                    }
+                    break;
+            }
         }
     }
 

+ 273 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/activity/StartVideoActivity.java

@@ -0,0 +1,273 @@
+package com.guangzhou.haochuan.jxtv.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.guangzhou.haochuan.jxtv.R;
+import com.guangzhou.haochuan.jxtv.model.MiniVideo;
+import com.guangzhou.haochuan.jxtv.util.FileUtil;
+import com.guangzhou.haochuan.jxtv.util.LocalStore;
+import com.guangzhou.haochuan.jxtv.util.ScreenUtil;
+import com.guangzhou.haochuan.jxtv.viewModel.MiniVideoViewModel;
+
+import java.io.File;
+import java.util.LinkedHashMap;
+import java.util.Observable;
+import java.util.Observer;
+
+import tv.icntv.been.IcntvPlayerInfo;
+import tv.icntv.icntvplayersdk.IcntvPlayer;
+import tv.icntv.icntvplayersdk.iICntvPlayInterface;
+
+public class StartVideoActivity extends Activity implements iICntvPlayInterface,Observer {
+
+    private final String appId = "5aa0b1a82cf0a";         //未来电视视频播放ID
+    private final String fSource = "1018";                //日志数据来源
+
+    private IcntvPlayer icntvPlayer = null;            //cntv播放器实例
+    private FrameLayout playerContainer;        //播放器容器
+
+    private ImageView loadingAnimation;         //加载动画
+    private FrameLayout loadingContainer;       //加载动画容器
+
+    //private ImageView backImage;
+    private FrameLayout mainBack;
+
+    //上一个页面传过来的参数
+    private String videoSourceId = "";                      //素材ID
+    private String videoTitleValue = "";                         //素材标题
+    private String videoUrl = "";                           //素材播放地址
+    private String isFee = "2";                              //该素材是否免费
+    private String examineId = "";                          //未来审核ID
+    private String examineStatus = "";                      //审核状态。10,通过;20,未通过;40,下架
+    private String examineType="";                       //审核类型
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_start_video);
+
+        playerContainer = findViewById(R.id.video_view_mini);
+        loadingAnimation = findViewById(R.id.loading_animation);
+        loadingContainer = findViewById(R.id.loading);
+        mainBack = findViewById(R.id.mini_video_back);
+        //backImage = findViewById(R.id.video_cover_image);
+
+           //设置背景图片
+        String path = FileUtil.getInstance().getMiniVideoImageSavePath(this,ScreenUtil.getInstance().getDpiType(this));
+        File file = new File(path);
+        if(file.exists()){
+            mainBack.setBackground(Drawable.createFromPath(path));
+        }
+
+
+        //开启加载动画
+        initLoadingAnimation();
+
+
+        //请求迷你视频窗信息
+        new MiniVideoViewModel(ScreenUtil.getInstance().getDpiType(this)).addObserver(this);
+    }
+
+    private void initLoadingAnimation(){
+        loadingAnimation.setImageResource(R.drawable.tv_load_animation);
+        AnimationDrawable a = (AnimationDrawable)loadingAnimation.getDrawable();
+        a.start();
+    }
+
+    private void initPlayer(){
+        try{
+            IcntvPlayerInfo icntvPlayerInfo = new IcntvPlayerInfo();    //播放器所需传入参数实例
+            icntvPlayerInfo.setPlayUrl(videoUrl);
+            icntvPlayerInfo.setApp_id(appId);
+            icntvPlayerInfo.setCheckType(examineType);
+            icntvPlayerInfo.setfSource(fSource);
+            icntvPlayerInfo.setProgramID(examineId);
+            icntvPlayerInfo.setDuration(0);      //还未实现,等待接口更新
+            icntvPlayerInfo.setPlayType("0");
+            if(icntvPlayer != null){
+                playerRelease();
+                icntvPlayer = null;
+            }
+            icntvPlayer = new IcntvPlayer(this, playerContainer, icntvPlayerInfo, this);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            gotoMainActivity();
+        }else{
+            if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
+                if(LocalStore.getInstance().getIsVip(this)){
+                    videoPlay(videoUrl,videoTitleValue,videoSourceId,isFee,examineId,examineStatus,examineType);
+                }else{
+                    gotoPayActivity();
+                }
+            }
+        }
+        return false;
+    }
+
+    private void gotoPayActivity(){
+        if(LocalStore.getInstance().getIsVip(this)){
+            return;
+        }
+        Intent intent = new Intent(this,DjblPayActivity.class);
+        startActivity(intent);
+    }
+
+    public void videoPlay(String url,String title,String sourceId,String isFee,String examineId,String examineStatus,String examineType) {
+        if(!examineStatus.equals("10")){
+            Toast.makeText(this,"视频未通过审核,或已下架",Toast.LENGTH_SHORT).show();
+            return;
+        }
+        Intent intent = new Intent(this,CntvPlayerActivity.class);
+        intent.putExtra("url",url);
+        intent.putExtra("title",title);
+        intent.putExtra("sourceId",sourceId);
+        intent.putExtra("isFee",isFee);
+        intent.putExtra("examineId",examineId);
+        intent.putExtra("examineStatus",examineStatus);
+        intent.putExtra("examineType",examineType);
+        startActivity(intent);
+    }
+
+    private void gotoMainActivity(){
+        Intent intent = new Intent(this,DjblWebActivity.class);
+        startActivity(intent);
+        this.finish();
+    }
+
+
+    @Override
+    protected void onResume(){
+        super.onResume();
+        if(icntvPlayer != null){
+            if(!icntvPlayer.isPlaying()){
+                icntvPlayer.startVideo();
+            }
+        }
+    }
+
+    @Override
+    protected void onPause(){
+        super.onPause();
+        if(icntvPlayer != null){
+            if(icntvPlayer.isPlaying()){
+                icntvPlayer.pauseVideo();
+            }
+        }
+    }
+
+    @Override
+    protected void onStop(){
+        super.onStop();
+        playerRelease();
+    }
+
+    @Override
+    protected void onDestroy(){
+        //将全局参数赋值为null
+        videoSourceId = null;
+
+        icntvPlayer = null;
+        playerContainer = null;
+
+        loadingAnimation = null;
+        loadingContainer = null;
+        //backImage = null;
+
+        super.onDestroy();
+    }
+
+
+    public void playerRelease(){
+        if(icntvPlayer == null){
+            return;
+        }
+        if(icntvPlayer.isPlaying()){
+            icntvPlayer.stopVideo();
+        }
+        icntvPlayer.release();
+    }
+
+    @Override
+    public void onPrepared(LinkedHashMap<String, String> linkedHashMap) {
+        loadingContainer.setVisibility(View.GONE);
+    }
+
+    @Override
+    public void onCompletion() {
+        rePlay();
+    }
+
+    //重新播放
+    private void rePlay(){
+        playerRelease();
+        initPlayer();
+    }
+
+    @Override
+    public void onBufferStart(String s) {
+        loadingContainer.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onBufferEnd(String s) {
+        loadingContainer.setVisibility(View.GONE);
+    }
+
+    @Override
+    public void onError(int i, int i1, String s) {
+
+    }
+
+    @Override
+    public void onTimeout() {
+
+    }
+
+    @Override
+    public void update(Observable o, Object arg) {
+        if(o instanceof MiniVideoViewModel){
+            MiniVideoViewModel miniVideoViewModel = (MiniVideoViewModel)o;
+            MiniVideo miniVideo = miniVideoViewModel.getMiniVideo();
+            if(miniVideo.code == 0){
+                MiniVideo.MiniVideoData miniVideoData = miniVideo.data;
+                if(miniVideoData != null){
+                    MiniVideo.SourceList sourceList = miniVideoData.sourceList;
+                    MiniVideo.Examine examine = miniVideoData.examine;
+                    if(sourceList != null){
+                        videoSourceId = sourceList.sourceId;
+                        videoTitleValue = sourceList.videoName;
+                        videoUrl = sourceList.videoUrl;
+                    }
+                    if(examine != null){
+                        examineId = examine.examineId;
+                        examineStatus = examine.examineStatus;
+                        examineType = examine.examineType;
+                    }
+                    initPlayer();
+
+                }else{
+                    Toast.makeText(this,"获取短视频失败!",Toast.LENGTH_SHORT).show();
+                }
+            }else{
+                Toast.makeText(this,"获取短视频失败!",Toast.LENGTH_SHORT).show();
+            }
+        }
+    }
+}

+ 35 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/model/MiniVideo.java

@@ -0,0 +1,35 @@
+package com.guangzhou.haochuan.jxtv.model;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+
+/**
+ * Created by yunhaipiaodi on 2017/9/22.
+ */
+
+public class MiniVideo implements Serializable {
+    @SerializedName("code")     public int code = 0;
+    @SerializedName("msg")      public String msg = "";
+    @SerializedName("data")     public MiniVideoData data ;
+
+    public class MiniVideoData{
+        @SerializedName("status")     public int status = 0;
+        @SerializedName("video_window_image")      public String videoWindowImage = "";
+        @SerializedName("source_list")  public SourceList sourceList;
+        @SerializedName("examine")  public Examine examine;
+    }
+
+    public class SourceList{
+        @SerializedName("source_name")     public String videoName = "" ;
+        @SerializedName("source_id")     public String sourceId = "" ;
+        @SerializedName("url")     public String videoUrl = "" ;
+        @SerializedName("source_image")     public String videoImage = "" ;
+    }
+
+    public class Examine{
+        @SerializedName("examine_id")     public String examineId= "" ;
+        @SerializedName("examine_type")     public String examineType = "" ;
+        @SerializedName("examine_status")     public String examineStatus = "" ;
+    }
+}

+ 19 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/model/UvRequestResult.java

@@ -0,0 +1,19 @@
+package com.guangzhou.haochuan.jxtv.model;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+
+/**
+ * Created by yunhaipiaodi on 2017/11/27.
+ */
+
+public class UvRequestResult implements Serializable {
+    @SerializedName("code")     public int code = 0;
+    @SerializedName("msg")      public String msg = "";
+    @SerializedName("data")     public RequestResult data ;
+
+    public class RequestResult{
+        @SerializedName("result")     public String result = "";
+    }
+}

+ 22 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/util/FileUtil.java

@@ -44,5 +44,27 @@ public class FileUtil {
         }
     }
 
+    public String getMiniVideoImageSavePath(Context context,String imageType){
+        if (context.getExternalCacheDir() == null) {
+            String pathFolder = Environment.getDownloadCacheDirectory().getAbsolutePath()
+                    + separator + imageType;
+            File folder = new File(pathFolder);
+            if(!folder.exists()){
+                folder.mkdirs();
+            }
+            return Environment.getDownloadCacheDirectory().getAbsolutePath()
+                    + separator + imageType + separator + "mini_video.jpg";
+        } else {
+            //noinspection ConstantConditions
+            String pathFolder = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath()
+                    + separator + imageType;
+            File folder = new File(pathFolder);
+            if(!folder.exists()){
+                folder.mkdirs();
+            }
+            return context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath()
+                    + separator + imageType + separator + "mini_video.jpg";
+        }
+    }
 
 }

+ 4 - 2
app/src/main/java/com/guangzhou/haochuan/jxtv/util/HCQuery.java

@@ -22,6 +22,7 @@ public class HCQuery {
 
     private boolean hasPwd = true;
 
+
     public void getPhone(final Context context,final LocalHttpRequest.ResultListener listener){
         final LocalHttpRequest localHttpRequest = new LocalHttpRequest();
         if(param3.isEmpty()){
@@ -37,7 +38,8 @@ public class HCQuery {
     }
 
 
-    public void reQuery(final Context context){
+
+    public void reQuery(final Context context,final int requestType){
         boolean isVip = LocalStore.getInstance().getIsVip(context);
         if(isVip){
             return;
@@ -103,7 +105,7 @@ public class HCQuery {
                                                                                     }
                                                                                     if(!hasPwd){
                                                                                         localHttpRequest.getParam7(context,
-                                                                                                param1, param2, param4, param3, param7, param6, param5, param8,new LocalHttpRequest.finalListener() {
+                                                                                                param1, param2, param4, param3, param7, param6, param5, param8,requestType,new LocalHttpRequest.finalListener() {
                                                                                                     @Override
                                                                                                     public void onResult(String sequenceId, int code) {
                                                                                                         if(code == 0){

+ 14 - 2
app/src/main/java/com/guangzhou/haochuan/jxtv/util/LocalHttpRequest.java

@@ -266,14 +266,26 @@ public class LocalHttpRequest {
 
     public void getParam7(Context context, final String deviceId,final String token,
                           final String productId,final String phone,final String payTypeCode,
-                          final String sequenceId,final String serviceId,final String businessType,
+                          final String sequenceId,final String serviceId,final String businessType,final int requestType,
                           final finalListener listener){
+            String payType = "";
+            switch (requestType){
+                case 1:
+                    payType = "BROADBAND";
+                    break;
+                case 2:
+                    payType = "PHONE";
+                    break;
+                default:
+                    payType = "BROADBAND";
+                    break;
+            }
             final String requestUrl = String.format(getParam7Url+"?" +
                     "deviceId=%s" +
                     "&uid=" +
                     "&deviceCode=%s" +
                     "&token=%s" +
-                    "&payType=BROADBAND" +
+                    "&payType="+ payType +
                     "&spToken=%s" +
                     "&epgServer=" +
                     "&remoteOrderUrl=" +

+ 20 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/util/UrlManager.java

@@ -20,6 +20,10 @@ public class UrlManager {
 
     public String getHost(){return host;}
 
+    public String getWebIndexPageUrl(){
+        return  "http://117.169.11.222:8018/tv/h5v2/index.html";
+    }
+
 
     public String getUIZipDownloadUrl(){return "http://down.gzhaochuan.com/load_ui.zip";}
 
@@ -191,6 +195,10 @@ public class UrlManager {
         return host+"index.php?m=Home&c=Api&a=act_config";
     }
 
+    public String getMiniVideoUrl(String dpiType){
+        return host+"index.php?m=Home&c=AndroidApi&a=videoWindow&key=" + dpiType;
+    }
+
     public String getCommitSequenceIdUrl(String sequenceId, int code){
         return host+"index.php?m=Home&c=Api&a=AndroidSequenceId"
                 +"&SequenceId=" + sequenceId
@@ -215,4 +223,16 @@ public class UrlManager {
                 "&sequenceId="+ sequenceId+
                 "&uid="+ userId;
     }
+
+    public String getUvSwitchUrl(){
+        return host + "index.php?m=Home&c=TvApi&a=switchs";
+    }
+
+    public String getBrandPermissionUrl(String phoneNo){
+        return host + "index.php?m=Home&c=TvApi&a=orderStage&tel=" + phoneNo;
+    }
+
+    public String getMessagePermissionUrl(String phoneNo){
+        return host + "index.php?m=Home&c=TvApi&a=sendMessage&tel="+ phoneNo;
+    }
 }

+ 70 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/viewModel/MiniVideoViewModel.java

@@ -0,0 +1,70 @@
+package com.guangzhou.haochuan.jxtv.viewModel;
+
+
+import com.guangzhou.haochuan.jxtv.model.H5Switch;
+import com.guangzhou.haochuan.jxtv.model.MiniVideo;
+import com.guangzhou.haochuan.jxtv.util.UrlManager;
+import com.guangzhou.haochuan.jxtv.web.retrofitFactory.H5SwitchFactory;
+import com.guangzhou.haochuan.jxtv.web.retrofitFactory.MiniVideoFactory;
+
+import java.util.Observable;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.annotations.NonNull;
+import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.functions.Consumer;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by yunhaipiaodi on 2017/9/22.
+ */
+
+public class MiniVideoViewModel extends Observable {
+    private CompositeDisposable compositeDisposable = new CompositeDisposable();
+    private MiniVideo miniVideo;
+    private String dpiType = "xhdpi";
+
+    public MiniVideoViewModel(String dpiType){
+        this.dpiType = dpiType;
+        fetchMiniVideo();
+    }
+
+    private void fetchMiniVideo() {
+        String requestUrl = UrlManager.getInstance().getMiniVideoUrl(dpiType);
+
+        compositeDisposable.add( new MiniVideoFactory().create()
+                .getObservable(requestUrl)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Consumer<MiniVideo>() {
+                    @Override
+                    public void accept(@NonNull MiniVideo source) throws Exception {
+                        setMiniVideo(source);
+                    }
+                }, new Consumer<Throwable>() {
+                    @Override
+                    public void accept(@NonNull Throwable throwable) throws Exception {
+                        throwable.printStackTrace();
+                    }
+                }));
+    }
+
+    public void setMiniVideo(MiniVideo source){
+        this.miniVideo =source;
+        setChanged();
+        notifyObservers();
+    }
+
+    public MiniVideo getMiniVideo(){return this.miniVideo;}
+
+
+    public void reset(){
+        unSubscribeFromObservable();
+        compositeDisposable = null;
+    }
+    private void unSubscribeFromObservable() {
+        if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
+            compositeDisposable.dispose();
+        }
+    }
+}

+ 87 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/viewModel/UvRequestViewModel.java

@@ -0,0 +1,87 @@
+package com.guangzhou.haochuan.jxtv.viewModel;
+
+
+import com.guangzhou.haochuan.jxtv.model.CreateUserResult;
+import com.guangzhou.haochuan.jxtv.model.UvRequestResult;
+import com.guangzhou.haochuan.jxtv.util.UrlManager;
+import com.guangzhou.haochuan.jxtv.web.retrofitFactory.CreateUserFactory;
+import com.guangzhou.haochuan.jxtv.web.retrofitFactory.UvRequestFactory;
+
+import java.util.Observable;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.annotations.NonNull;
+import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.functions.Consumer;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by yunhaipiaodi on 2017/9/20.
+ */
+
+public class UvRequestViewModel extends Observable {
+    private CompositeDisposable compositeDisposable = new CompositeDisposable();
+    private UvRequestResult uvRequestResult;
+    private String phone;
+    private int requestType;    //1为宽带,2为短信;
+
+    public UvRequestViewModel(String phone,
+                              int requestType){
+        this.phone = phone;
+        this.requestType = requestType;
+        fetchStyleData();
+    }
+
+    private void fetchStyleData() {
+        String requestUrl = "";
+        switch (requestType){
+            case 1:
+                requestUrl = UrlManager.getInstance().getBrandPermissionUrl(phone);
+                break;
+            case 2:
+                requestUrl = UrlManager.getInstance().getMessagePermissionUrl(phone);
+                break;
+            default:
+                requestUrl = UrlManager.getInstance().getBrandPermissionUrl(phone);
+                    break;
+        }
+
+        compositeDisposable.add( new UvRequestFactory().create()
+                .getObservable(requestUrl)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Consumer<UvRequestResult>() {
+                    @Override
+                    public void accept(@NonNull UvRequestResult source) throws Exception {
+                        setUvRequestResult(source);
+                    }
+                }, new Consumer<Throwable>() {
+                    @Override
+                    public void accept(@NonNull Throwable throwable) throws Exception {
+                        throwable.printStackTrace();
+                    }
+                }));
+    }
+
+    public void setUvRequestResult(UvRequestResult source){
+        this.uvRequestResult = source;
+        setChanged();
+        notifyObservers();
+    }
+
+    public UvRequestResult getUvRequestResult(){return this.uvRequestResult;}
+
+    public int getRequestType(){return this.requestType;}
+
+    public String getPhone(){return this.phone;}
+
+    public void reset(){
+        unSubscribeFromObservable();
+        compositeDisposable = null;
+    }
+    private void unSubscribeFromObservable() {
+        if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
+            compositeDisposable.dispose();
+        }
+    }
+}

+ 13 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitFactory/MiniVideoFactory.java

@@ -0,0 +1,13 @@
+package com.guangzhou.haochuan.jxtv.web.retrofitFactory;
+
+
+import com.guangzhou.haochuan.jxtv.web.retrofitService.MiniVideoService;
+
+/**
+ * Created by yunhaipiaodi on 2017/9/22.
+ */
+
+public class MiniVideoFactory extends BasicFactory {
+    public MiniVideoService create(){return super.retrofit.create(MiniVideoService.class);}
+}
+

+ 11 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitFactory/UvRequestFactory.java

@@ -0,0 +1,11 @@
+package com.guangzhou.haochuan.jxtv.web.retrofitFactory;
+
+import com.guangzhou.haochuan.jxtv.web.retrofitService.UvRequestService;
+
+/**
+ * Created by yunhaipiaodi on 2017/9/22.
+ */
+
+public class UvRequestFactory extends BasicFactory {
+    public UvRequestService create(){return super.retrofit.create(UvRequestService.class);}
+}

+ 15 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitService/MiniVideoService.java

@@ -0,0 +1,15 @@
+package com.guangzhou.haochuan.jxtv.web.retrofitService;
+import com.guangzhou.haochuan.jxtv.model.MiniVideo;
+
+import io.reactivex.Observable;
+import retrofit2.http.GET;
+import retrofit2.http.Url;
+
+/**
+ * Created by yunhaipiaodi on 2017/9/22.
+ */
+
+public interface MiniVideoService {
+    @GET
+    public Observable<MiniVideo> getObservable(@Url String url);
+}

+ 16 - 0
app/src/main/java/com/guangzhou/haochuan/jxtv/web/retrofitService/UvRequestService.java

@@ -0,0 +1,16 @@
+package com.guangzhou.haochuan.jxtv.web.retrofitService;
+
+import com.guangzhou.haochuan.jxtv.model.UvRequestResult;
+
+import io.reactivex.Observable;
+import retrofit2.http.GET;
+import retrofit2.http.Url;
+
+/**
+ * Created by yunhaipiaodi on 2017/9/22.
+ */
+
+public interface UvRequestService {
+    @GET
+    public Observable<UvRequestResult> getObservable(@Url String url);
+}

+ 4 - 5
app/src/main/res/layout/activity_main.xml

@@ -5,11 +5,10 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/webview_container"
-    tools:context="com.guangzhou.haochuan.jxtv.activity.MainActivity">
-
-    <!--<WebView
+    android:background="@color/transparent"
+    tools:context="com.guangzhou.haochuan.jxtv.activity.DjblWebActivity">
+    <WebView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:id="@+id/h5_web"/>-->
-
+        android:id="@+id/h5_web"/>
 </FrameLayout>

+ 42 - 0
app/src/main/res/layout/activity_start_video.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/back"
+    android:id="@+id/mini_video_back"
+    tools:context="com.guangzhou.haochuan.jxtv.activity.StartVideoActivity">
+
+    <!--视频容器-->
+    <FrameLayout
+        android:id="@+id/video_view_mini"
+        android:layout_width="@dimen/mini_video_width"
+        android:layout_height="@dimen/mini_video_height"
+        android:layout_marginTop="@dimen/mini_video_margin_top"
+        android:background="@color/transparent"
+        android:layout_marginLeft="@dimen/mini_video_margin_left"/>
+
+    <!--<ImageView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/video_cover_image"
+        android:src="@drawable/back"/>-->
+
+    <!--加载模块-->
+    <FrameLayout
+        android:layout_width="@dimen/player_loading_width"
+        android:layout_height="@dimen/player_loading_height"
+        android:layout_marginLeft="@dimen/loading_margin_left"
+        android:layout_marginTop="@dimen/loading_margin_top"
+        android:id="@+id/loading"
+        android:visibility="visible"
+        android:background="@drawable/loading_back">
+        <ImageView
+            android:layout_width="@dimen/player_loading_image_width"
+            android:layout_height="@dimen/player_loading_image_height"
+            android:layout_gravity="center"
+            android:id="@+id/loading_animation"
+            />
+    </FrameLayout>
+
+</FrameLayout>

+ 8 - 0
app/src/main/res/values-hdpi/dimens.xml

@@ -677,4 +677,12 @@
     <!--pay page-->
     <dimen name="pay_loading_width">114.666664dp</dimen>
     <dimen name="pay_loading_height">114.666664dp</dimen>
+
+    <!--start video-->
+    <dimen name="mini_video_width">540.0dp</dimen>
+    <dimen name="mini_video_height">270.0dp</dimen>
+    <dimen name="mini_video_margin_left">587.3333dp</dimen>
+    <dimen name="mini_video_margin_top">225.33333dp</dimen>
+    <dimen name="loading_margin_left">794.0dp</dimen>
+    <dimen name="loading_margin_top">312.66666dp</dimen>
 </resources>

+ 8 - 0
app/src/main/res/values-ldpi/dimens.xml

@@ -677,4 +677,12 @@
     <!--pay page-->
     <dimen name="pay_loading_width">229.33333dp</dimen>
     <dimen name="pay_loading_height">229.33333dp</dimen>
+
+    <!--start video-->
+    <dimen name="mini_video_width">1080.0dp</dimen>
+    <dimen name="mini_video_height">540.0dp</dimen>
+    <dimen name="mini_video_margin_left">1174.6666dp</dimen>
+    <dimen name="mini_video_margin_top">450.66666dp</dimen>
+    <dimen name="loading_margin_left">1588.0dp</dimen>
+    <dimen name="loading_margin_top">625.3333dp</dimen>
 </resources>

+ 8 - 0
app/src/main/res/values-mdpi-1280x720/dimens.xml

@@ -677,4 +677,12 @@
     <!--pay page-->
     <dimen name="pay_loading_width">114.666664dp</dimen>
     <dimen name="pay_loading_height">114.666664dp</dimen>
+
+    <!--start video-->
+    <dimen name="mini_video_width">540.0dp</dimen>
+    <dimen name="mini_video_height">270.0dp</dimen>
+    <dimen name="mini_video_margin_left">587.3333dp</dimen>
+    <dimen name="mini_video_margin_top">225.33333dp</dimen>
+    <dimen name="loading_margin_left">794.0dp</dimen>
+    <dimen name="loading_margin_top">312.66666dp</dimen>
 </resources>

+ 8 - 0
app/src/main/res/values-mdpi-1920x1080/dimens.xml

@@ -677,4 +677,12 @@
     <!--pay page-->
     <dimen name="pay_loading_width">172.0dp</dimen>
     <dimen name="pay_loading_height">172.0dp</dimen>
+
+    <!--start video-->
+    <dimen name="mini_video_width">810.0dp</dimen>
+    <dimen name="mini_video_height">405.0dp</dimen>
+    <dimen name="mini_video_margin_left">881.0dp</dimen>
+    <dimen name="mini_video_margin_top">338.0dp</dimen>
+    <dimen name="loading_margin_left">1191.0dp</dimen>
+    <dimen name="loading_margin_top">469.0dp</dimen>
 </resources>

+ 8 - 0
app/src/main/res/values-xhdpi/dimens.xml

@@ -677,4 +677,12 @@
     <!--pay page-->
     <dimen name="pay_loading_width">86dp</dimen>
     <dimen name="pay_loading_height">86dp</dimen>
+
+    <!--start video-->
+    <dimen name="mini_video_width">405dp</dimen>
+    <dimen name="mini_video_height">202.5dp</dimen>
+    <dimen name="mini_video_margin_left">440.5dp</dimen>
+    <dimen name="mini_video_margin_top">169dp</dimen>
+    <dimen name="loading_margin_left">595.5dp</dimen>
+    <dimen name="loading_margin_top">234.5dp</dimen>
 </resources>

+ 8 - 0
app/src/main/res/values-xxhdpi/dimens.xml

@@ -677,4 +677,12 @@
     <!--pay page-->
     <dimen name="pay_loading_width">57.333332dp</dimen>
     <dimen name="pay_loading_height">57.333332dp</dimen>
+
+    <!--start video-->
+    <dimen name="mini_video_width">270.0dp</dimen>
+    <dimen name="mini_video_height">135.0dp</dimen>
+    <dimen name="mini_video_margin_left">293.66666dp</dimen>
+    <dimen name="mini_video_margin_top">112.666664dp</dimen>
+    <dimen name="loading_margin_left">397.0dp</dimen>
+    <dimen name="loading_margin_top">156.33333dp</dimen>
 </resources>

+ 8 - 0
app/src/main/res/values-xxxhdpi/dimens.xml

@@ -677,4 +677,12 @@
     <!--pay page-->
     <dimen name="pay_loading_width">43.0dp</dimen>
     <dimen name="pay_loading_height">43.0dp</dimen>
+
+    <!--start video-->
+    <dimen name="mini_video_width">202.5dp</dimen>
+    <dimen name="mini_video_height">101.25dp</dimen>
+    <dimen name="mini_video_margin_left">220.25dp</dimen>
+    <dimen name="mini_video_margin_top">84.5dp</dimen>
+    <dimen name="loading_margin_left">297.75dp</dimen>
+    <dimen name="loading_margin_top">117.25dp</dimen>
 </resources>