2 Commits 7398d45474 ... da7c4e5eb3

Autor SHA1 Mensaje Fecha
  zhaofuxin da7c4e5eb3 添加时区功能 hace 3 años
  xiaojian 2f07cf8f55 '新提交代码' hace 3 años
Se han modificado 56 ficheros con 19246 adiciones y 380 borrados
  1. 122 0
      .idea/codeStyles/Project.xml
  2. 5 0
      .idea/codeStyles/codeStyleConfig.xml
  3. 1 2
      .idea/gradle.xml
  4. 8 0
      .idea/misc.xml
  5. 3 1
      app/build.gradle
  6. 0 20
      app/debug/debug/output.json
  7. 2 2
      app/debug/output.json
  8. BIN
      app/platform.keystore
  9. 2 0
      app/src/main/AndroidManifest.xml
  10. 25 28
      app/src/main/java/com/jld/vod/base/BaseActivity.kt
  11. 14 1
      app/src/main/java/com/jld/vod/base/MyApplication.kt
  12. 4 4
      app/src/main/java/com/jld/vod/config/Config.kt
  13. 6 0
      app/src/main/java/com/jld/vod/interfaces/remote/Apis.kt
  14. 1 1
      app/src/main/java/com/jld/vod/model/bean/GEOAdvertBean.kt
  15. 8 0
      app/src/main/java/com/jld/vod/model/bean/SysFindTimeBean.kt
  16. 1 2
      app/src/main/java/com/jld/vod/service/SocketService.kt
  17. 42 0
      app/src/main/java/com/jld/vod/utils/AppUtil.java
  18. 25 16
      app/src/main/java/com/jld/vod/utils/DateUtils.kt
  19. 4 0
      app/src/main/java/com/jld/vod/utils/FileFuUtils.kt
  20. 78 0
      app/src/main/java/com/jld/vod/utils/HttpFileUtils.java
  21. 450 0
      app/src/main/java/com/jld/vod/utils/ToastUtils.java
  22. 87 0
      app/src/main/java/com/jld/vod/utils/Utils.java
  23. 2 1
      app/src/main/java/com/jld/vod/utils/WifiUtil.java
  24. 117 10
      app/src/main/java/com/jld/vod/utils/http/HttpFileUtil.java
  25. 1 1
      app/src/main/java/com/jld/vod/utils/http/OkHttpDownloadUtils.java
  26. 21 1
      app/src/main/java/com/jld/vod/utils/http/OkHttpUtils.java
  27. 144 0
      app/src/main/java/com/jld/vod/utils/http/ProgressFragmentRequestBody.java
  28. 11 3
      app/src/main/java/com/jld/vod/utils/http/RetrofitUtils.kt
  29. 2 3
      app/src/main/java/com/jld/vod/view/HomeActivity.kt
  30. 16 12
      app/src/main/java/com/jld/vod/view/MainActivity.kt
  31. 3 0
      app/src/main/java/com/jld/vod/view/MusicPlayActivity.kt
  32. 398 189
      app/src/main/java/com/jld/vod/view/PostFileActivity.kt
  33. 11 0
      app/src/main/java/com/jld/vod/view/SettingsActivity.kt
  34. 54 40
      app/src/main/java/com/jld/vod/view/SplashActivity.kt
  35. 1 0
      app/src/main/java/com/jld/vod/view/WebActivity.kt
  36. 2 0
      app/src/main/java/com/jld/vod/view/adapter/HostAllOrdersAdapter.kt
  37. 4 4
      app/src/main/java/com/jld/vod/view/adapter/MusicListAdapter.kt
  38. 1 0
      app/src/main/java/com/jld/vod/view/adapter/MyAllOrdersAdapter.kt
  39. 3 1
      app/src/main/java/com/jld/vod/view/fragment/HostAllOrdersFragment.kt
  40. 2 1
      app/src/main/java/com/jld/vod/view/fragment/HostNewOrdersFragment.kt
  41. 1 0
      app/src/main/java/com/jld/vod/view/widget/MyJzvdStd.kt
  42. 43 13
      app/src/main/java/com/jld/vod/viewmodel/SplashViewModel.kt
  43. 16 15
      app/src/main/res/layout/activity_musice_play.xml
  44. 1 1
      app/src/main/res/layout/fragment_maps.xml
  45. 1 1
      app/src/main/res/layout/fragment_order.xml
  46. BIN
      app/src/main/res/mipmap-hdpi/home_default.png
  47. BIN
      app/src/main/res/mipmap-mdpi/test_maps_1.png
  48. 91 0
      app/src/main/res/values-es-rES/strings.xml
  49. 3 0
      app/src/main/res/values-th-rTH/strings.xml
  50. 2 1
      app/src/main/res/values-zh-rCN/strings.xml
  51. 1 0
      app/src/main/res/values/strings.xml
  52. 6 2
      app/src/main/res/xml/root_preferences.xml
  53. 2 2
      gradlew
  54. 7 1
      keystore.properties
  55. 8 1
      library_zhy_CircleMenu/src/main/java/com/zhy/view/CircleMenuLayout.java
  56. 17383 0
      replay_pid17268.log

+ 122 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,122 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <JetCodeStyleSettings>
+      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+    </JetCodeStyleSettings>
+    <codeStyleSettings language="XML">
+      <indentOptions>
+        <option name="CONTINUATION_INDENT_SIZE" value="4" />
+      </indentOptions>
+      <arrangement>
+        <rules>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:android</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>xmlns:.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:id</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*:name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>name</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>style</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>^$</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>ANDROID_ATTRIBUTE_ORDER</order>
+            </rule>
+          </section>
+          <section>
+            <rule>
+              <match>
+                <AND>
+                  <NAME>.*</NAME>
+                  <XML_ATTRIBUTE />
+                  <XML_NAMESPACE>.*</XML_NAMESPACE>
+                </AND>
+              </match>
+              <order>BY_NAME</order>
+            </rule>
+          </section>
+        </rules>
+      </arrangement>
+    </codeStyleSettings>
+    <codeStyleSettings language="kotlin">
+      <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+    </codeStyleSettings>
+  </code_scheme>
+</component>

+ 5 - 0
.idea/codeStyles/codeStyleConfig.xml

@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
+  </state>
+</component>

+ 1 - 2
.idea/gradle.xml

@@ -4,7 +4,7 @@
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
-        <option name="testRunner" value="PLATFORM" />
+        <option name="testRunner" value="GRADLE" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="gradleJvm" value="1.8 (2)" />
@@ -18,7 +18,6 @@
           </set>
         </option>
         <option name="resolveModulePerSourceSet" value="false" />
-        <option name="useQualifiedModuleNames" value="true" />
       </GradleProjectSettings>
     </option>
   </component>

+ 8 - 0
.idea/misc.xml

@@ -1,5 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="DesignSurface">
+    <option name="filePathToZoomLevelMap">
+      <map>
+        <entry key="..\:/AndroidDemo/smartvod/app/src/main/res/xml/root_preferences.xml" value="0.24140625" />
+        <entry key="..\:/AndroidDemo/smartvod/library_zhy_CircleMenu/src/main/res/layout/circle_menu_item.xml" value="0.3423772609819121" />
+      </map>
+    </option>
+  </component>
   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>

+ 3 - 1
app/build.gradle

@@ -21,13 +21,14 @@ android {
                 throw new InvalidUserDataException(ex.toString())
             }
         }
+
     }
 
     defaultConfig {
         applicationId "com.jld.vod"
         minSdkVersion 23
         targetSdkVersion 29
-        versionCode 196
+        versionCode 200
         versionName "1.0"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
@@ -55,6 +56,7 @@ dependencies {
     implementation fileTree(dir: "libs", include: ["*.jar"])
     implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.core:core-ktx:1.3.0'
+
     implementation 'androidx.appcompat:appcompat:1.1.0'
     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
     implementation project(path: ':library_zhy_CircleMenu')

+ 0 - 20
app/debug/debug/output.json

@@ -1,20 +0,0 @@
-{
-  "version": 1,
-  "artifactType": {
-    "type": "APK",
-    "kind": "Directory"
-  },
-  "applicationId": "com.jld.vod",
-  "variantName": "debug",
-  "elements": [
-    {
-      "type": "SINGLE",
-      "filters": [],
-      "properties": [],
-      "versionCode": 193,
-      "versionName": "193",
-      "enabled": true,
-      "outputFile": "app-debug.apk"
-    }
-  ]
-}

+ 2 - 2
app/debug/output.json

@@ -11,8 +11,8 @@
       "type": "SINGLE",
       "filters": [],
       "properties": [],
-      "versionCode": 193,
-      "versionName": "193",
+      "versionCode": 197,
+      "versionName": "197",
       "enabled": true,
       "outputFile": "app-debug.apk"
     }

BIN
app/platform.keystore


+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -8,6 +8,8 @@
     <!-- android:sharedUserId="android.uid.system" -->
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.SET_TIME" />
+    <uses-permission android:name="android.permission.SET_TIME_ZONE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.INTERNET" />

+ 25 - 28
app/src/main/java/com/jld/vod/base/BaseActivity.kt

@@ -35,14 +35,13 @@ abstract class BaseActivity : XPageActivity() {
     private var mToast: Toast? = null
     private var dialogs: KProgressHUD? = null
     private lateinit var viewModel: MainViewModel
-    private val handlerBaseActivity: Handler =  Handler()
+    private val handlerBaseActivity: Handler = Handler()
 
 
     //用户没操作了
     private val runnableBaseActivity = Runnable {
         LogUtils.logD("用户没操作了")
-        if (Config.isShowAd)
-        {
+        if (Config.isShowAd) {
             //获取固定广告
             viewModel.findPositionAdvert()
         }
@@ -54,39 +53,38 @@ abstract class BaseActivity : XPageActivity() {
         super.onCreate(savedInstanceState)
         setContentView(layoutId)
         mContext = this
-
-        viewModel = ViewModelProvider.AndroidViewModelFactory(application).create(MainViewModel::class.java)
-
+        viewModel =
+            ViewModelProvider.AndroidViewModelFactory(application).create(MainViewModel::class.java)
         initView()
         initData()
         initEvent()
         initAdVert()
 
         val activity = ContextBean.getInstance().getActivity();
-        if (activity == null) { return; }
-        LogUtils.logE("activity"+activity)
+        if (activity == null) {
+            return; }
+        LogUtils.logE("activity" + activity)
         val win = activity.getWindow();
 
-        win.setCallback(object :WinCallback(win.callback){
+        win.setCallback(object : WinCallback(win.callback) {
             override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
                 when (event!!.getAction()) {
-                    MotionEvent.ACTION_DOWN->{
-                        LogUtils.logD( "dispatchTouchEvent:ACTION_DOWN");
+                    MotionEvent.ACTION_DOWN -> {
+                        LogUtils.logD("dispatchTouchEvent:ACTION_DOWN");
                         handlerBaseActivity.removeCallbacks(runnableBaseActivity);
                     }
-                    MotionEvent.ACTION_MOVE->{
-                       // LogUtils.logD("dispatchTouchEvent:activity窗口被触摸");
+                    MotionEvent.ACTION_MOVE -> {
+                        // LogUtils.logD("dispatchTouchEvent:activity窗口被触摸");
                         //handlerBaseActivity.removeCallbacks(runnableBaseActivity)
-                         }
-                    MotionEvent.ACTION_UP->
-                        {
+                    }
+                    MotionEvent.ACTION_UP -> {
 
-                            handlerBaseActivity.removeCallbacks(runnableBaseActivity)
-                            //handlerBaseActivity.postDelayed(runnableBaseActivity, 5 * 1000)
-                            handlerBaseActivity.postDelayed(runnableBaseActivity, 1800 * 1000)
+                        handlerBaseActivity.removeCallbacks(runnableBaseActivity)
+                        //handlerBaseActivity.postDelayed(runnableBaseActivity, 5 * 1000)
+                        handlerBaseActivity.postDelayed(runnableBaseActivity, 1800 * 1000)
 
-                            LogUtils.logD( "dispatchTouchEvent:ACTION_UP");
-                        }
+                        LogUtils.logD("dispatchTouchEvent:ACTION_UP");
+                    }
                 }
                 return super.dispatchTouchEvent(event)
             }
@@ -98,11 +96,10 @@ abstract class BaseActivity : XPageActivity() {
      * 初始化广告模块
      */
     private fun initAdVert() {
-        viewModel.findPositionAdvertLiveData.observe(this) {res->
+        viewModel.findPositionAdvertLiveData.observe(this) { res ->
             when (res?.code) {
                 BaseBean.SUCCESS -> {
-                    if (res.data!!.size != 0)
-                    {
+                    if (res.data != null && res.data.isNotEmpty()) {
                         EventBus.getDefault().post(res.data)
                     }
                     finishLoading()
@@ -117,16 +114,15 @@ abstract class BaseActivity : XPageActivity() {
     }
 
     override fun onWindowFocusChanged(hasFocus: Boolean) {
-        if(hasFocus)
-        {
+        if (hasFocus) {
             handlerBaseActivity.removeCallbacks(runnableBaseActivity)
             handlerBaseActivity.postDelayed(runnableBaseActivity, 1800 * 1000)
-        }else{
+        } else {
             handlerBaseActivity.removeCallbacks(runnableBaseActivity)
         }
 
         //Log.e("zhaofuxin", "onWindowFocusChanged: activity焦点变化=="+hasFocus );
-        super.onWindowFocusChanged(hasFocus )
+        super.onWindowFocusChanged(hasFocus)
     }
 
     open protected fun initView() {}
@@ -212,6 +208,7 @@ abstract class BaseActivity : XPageActivity() {
             dialogs!!.dismiss()
         }
     }
+
     /**
      * 打开fragment
      *

+ 14 - 1
app/src/main/java/com/jld/vod/base/MyApplication.kt

@@ -2,13 +2,16 @@ package com.jld.vod.base
 
 import android.app.Activity
 import android.app.Application
-import android.content.Context
+import android.os.Build
 import android.os.Bundle
 import android.preference.PreferenceManager
 import android.util.Log
 import com.facebook.drawee.backends.pipeline.Fresco
 import com.jld.vod.model.bean.ContextBean
 import com.jld.vod.ui.XBasicLibInit
+import com.jld.vod.utils.AppUtil
+import com.jld.vod.utils.LogUtils
+import com.jld.vod.utils.Utils
 import com.jld.vod.utils.http.RetrofitUtils
 import com.xuexiang.xui.XUI
 import com.zzhoujay.richtext.RichText
@@ -16,6 +19,9 @@ import org.mapsforge.map.android.graphics.AndroidGraphicFactory
 import org.mapsforge.map.layer.renderer.MapWorkerPool
 import org.mapsforge.map.model.DisplayModel
 import org.mapsforge.map.reader.MapFile
+import java.lang.reflect.Constructor
+import java.lang.reflect.Field
+import java.lang.reflect.Method
 
 /**
  * @author ZhaoFuXin
@@ -48,9 +54,14 @@ class MyApplication : Application(){
     }
     override fun onCreate() {
         super.onCreate()
+
         app = this
         RetrofitUtils.init()
         Fresco.initialize(app)
+
+        Utils.init(app)
+
+        //AppUtil.hookWebView()
         /**
          * 地图
          */
@@ -113,4 +124,6 @@ class MyApplication : Application(){
         XUI.init(this)
         XUI.debug(isDebug())
     }
+
+
 }

+ 4 - 4
app/src/main/java/com/jld/vod/config/Config.kt

@@ -7,10 +7,10 @@ package com.jld.vod.config
  * @date :2020/7/21 14:18
  */
 object Config {
-//    const val ApiBaseUrl : String = "http://192.168.16.110:8088"
-//    const val ApiBaseUrlDebug : String = "http://192.168.16.110:8088"
-    const val ApiBaseUrl : String = "http://192.168.0.18:8088"
-    const val ApiBaseUrlDebug : String = "http://192.168.0.18:8088"
+    const val ApiBaseUrl : String = "http://172.20.5.76:8088"
+    const val ApiBaseUrlDebug : String = "http://172.20.5.76:8088"
+//    const val ApiBaseUrl : String = "http://192.168.0.106:8088"
+ //   const val ApiBaseUrlDebug : String = "http://192.168.0.106:8088"
 //    true--有线VOD false ---无线VOD
     const val Breed:Boolean = false
 //   进入设置的密码

+ 6 - 0
app/src/main/java/com/jld/vod/interfaces/remote/Apis.kt

@@ -377,4 +377,10 @@ interface Apis {
      */
     @GET("/orderFood/changeStatus")
     fun changeStatus(@Query("status") status:String,@Query("id") id:String):  Observable<BaseBean<String>>
+
+    /**
+     * 时间和时区
+     */
+    @GET("/sys/findTime")
+    fun findTime():  Observable<BaseBean<SysFindTimeBean>>
 }

+ 1 - 1
app/src/main/java/com/jld/vod/model/bean/GEOAdvertBean.kt

@@ -13,7 +13,7 @@ data class Datas(
     val depict: String,
     val filePath: String,
     val fileType: Int,
-    val sid: Int,
+    val sid: Long,
     val status: Int,
     val titleName: String,
     val type: Int,

+ 8 - 0
app/src/main/java/com/jld/vod/model/bean/SysFindTimeBean.kt

@@ -0,0 +1,8 @@
+package com.jld.vod.model.bean
+
+data class SysFindTimeBean(
+
+    val timeZone: String,
+    val timestamp: Long,
+    val wholeData: String
+)

+ 1 - 2
app/src/main/java/com/jld/vod/service/SocketService.kt

@@ -163,13 +163,12 @@ class SocketService : Service() {
             }
             override fun success(call: Call?, response: Response?) {
                 val json = response!!.body!!.string()
-
+                LogUtils.logD("数据项"+json)
                 val mGEOAdvertBean= gson!!.fromJson(json, GEOAdvertBean::class.java)
                 val msg = Message()
                 msg.what = GEOAD
                 msg.obj = mGEOAdvertBean
                 mHandler.sendMessage(msg)
-
             }
         })
     }

+ 42 - 0
app/src/main/java/com/jld/vod/utils/AppUtil.java

@@ -8,6 +8,7 @@ import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
+import android.os.Build;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
@@ -17,6 +18,8 @@ import android.widget.Toast;
 import androidx.core.content.ContextCompat;
 
 import java.io.File;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.Locale;
 
@@ -145,6 +148,8 @@ public class AppUtil {
         PackageManager pm = context.getPackageManager();
         PackageInfo info = pm.getPackageArchiveInfo(apkPath,
                 PackageManager.GET_ACTIVITIES);
+        Log.i("AppUtil", "getApkPackName: "+info);
+
         if (info != null) {
             ApplicationInfo appInfo = info.applicationInfo;
             appInfo.sourceDir = apkPath;
@@ -191,4 +196,41 @@ public class AppUtil {
         }
         return dir.delete();
     }
+    public static void hookWebView() {
+        int sdkInt = Build.VERSION.SDK_INT;
+        try {
+            Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");
+            Field field = factoryClass.getDeclaredField("sProviderInstance");
+            field.setAccessible(true);
+            Object sProviderInstance = field.get(null);
+            if (sProviderInstance != null) {
+                LogUtils.INSTANCE.logD("sProviderInstance isn't null");
+                return;
+            }
+            Method getProviderClassMethod;
+            if (sdkInt > 22) {
+                getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
+            } else if (sdkInt == 22) {
+                getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
+            } else {
+                LogUtils.INSTANCE.logD("Don't need to Hook WebView");
+                return;
+            }
+            getProviderClassMethod.setAccessible(true);
+            Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
+            Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
+            Constructor<?> providerConstructor = providerClass.getConstructor(delegateClass);
+            if (providerConstructor != null) {
+                providerConstructor.setAccessible(true);
+                Constructor<?> declaredConstructor = delegateClass.getDeclaredConstructor();
+                declaredConstructor.setAccessible(true);
+                sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance());
+                LogUtils.INSTANCE.logD("sProviderInstance:{}", sProviderInstance.toString());
+                field.set("sProviderInstance", sProviderInstance);
+            }
+            LogUtils.INSTANCE.logD("Hook done!");
+        } catch (Throwable e) {
+            LogUtils.INSTANCE.logD(e.toString());
+        }
+    }
 }

+ 25 - 16
app/src/main/java/com/jld/vod/utils/DateUtils.kt

@@ -1,5 +1,7 @@
 package com.jld.vod.utils
 
+import android.app.AlarmManager
+import android.content.Context
 import com.jld.vod.R
 import com.xuexiang.xui.utils.ResUtils.getString
 import java.io.DataOutputStream
@@ -21,13 +23,13 @@ object DateUtils {
      */
     fun getTime(date: Date?): String? {
         var simpleDateFormat: SimpleDateFormat = SimpleDateFormat("HH:mm")// HH:mm:ss
-        simpleDateFormat.timeZone = TimeZone.getTimeZone("Asia/Shanghai")
+      //  simpleDateFormat.timeZone = TimeZone.getTimeZone("Asia/Shanghai")
         return simpleDateFormat.format(date)
     }
 
     fun getDate(date: Date?): String? {
         var simpleDateFormat: SimpleDateFormat = SimpleDateFormat("yyyy/MM/dd")// HH:mm:ss
-        simpleDateFormat.timeZone = TimeZone.getTimeZone("Asia/Shanghai")
+       // simpleDateFormat.timeZone = TimeZone.getTimeZone("Asia/Shanghai")
         return simpleDateFormat.format(date)
     }
 
@@ -60,21 +62,28 @@ object DateUtils {
      * 设置系统时间
      * 【时间格式 yyyyMMdd.HHmmss】
      */
-    fun setSystemDate(times: Long) {
-        try {
-            val datetimes = "yyyyMMdd.HHmmss" //时间格式
-            var datetime =convertTimestamp2Date(times,datetimes)//格式化
-            val process = Runtime.getRuntime().exec("su")//获取root权限
-
-            val os = DataOutputStream(process.outputStream)
-            os.writeBytes("setprop persist.sys.timezone GMT\n")
-            os.writeBytes("/system/bin/date -s $datetime\n")
-            os.writeBytes("clock -w\n")
-            os.writeBytes("exit\n")
-            os.flush()
-        } catch (e: IOException) {
-            e.printStackTrace()
+    fun setSystemDate(times: Long, timeZone:String,mContext:Context) {
+        val mAlarm = (mContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager)
+        if (mAlarm !=null)
+        {
+           // LogUtils.logD("setSystemDate"+timeZone)
+            mAlarm.setTimeZone(timeZone)
+            mAlarm.setTime(times)
         }
+//        try {
+//            val datetimes = "yyyyMMdd.HHmmss" //时间格式
+//            var datetime =convertTimestamp2Date(times,datetimes)//格式化
+//            val process = Runtime.getRuntime().exec("su")//获取root权限
+//
+//            val os = DataOutputStream(process.outputStream)
+//            os.writeBytes("setprop persist.sys.timezone GMT\n")
+//            os.writeBytes("/system/bin/date -s $datetime\n")
+//            os.writeBytes("clock -w\n")
+//            os.writeBytes("exit\n")
+//            os.flush()
+//        } catch (e: IOException) {
+//            e.printStackTrace()
+//        }
     }
 
     /**

+ 4 - 0
app/src/main/java/com/jld/vod/utils/FileFuUtils.kt

@@ -2,6 +2,8 @@ package com.jld.vod.utils
 
 import java.io.File
 import java.io.FileFilter
+import java.io.IOException
+import java.io.RandomAccessFile
 
 /**
  * @author ZhaoFuXin
@@ -18,4 +20,6 @@ object FileFuUtils : FileFilter {
        return name.endsWith(".mp3")
     }
 
+
+
 }

+ 78 - 0
app/src/main/java/com/jld/vod/utils/HttpFileUtils.java

@@ -0,0 +1,78 @@
+package com.jld.vod.utils;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.jld.vod.utils.http.ProgressFragmentRequestBody;
+import com.jld.vod.utils.http.ProgressListener;
+import com.jld.vod.utils.http.ProgressRequestBody;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+
+/**
+ * Created by zhaofuxin on 2019/9/12.
+ */
+
+public class HttpFileUtils {
+    private static OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10000, TimeUnit.MILLISECONDS)
+            .readTimeout(10000,TimeUnit.MILLISECONDS)
+            .writeTimeout(10000, TimeUnit.MILLISECONDS).
+                    build();
+
+    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+    public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
+    public static void postFile(Context mContext, String url, final ProgressListener listener, okhttp3.Callback callback, File videopath, Long mid, Long resId){
+        okHttpClient.dispatcher().setMaxRequests(1);
+        okHttpClient.dispatcher().setMaxRequestsPerHost(5);
+        MultipartBody.Builder builder = new MultipartBody.Builder();
+        builder.setType(MultipartBody.FORM);
+
+
+        //第一个参数要与Servlet中的一致
+        builder.addFormDataPart("file",videopath.getName(), RequestBody.create(MediaType.parse("application/octet-stream"),videopath));
+        if (mid != 123456)
+        {
+            builder.addFormDataPart("mid",mid.toString());
+        }
+        builder.addFormDataPart("resId",resId.toString());
+
+        MultipartBody multipartBody = builder.build();
+        Request request  = new Request.Builder().url(url).post(new ProgressRequestBody(multipartBody,listener)).build();
+        okHttpClient.newCall(request).enqueue(callback);
+
+    }
+    /**
+     * 分片传输文件
+     */
+    public static void postFileByFragmentUpload(String url, final ProgressListener listener, okhttp3.Callback callback,
+                                         File videopath,int chunks, Long chunkSize,String md5,String fileName , int chunk, Long resId,Long mid){
+
+        okHttpClient.dispatcher().setMaxRequests(1);
+        okHttpClient.dispatcher().setMaxRequestsPerHost(5);
+        MultipartBody.Builder builder = new MultipartBody.Builder();
+        builder.setType(MultipartBody.FORM);
+        //第一个参数要与Servlet中的一致
+        builder.addFormDataPart("file",videopath.getName(), RequestBody.create(MediaType.parse("application/octet-stream"),videopath));
+        if (mid != 123456)
+        {
+            builder.addFormDataPart("mid",mid.toString());
+        }
+        builder.addFormDataPart("resId",resId.toString());
+        builder.addFormDataPart("chunks",String.valueOf(chunks));
+        builder.addFormDataPart("chunk",String.valueOf(chunk));
+        builder.addFormDataPart("md5",md5);
+        builder.addFormDataPart("fileName",fileName);
+        builder.addFormDataPart("chunkSize",chunkSize.toString());
+
+        MultipartBody multipartBody = builder.build();
+        Request request  = new Request.Builder().url(url).post(new ProgressFragmentRequestBody(multipartBody,listener)).build();
+        okHttpClient.newCall(request).enqueue(callback);
+    }
+}

+ 450 - 0
app/src/main/java/com/jld/vod/utils/ToastUtils.java

@@ -0,0 +1,450 @@
+package com.jld.vod.utils;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.ForegroundColorSpan;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+
+import com.jld.vod.R;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * 吐司工具类
+ */
+public final class ToastUtils {
+
+    private static final int DEFAULT_COLOR = 0x12000000;
+    private static Toast sToast;
+    private static int gravity         = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
+    private static int xOffset         = 0;
+    private static int yOffset         = (int) (64 * Utils.getContext().getResources().getDisplayMetrics().density + 0.5);
+    private static int backgroundColor = DEFAULT_COLOR;
+    private static int bgResource      = -1;
+    private static int messageColor    = DEFAULT_COLOR;
+    private static WeakReference<View> sViewWeakReference;
+    private static Handler sHandler = new Handler(Looper.getMainLooper());
+
+    private ToastUtils() {
+        throw new UnsupportedOperationException("u can't instantiate me...");
+    }
+
+    /**
+     * 设置吐司位置
+     *
+     * @param gravity 位置
+     * @param xOffset x偏移
+     * @param yOffset y偏移
+     */
+    public static void setGravity(int gravity, int xOffset, int yOffset) {
+        ToastUtils.gravity = gravity;
+        ToastUtils.xOffset = xOffset;
+        ToastUtils.yOffset = yOffset;
+    }
+
+    /**
+     * 设置吐司view
+     *
+     * @param layoutId 视图
+     */
+    public static void setView(@LayoutRes int layoutId) {
+        LayoutInflater inflate = (LayoutInflater) Utils.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        sViewWeakReference = new WeakReference<>(inflate.inflate(layoutId, null));
+    }
+
+    /**
+     * 设置吐司view
+     *
+     * @param view 视图
+     */
+    public static void setView(View view) {
+        sViewWeakReference = view == null ? null : new WeakReference<>(view);
+    }
+
+    /**
+     * 获取吐司view
+     *
+     * @return view
+     */
+    public static View getView() {
+        if (sViewWeakReference != null) {
+            final View view = sViewWeakReference.get();
+            if (view != null) {
+                return view;
+            }
+        }
+        if (sToast != null) return sToast.getView();
+        return null;
+    }
+
+    /**
+     * 设置背景颜色
+     *
+     * @param backgroundColor 背景色
+     */
+    public static void setBackgroundColor(@ColorInt int backgroundColor) {
+        ToastUtils.backgroundColor = backgroundColor;
+    }
+
+    /**
+     * 设置背景资源
+     *
+     * @param bgResource 背景资源
+     */
+    public static void setBgResource(@DrawableRes int bgResource) {
+        ToastUtils.bgResource = bgResource;
+    }
+
+    /**
+     * 设置消息颜色
+     *
+     * @param messageColor 颜色
+     */
+    public static void setMessageColor(@ColorInt int messageColor) {
+        ToastUtils.messageColor = messageColor;
+    }
+
+    /**
+     * 安全地显示短时吐司
+     *
+     * @param text 文本
+     */
+    public static void showShortSafe(final CharSequence text) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(text, Toast.LENGTH_SHORT);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示短时吐司
+     *
+     * @param resId 资源Id
+     */
+    public static void showShortSafe(final @StringRes int resId) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(resId, Toast.LENGTH_SHORT);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示短时吐司
+     *
+     * @param resId 资源Id
+     * @param args  参数
+     */
+    public static void showShortSafe(final @StringRes int resId, final Object... args) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(resId, Toast.LENGTH_SHORT, args);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示短时吐司
+     *
+     * @param format 格式
+     * @param args   参数
+     */
+    public static void showShortSafe(final String format, final Object... args) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(format, Toast.LENGTH_SHORT, args);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示长时吐司
+     *
+     * @param text 文本
+     */
+    public static void showLongSafe(final CharSequence text) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(text, Toast.LENGTH_LONG);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示长时吐司
+     *
+     * @param resId 资源Id
+     */
+    public static void showLongSafe(final @StringRes int resId) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(resId, Toast.LENGTH_LONG);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示长时吐司
+     *
+     * @param resId 资源Id
+     * @param args  参数
+     */
+    public static void showLongSafe(final @StringRes int resId, final Object... args) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(resId, Toast.LENGTH_LONG, args);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示长时吐司
+     *
+     * @param format 格式
+     * @param args   参数
+     */
+    public static void showLongSafe(final String format, final Object... args) {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show(format, Toast.LENGTH_LONG, args);
+            }
+        });
+    }
+
+    /**
+     * 显示短时吐司
+     *
+     * @param text 文本
+     */
+    public static void showShort(CharSequence text) {
+        show(text, Toast.LENGTH_SHORT);
+    }
+
+    /**
+     * 显示短时吐司
+     *
+     * @param resId 资源Id
+     */
+    public static void showShort(@StringRes int resId) {
+        show(resId, Toast.LENGTH_SHORT);
+    }
+
+    /**
+     * 显示短时吐司
+     *
+     * @param resId 资源Id
+     * @param args  参数
+     */
+    public static void showShort(@StringRes int resId, Object... args) {
+        show(resId, Toast.LENGTH_SHORT, args);
+    }
+
+    /**
+     * 显示短时吐司
+     *
+     * @param format 格式
+     * @param args   参数
+     */
+    public static void showShort(String format, Object... args) {
+        show(format, Toast.LENGTH_SHORT, args);
+    }
+
+    /**
+     * 显示长时吐司
+     *
+     * @param text 文本
+     */
+    public static void showLong(CharSequence text) {
+        show(text, Toast.LENGTH_LONG);
+    }
+
+    /**
+     * 显示长时吐司
+     *
+     * @param resId 资源Id
+     */
+    public static void showLong(@StringRes int resId) {
+        show(resId, Toast.LENGTH_LONG);
+    }
+
+    /**
+     * 显示长时吐司
+     *
+     * @param resId 资源Id
+     * @param args  参数
+     */
+    public static void showLong(@StringRes int resId, Object... args) {
+        show(resId, Toast.LENGTH_LONG, args);
+    }
+
+    /**
+     * 显示长时吐司
+     *
+     * @param format 格式
+     * @param args   参数
+     */
+    public static void showLong(String format, Object... args) {
+        show(format, Toast.LENGTH_LONG, args);
+    }
+
+    /**
+     * 安全地显示短时自定义吐司
+     */
+    public static void showCustomShortSafe() {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show("", Toast.LENGTH_SHORT);
+            }
+        });
+    }
+
+    /**
+     * 安全地显示长时自定义吐司
+     */
+    public static void showCustomLongSafe() {
+        sHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                show("", Toast.LENGTH_LONG);
+            }
+        });
+    }
+
+    /**
+     * 显示短时自定义吐司
+     */
+    public static void showCustomShort() {
+        show("", Toast.LENGTH_SHORT);
+    }
+
+    /**
+     * 显示长时自定义吐司
+     */
+    public static void showCustomLong() {
+        show("", Toast.LENGTH_LONG);
+    }
+
+    /**
+     * 显示吐司
+     *
+     * @param resId    资源Id
+     * @param duration 显示时长
+     */
+    private static void show(@StringRes int resId, int duration) {
+        show(Utils.getContext().getResources().getText(resId).toString(), duration);
+    }
+
+    /**
+     * 显示吐司
+     *
+     * @param resId    资源Id
+     * @param duration 显示时长
+     * @param args     参数
+     */
+    private static void show(@StringRes int resId, int duration, Object... args) {
+        show(String.format(Utils.getContext().getResources().getString(resId), args), duration);
+    }
+
+    /**
+     * 显示吐司
+     *
+     * @param format   格式
+     * @param duration 显示时长
+     * @param args     参数
+     */
+    private static void show(String format, int duration, Object... args) {
+        show(String.format(format, args), duration);
+    }
+
+    /**
+     * 显示吐司
+     *
+     * @param text     文本
+     * @param duration 显示时长
+     */
+    private static void show(CharSequence text, int duration) {
+        cancel();
+        boolean isCustom = false;
+        if (sViewWeakReference != null) {
+            final View view = sViewWeakReference.get();
+            if (view != null) {
+                sToast = new Toast(Utils.getContext());
+                sToast.setView(view);
+                sToast.setDuration(duration);
+                isCustom = true;
+            }
+        }
+        if (!isCustom) {
+            if (messageColor != DEFAULT_COLOR) {
+                SpannableString spannableString = new SpannableString(text);
+                ForegroundColorSpan colorSpan = new ForegroundColorSpan(messageColor);
+                spannableString.setSpan(colorSpan, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+                sToast = Toast.makeText(Utils.getContext(), spannableString, duration);
+            } else {
+                sToast = Toast.makeText(Utils.getContext(), text, duration);
+            }
+        }
+        View view = sToast.getView();
+        if (bgResource != -1) {
+            view.setBackgroundResource(bgResource);
+        } else if (backgroundColor != DEFAULT_COLOR) {
+            view.setBackgroundColor(backgroundColor);
+        }
+        sToast.setGravity(gravity, xOffset, yOffset);
+        sToast.show();
+    }
+
+    /**
+     * 取消吐司显示
+     */
+    public static void cancel() {
+        if (sToast != null) {
+            sToast.cancel();
+            sToast = null;
+        }
+    }
+
+//    public static void showText(String msg) {
+//        Toast currentToast = Toast.makeText(Utils.getContext(), "", Toast.LENGTH_LONG);
+//        LayoutInflater inf = (LayoutInflater) Utils.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+//        View toastLayout = inf.inflate(R.layout.layout_x_toast, null);
+//        TextView toastTextView = toastLayout.findViewById(R.id.toast_text);
+//        toastTextView.setText(msg);
+//        currentToast.setView(toastLayout);
+//        currentToast.show();
+//    }
+//
+//    public static void e(String msg) {
+//        Toast currentToast = Toast.makeText(Utils.getContext(), "", Toast.LENGTH_LONG);
+//        LayoutInflater inf = (LayoutInflater) Utils.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+//        View toastLayout = inf.inflate(R.layout.layout_x_toast_e, null);
+//        TextView toastTextView = toastLayout.findViewById(R.id.toast_text);
+//        toastTextView.setText(msg);
+//        currentToast.setView(toastLayout);
+//        currentToast.show();
+//    }
+
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 87 - 0
app/src/main/java/com/jld/vod/utils/Utils.java


+ 2 - 1
app/src/main/java/com/jld/vod/utils/WifiUtil.java

@@ -78,7 +78,8 @@ public class WifiUtil {
      * @return 优先获取网卡地址
      */
     public static String getBroadcastAddress() {
-        String broadcast = getBroadcastAddress("p2p");
+//        p2p
+        String broadcast = getBroadcastAddress("eth0");
         if (broadcast == null) {
             return getBroadcastAddress("wlan0");
         }

+ 117 - 10
app/src/main/java/com/jld/vod/utils/http/HttpFileUtil.java

@@ -2,9 +2,22 @@ package com.jld.vod.utils.http;
 
 import android.content.Context;
 import android.util.Log;
+
+import com.jld.vod.utils.LogUtils;
+
 import java.io.File;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
 import java.util.concurrent.TimeUnit;
 
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
 import okhttp3.MediaType;
 import okhttp3.MultipartBody;
 import okhttp3.OkHttpClient;
@@ -16,20 +29,76 @@ import okhttp3.RequestBody;
  */
 
 public class HttpFileUtil {
-    private static OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10000, TimeUnit.MILLISECONDS)
-            .readTimeout(10000,TimeUnit.MILLISECONDS)
-            .writeTimeout(10000, TimeUnit.MILLISECONDS).
-                    build();
-
+    private static HttpFileUtil mInstance;
+    private OkHttpClient mOkHttpClient;
+    private static final byte[] LOCKER = new byte[0];
     public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
     public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
-    public static void postFile(Context mContext,String url, final ProgressListener listener, okhttp3.Callback callback, File videopath,Long mid,Long resId){
-        okHttpClient.dispatcher().setMaxRequests(1);
-        okHttpClient.dispatcher().setMaxRequestsPerHost(5);
+
+
+    private HttpFileUtil() {
+        okhttp3.OkHttpClient.Builder ClientBuilder = new okhttp3.OkHttpClient.Builder();
+
+        ClientBuilder.readTimeout(10000, TimeUnit.SECONDS);//读取超时
+        ClientBuilder.connectTimeout(10000, TimeUnit.SECONDS);//连接超时
+        ClientBuilder.writeTimeout(10000, TimeUnit.SECONDS);//写入超时
+        //支持HTTPS请求,跳过证书验证
+        ClientBuilder.sslSocketFactory(createSSLSocketFactory());
+        ClientBuilder.hostnameVerifier(new HostnameVerifier() {
+            @Override
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        });
+
+        mOkHttpClient = ClientBuilder.build();
+    }
+
+    /**
+     * 单例模式获取NetUtils
+     *
+     * @return
+     */
+    public static HttpFileUtil getInstance() {
+        if (mInstance == null) {
+            synchronized (LOCKER) {
+                if (mInstance == null) {
+                    mInstance = new HttpFileUtil();
+                }
+            }
+        }
+        return mInstance;
+    }
+
+    public  void postFile(Context mContext,String url, final ProgressListener listener, okhttp3.Callback callback, File videopath,Long mid,Long resId){
+        mOkHttpClient.dispatcher().setMaxRequests(1);
+        mOkHttpClient.dispatcher().setMaxRequestsPerHost(5);
         MultipartBody.Builder builder = new MultipartBody.Builder();
         builder.setType(MultipartBody.FORM);
+        //第一个参数要与Servlet中的一致
+        builder.addFormDataPart("file",videopath.getName(), RequestBody.create(MediaType.parse("application/octet-stream"),videopath));
+        if (mid != 123456)
+        {
+            builder.addFormDataPart("mid",mid.toString());
+        }
+        builder.addFormDataPart("resId",resId.toString());
+
+        MultipartBody multipartBody = builder.build();
+        Request request  = new Request.Builder().url(url).post(new ProgressRequestBody(multipartBody,listener)).build();
+        mOkHttpClient.newCall(request).enqueue(callback);
+    }
 
 
+    /**
+     * 分片传输文件
+     */
+    public void postFileByFragmentUpload(String url, final ProgressListener listener, okhttp3.Callback callback,
+                                File videopath,int chunks, Long chunkSize,String md5,String fileName , int chunk, Long resId,Long mid){
+
+//        okHttpClient.dispatcher().setMaxRequests(1);
+//        okHttpClient.dispatcher().setMaxRequestsPerHost(5);
+        MultipartBody.Builder builder = new MultipartBody.Builder();
+        builder.setType(MultipartBody.FORM);
         //第一个参数要与Servlet中的一致
         builder.addFormDataPart("file",videopath.getName(), RequestBody.create(MediaType.parse("application/octet-stream"),videopath));
         if (mid != 123456)
@@ -37,10 +106,48 @@ public class HttpFileUtil {
             builder.addFormDataPart("mid",mid.toString());
         }
         builder.addFormDataPart("resId",resId.toString());
+        builder.addFormDataPart("chunks",String.valueOf(chunks));
+        builder.addFormDataPart("chunk",String.valueOf(chunk));
+        builder.addFormDataPart("md5",md5);
+        builder.addFormDataPart("fileName",fileName);
+        builder.addFormDataPart("chunkSize",chunkSize.toString());
 
         MultipartBody multipartBody = builder.build();
-        Request request  = new Request.Builder().url(url).post(new ProgressRequestBody(multipartBody,listener)).build();
-        okHttpClient.newCall(request).enqueue(callback);
+        Request request  = new Request.Builder().url(url).post(new ProgressFragmentRequestBody(multipartBody,listener)).build();
+        mOkHttpClient.newCall(request).enqueue(callback);
+    }
+    /**
+     * 生成安全套接字工厂,用于https请求的证书跳过
+     *
+     * @return
+     */
+    public SSLSocketFactory createSSLSocketFactory() {
+        SSLSocketFactory ssfFactory = null;
+        try {
+            SSLContext sc = SSLContext.getInstance("TLS");
+            sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
+            ssfFactory = sc.getSocketFactory();
+        } catch (Exception e) {
+        }
+        return ssfFactory;
+    }
+
+    /**
+     * 用于信任所有证书
+     */
+    class TrustAllCerts implements X509TrustManager {
+        @Override
+        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+        }
 
+        @Override
+        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+        }
+
+        @Override
+        public X509Certificate[] getAcceptedIssuers() {
+            return new X509Certificate[0];
+        }
     }
 }

+ 1 - 1
app/src/main/java/com/jld/vod/utils/http/OkHttpDownloadUtils.java

@@ -58,7 +58,7 @@ public class OkHttpDownloadUtils {
         ClientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);//连接超时
         ClientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);//写入超时
         //支持HTTPS请求,跳过证书验证
-        ClientBuilder.sslSocketFactory(createSSLSocketFactory());
+        ClientBuilder.sslSocketFactory(createSSLSocketFactory(),new TrustAllCerts());
         ClientBuilder.hostnameVerifier(new HostnameVerifier() {
             @Override
             public boolean verify(String hostname, SSLSession session) {

+ 21 - 1
app/src/main/java/com/jld/vod/utils/http/OkHttpUtils.java

@@ -40,6 +40,25 @@ import okhttp3.Response;
  * Created by fxjzzyo on 2017/7/12.
  */
 
+/**
+ * 用于信任所有证书
+ */
+class TrustAllCerts implements X509TrustManager {
+    @Override
+    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+    }
+
+    @Override
+    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+    }
+
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        return new X509Certificate[0];
+    }
+}
+
 public class OkHttpUtils {
     public final static int READ_TIMEOUT = 100;
     public final static int CONNECT_TIMEOUT = 60;
@@ -57,7 +76,8 @@ public class OkHttpUtils {
         ClientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);//连接超时
         ClientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);//写入超时
         //支持HTTPS请求,跳过证书验证
-        ClientBuilder.sslSocketFactory(createSSLSocketFactory());
+        ClientBuilder.sslSocketFactory(createSSLSocketFactory(), new TrustAllCerts());
+
         ClientBuilder.hostnameVerifier(new HostnameVerifier() {
             @Override
             public boolean verify(String hostname, SSLSession session) {

+ 144 - 0
app/src/main/java/com/jld/vod/utils/http/ProgressFragmentRequestBody.java

@@ -0,0 +1,144 @@
+package com.jld.vod.utils.http;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.jld.vod.model.ProgressModel;
+import com.jld.vod.utils.LogUtils;
+
+import java.io.IOException;
+
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import okio.Buffer;
+import okio.BufferedSink;
+import okio.ForwardingSink;
+import okio.Okio;
+import okio.Sink;
+
+/**
+ * Created by zhaofuxin on 2019/9/11.
+ */
+
+public class ProgressFragmentRequestBody extends RequestBody {
+    public static final int UPDATE = 0x01;
+    private RequestBody requestBody;
+    private ProgressListener mListener;
+    private BufferedSink bufferedSink;
+    private Handler myHandler;
+    public ProgressFragmentRequestBody(RequestBody body, ProgressListener listener) {
+        requestBody = body;
+        mListener = listener;
+       if (myHandler==null){
+            myHandler = new MyHandler();
+        }
+//        WorkerThread wt = new WorkerThread() ;
+//        wt.start() ;
+    }
+
+//
+//    class WorkerThread extends Thread{
+//        @Override
+//        public void run() {
+//            super.run();
+//            Looper.prepare() ;
+//            myHandler = new Handler(){
+//                @Override
+//                public void handleMessage(@NonNull Message msg) {
+//                    super.handleMessage(msg);
+//                    switch (msg.what) {
+//                        case UPDATE:
+//                            ProgressModel progressModel = (ProgressModel) msg.obj;
+//                            LogUtils.INSTANCE.logD("bytesWritten=" + progressModel.getCurrentBytes() + "contentLength" + progressModel.getContentLength());
+//                            if (mListener != null)
+//                                mListener.onProgress(progressModel.getCurrentBytes(), progressModel.getContentLength(), progressModel.isDone());
+//                            break;
+//                    }
+//                }
+//            };
+//            Looper.loop() ;
+//        }
+//    }
+
+    class MyHandler extends Handler {
+
+        public MyHandler() {
+            super(Looper.getMainLooper());
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what){
+                case UPDATE:
+                    ProgressModel progressModel = (ProgressModel) msg.obj;
+                   // LogUtils.INSTANCE.logD("bytesWritten="+progressModel.getCurrentBytes()+"contentLength"+ progressModel.getContentLength());
+                    if (mListener!=null)mListener.onProgress(progressModel.getCurrentBytes(),progressModel.getContentLength(),progressModel.isDone());
+                    break;
+
+            }
+        }
+
+
+    }
+
+    @Override
+    public MediaType contentType() {
+        return requestBody.contentType();
+    }
+
+    @Override
+    public long contentLength() throws IOException {
+        return requestBody.contentLength();
+    }
+
+    @Override
+    public void writeTo(BufferedSink sink) throws IOException {
+
+        if (bufferedSink==null){
+            bufferedSink = Okio.buffer(sink(sink));
+        }
+        //写入
+        requestBody.writeTo(bufferedSink);
+        //刷新
+        bufferedSink.flush();
+    }
+
+    private Sink sink(BufferedSink sink) {
+
+        return new ForwardingSink(sink) {
+            long bytesWritten = 0L;
+            long contentLength = 0L;
+            @Override
+            public void write(Buffer source, long byteCount) throws IOException {
+                super.write(source, byteCount);
+                if (contentLength==0){
+                    contentLength = contentLength();
+                }
+                bytesWritten += byteCount;
+               // LogUtils.INSTANCE.logD("bytesWritten="+bytesWritten+"contentLength"+contentLength);
+                //回调
+//                Message msg = Message.obtain();
+//                msg.what = UPDATE;
+//                msg.obj =  new ProgressModel(bytesWritten,contentLength,bytesWritten==contentLength);
+//                myHandler.sendMessage(msg);
+               // LogUtils.INSTANCE.logD("isok="+isok);
+              //  sendMsg(msg);
+              //  if (mListener!=null)mListener.onProgress(bytesWritten,contentLength,bytesWritten==contentLength);
+            }
+        };
+    }
+
+    private void sendMsg(Message msg)
+    {
+       boolean isOk =  myHandler.sendMessage(msg);
+       if (!isOk)
+       {
+           myHandler.sendMessage(msg);
+       }
+    }
+
+}

+ 11 - 3
app/src/main/java/com/jld/vod/utils/http/RetrofitUtils.kt

@@ -3,10 +3,8 @@ package com.jld.vod.utils.http
 import com.google.gson.GsonBuilder
 import com.jld.vod.base.MyApplication
 import com.jld.vod.config.Config
-import com.jld.vod.model.bean.*
 import com.jld.vod.interfaces.remote.Apis
-import com.jld.vod.utils.http.FileRequestBody
-import com.jld.vod.utils.http.RetrofitCallback
+import com.jld.vod.model.bean.*
 import io.reactivex.android.schedulers.AndroidSchedulers
 import io.reactivex.disposables.Disposable
 import io.reactivex.schedulers.Schedulers
@@ -336,6 +334,7 @@ object RetrofitUtils {
     fun findGameByNoInstall(terminal :String,observer: (userBean: BaseBean<List<FindGameByNoInstallBean>>) -> Unit, error: (t: Throwable) -> Unit): Disposable {
         val disposable = apis.findGameByNoInstall(terminal).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
             .subscribe(observer, error)
+//        Lo
         return disposable
     }
 
@@ -452,5 +451,14 @@ object RetrofitUtils {
                 .subscribe(observer, error)
         return disposable
     }
+
+    /**
+     * 时区和时间
+     */
+    fun findTime( observer: (userBean: BaseBean<SysFindTimeBean>) -> Unit, error: (t: Throwable) -> Unit): Disposable {
+        val disposable = apis.findTime().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+            .subscribe(observer, error)
+        return disposable
+    }
 }
 

+ 2 - 3
app/src/main/java/com/jld/vod/view/HomeActivity.kt

@@ -65,7 +65,6 @@ class HomeActivity : BaseActivity() {
     override fun initView() {
         super.initView()
 
-
         //开启获取经纬度服务
         startService(Intent(this,LatLongService::class.java))
         //开启固定广告服务
@@ -162,8 +161,8 @@ class HomeActivity : BaseActivity() {
                         bpos.putInt("pos", pos)
                         bpos.putString("rtName", res[pos].rtName)
 
-                        LogUtils.logD("rtName"+res[pos].rtName)
-                        LogUtils.logD("rtName"+res)
+                       // LogUtils.logD("rtName"+res[pos].rtName)
+                        //LogUtils.logD("rtName"+res)
                         //旋转动画
                         ratateImage!!.startSpin()
 

+ 16 - 12
app/src/main/java/com/jld/vod/view/MainActivity.kt

@@ -93,6 +93,8 @@ class MainActivity : BaseActivity() {
         {
             tv_plate.setText(carNum)
         }
+        //初始化版本号
+
 
         //动态背景图片
         val main_bg_img = SharedPrefUtils.getString(this,"main_bg_img")
@@ -346,8 +348,9 @@ class MainActivity : BaseActivity() {
      */
     private fun initIconRes() {
         viewModel.findAllModularRotateImgBeanLiveData.observe(this){it->
-            //LogUtils.logD("initIconRes"+it)
-            if(it.data!!.size != 0) {
+            LogUtils.logD("initIconRes"+it)
+
+            if(it.code==20000 && it.data!!.size != 0) {
                 mUpCircleMenuLayout!!.setMenuItemIconsAndTexts(it.data)
                 mAllModularRotateImgBean = it.data
                 //LogUtils.logD("AllModularRotateImgBean"+it.data+"==" + it.data.get(pos).mid+"=="+pos)
@@ -513,16 +516,17 @@ class MainActivity : BaseActivity() {
         super.onStart()
         //初始化当前时间
         LogUtils.logD("初始化当前时间")
-        var dateString =  SharedPrefUtils.getString(this,"newDate")
-        Log.d("onStart", "onStart: $dateString")
-        Log.d("onStart——系统时间", "onStart:"+System.currentTimeMillis())
-//        var date: Date = Date(System.currentTimeMillis())
-        var dateLong =0L
-        try {
-             dateLong = dateString.toLong()
-        } catch ( e : NumberFormatException){
-            Log.e(TAG, "onStart: ", e)
-        }
+//        var dateString =  SharedPrefUtils.getString(this,"newDate")
+//        Log.d("onStart", "onStart: $dateString")
+//        Log.d("onStart——系统时间", "onStart:"+System.currentTimeMillis())
+////        var date: Date = Date(System.currentTimeMillis())
+//        var dateLong =0L
+//        try {
+//             dateLong = dateString.toLong()
+//        } catch ( e : NumberFormatException){
+//            Log.e(TAG, "onStart: ", e)
+//        }
+        var dateLong =  System.currentTimeMillis()
         var date: Date = Date(dateLong)
         val time = DateUtils.getTime(date)
         val dates = DateUtils.getDate(date)

+ 3 - 0
app/src/main/java/com/jld/vod/view/MusicPlayActivity.kt

@@ -504,11 +504,14 @@ class MusicPlayActivity : BaseActivity(),View.OnClickListener {
 //                }
                 this.audio = audioList[index]
                 play(audio)
+
             }
         }
         this.audio = audioList[musicId]
         play(audio)
+        LogUtils.logD("当前音乐"+audioList[musicId].name+ "---------"+audioList[musicId].author)
         this.runOnUiThread {
+
             tv_music_name.setText(audioList[musicId].name)
             tv_music_singer.setText(audioList[musicId].author)
         }

+ 398 - 189
app/src/main/java/com/jld/vod/view/PostFileActivity.kt

@@ -3,35 +3,30 @@ package com.jld.vod.view
 import android.app.ProgressDialog
 import android.content.Context
 import android.os.Handler
+import android.os.Looper
 import android.os.Message
 import android.widget.Toast
-import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.ViewModelProviders
 import androidx.lifecycle.observe
+import com.google.gson.Gson
 import com.jld.vod.R
 import com.jld.vod.base.BaseActivity
 import com.jld.vod.config.Config
 import com.jld.vod.model.bean.BaseBean
-import com.jld.vod.model.bean.GameResByNotUploaded
-import com.jld.vod.model.bean.MovieResByNotUploaded
-import com.jld.vod.model.bean.MusicResByNotUploaded
+import com.jld.vod.model.bean.ResultBean
 import com.jld.vod.model.event.UsbStatusChangeEvent
+import com.jld.vod.utils.HttpFileUtils
 import com.jld.vod.utils.LogUtils
 import com.jld.vod.utils.http.HttpFileUtil
+import com.jld.vod.utils.http.ProgressFragmentRequestBody
 import com.jld.vod.utils.http.ProgressListener
-import com.jld.vod.utils.http.RetrofitCallback
 import com.jld.vod.viewmodel.MainViewModel
 import com.jld.vod.viewmodel.PostFileViewModel
-import com.jld.vod.viewmodel.SplashViewModel
 import okhttp3.Callback
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
-import retrofit2.Call
-import retrofit2.Response
-import java.io.File
-import java.io.IOException
+import java.io.*
 
 /**
  * @author ZhaoFuXin
@@ -41,87 +36,88 @@ import java.io.IOException
  */
 class PostFileActivity : BaseActivity() {
 
-    private var strFilePath:String? = null
+    private var strFilePath: String? = null
+    private var gson: Gson? = null
     private lateinit var postFileViewModel: PostFileViewModel
     private lateinit var mainViewModel: MainViewModel
     private var progressdialog: ProgressDialog? = null
     private var totalitem = 0//数据大小
     private var lenitem = 1//当前上传数据下标
     private var flag = true
-    private var context:Context? = null
-    private val mHandler = Handler(Handler.Callback {
-        when(it.what)
-        {
-             0->{
-                 val id: Int = it.arg1
-                 val file = it.obj as String
-
-                 progressdialog!!.setTitle("Uploading Movie ( $lenitem/$totalitem )")
-                 progressdialog!!.progress = id
-                 progressdialog!!.setMessage(file)
-                 progressdialog!!.setCancelable(false)
-                 progressdialog!!.setCanceledOnTouchOutside(false)
-                 progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
-                 progressdialog!!.show()
-
-                 if (id == 100)
-                 {
-                     progressdialog!!.dismiss()
-                 }
-             }
-            1->{
-                val id: Int = it.arg1
-                val file = it.obj as String
-                progressdialog!!.setTitle("Uploading Music ( $lenitem/$totalitem )")
-                progressdialog!!.progress = id
-                progressdialog!!.setMessage(file)
-                progressdialog!!.setCancelable(false)
-                progressdialog!!.setCanceledOnTouchOutside(false)
-                progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
-                progressdialog!!.show()
-
-                if (id == 100)
-                {
-                    progressdialog!!.dismiss()
+    private var context: Context? = null
+    private lateinit var myHandler: Handler
+    private var progressitem:Int = 0
+    private val mHandler = object : Handler() {
+        override fun handleMessage(msg: Message) {
+            super.handleMessage(msg)
+
+            when (msg.what) {
+                0 -> {
+                    val id: Int = msg.arg1
+                    val file = msg.obj as String
+                    // LogUtils.logD("id===$id====file==$file")
+                    progressdialog!!.setTitle("Uploading Movie ( $lenitem/$totalitem )")
+                    progressdialog!!.progress = id
+                    progressdialog!!.setMessage(file)
+                    progressdialog!!.setCancelable(false)
+                    progressdialog!!.setCanceledOnTouchOutside(false)
+                    progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
+                    progressdialog!!.show()
+
+                    if (id == 100) {
+                        progressdialog!!.dismiss()
+                    }
                 }
-            }
-            2->{
-                val id: Int = it.arg1
-                val file = it.obj as String
-
-                progressdialog!!.setTitle("Uploading Game ( $lenitem/$totalitem )")
-                progressdialog!!.progress = id
-                progressdialog!!.setMessage(file)
-                progressdialog!!.setCancelable(false)
-                progressdialog!!.setCanceledOnTouchOutside(false)
-                progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
-                progressdialog!!.show()
-
-                if (id == 100)
-                {
-                    progressdialog!!.dismiss()
+                1 -> {
+                    val id: Int = msg.arg1
+                    val file = msg.obj as String
+                    progressdialog!!.setTitle("Uploading Music ( $lenitem/$totalitem )")
+                    progressdialog!!.progress = id
+                    progressdialog!!.setMessage(file)
+                    progressdialog!!.setCancelable(false)
+                    progressdialog!!.setCanceledOnTouchOutside(false)
+                    progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
+                    progressdialog!!.show()
+
+                    if (id == 100) {
+                        progressdialog!!.dismiss()
+                    }
                 }
-            }
-            3->{
-                val id: Int = it.arg1
-                val file = it.obj as String
-
-                progressdialog!!.setTitle("Uploading Ads ( $lenitem/$totalitem )")
-                progressdialog!!.progress = id
-                progressdialog!!.setMessage(file)
-                progressdialog!!.setCancelable(false)
-                progressdialog!!.setCanceledOnTouchOutside(false)
-                progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
-                progressdialog!!.show()
-
-                if (id == 100)
-                {
-                    progressdialog!!.dismiss()
+                2 -> {
+                    val id: Int = msg.arg1
+                    val file = msg.obj as String
+
+                    progressdialog!!.setTitle("Uploading Game ( $lenitem/$totalitem )")
+                    progressdialog!!.progress = id
+                    progressdialog!!.setMessage(file)
+                    progressdialog!!.setCancelable(false)
+                    progressdialog!!.setCanceledOnTouchOutside(false)
+                    progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
+                    progressdialog!!.show()
+
+                    if (id == 100) {
+                        progressdialog!!.dismiss()
+                    }
+                }
+                3 -> {
+                    val id: Int = msg.arg1
+                    val file = msg.obj as String
+
+                    progressdialog!!.setTitle("Uploading Ads ( $lenitem/$totalitem )")
+                    progressdialog!!.progress = id
+                    progressdialog!!.setMessage(file)
+                    progressdialog!!.setCancelable(false)
+                    progressdialog!!.setCanceledOnTouchOutside(false)
+                    progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
+                    progressdialog!!.show()
+
+                    if (id == 100) {
+                        progressdialog!!.dismiss()
+                    }
                 }
             }
         }
-        false
-    })
+    }
 
 
     override fun getLayoutId(): Int {
@@ -134,9 +130,18 @@ class PostFileActivity : BaseActivity() {
 
         context = this
         progressdialog = ProgressDialog(this@PostFileActivity)
+        //        if (myHandler==null){
+//            myHandler = new MyHandler();
+//        }
+        val WorkerThread = WorkerThread()
+        WorkerThread.start()
     }
+
     override fun initData() {
         super.initData()
+        //初始化gson
+        gson = Gson()
+
         //u盘路径
         val mIntent = intent
         strFilePath = mIntent.getStringExtra("path")
@@ -145,7 +150,8 @@ class PostFileActivity : BaseActivity() {
         EventBus.getDefault().register(this)
 
         //初始化viewmodel
-        postFileViewModel = ViewModelProvider.AndroidViewModelFactory(application).create(PostFileViewModel::class.java)
+        postFileViewModel = ViewModelProvider.AndroidViewModelFactory(application)
+            .create(PostFileViewModel::class.java)
 
 
         //获取未上传电影列表
@@ -165,32 +171,35 @@ class PostFileActivity : BaseActivity() {
      * 初始化电影列表
      */
     private fun initMovieList() {
-        postFileViewModel.findResByNotUploadedmovieliveData.observe(this){res->
-            LogUtils.logD("initMovieList"+res.data)
+        postFileViewModel.findResByNotUploadedmovieliveData.observe(this) { res ->
+            LogUtils.logD("initMovieList" + res.data)
             when (res?.code) {
                 BaseBean.SUCCESS -> {
                     finishLoading()
-                    if (res.data!!.size != 0)
-                    {
-                        for ((index,data) in res.data.withIndex())
-                        {
-                            val file = File(strFilePath, data.movieId.toString()+".mp4")
+                    if (res.data!!.size != 0) {
+//                        for ((index, data) in res.data.withIndex()) {
+//                            val file = File(strFilePath, data.movieId.toString() + ".mp4")
+//                            if (file.exists()) {
+//                                totalitem++
+//                            }
+//                        }
+                        for ((index, data) in res.data.withIndex()) {
+                            val file = File(strFilePath, data.movieId.toString() + ".mp4")
                             val mid = data.mid
                             val resId = data.movieId
-                            if (file.exists())
-                            {
+
+                            if (file.exists()) {
                                 //上传电影
-                                postFileMovie(file,mid,resId)
-                            }else{
-                                if (flag)
-                                {
+                                postFileMovie(file, mid, resId)
+                               // postFileMovieByFragmentUpload(file, mid, resId)
+                            } else {
+                                if (flag) {
                                     flag = false
                                     postFileViewModel.findResByNotUploadedmusic()//继续获取未上传音乐列表
                                 }
-
                             }
                         }
-                    }else{
+                    } else {
                         postFileViewModel.findResByNotUploadedmusic()//继续获取未上传音乐列表
                     }
                 }
@@ -207,31 +216,27 @@ class PostFileActivity : BaseActivity() {
      * 初始化音乐列表
      */
     private fun initMusicList() {
-        postFileViewModel.findResByNotUploadedmusicliveData.observe(this){res->
+        postFileViewModel.findResByNotUploadedmusicliveData.observe(this) { res ->
             when (res?.code) {
                 BaseBean.SUCCESS -> {
                     flag = true
                     finishLoading()
-                    if (res.data!!.size != 0)
-                    {
-                        for ((index,data) in res.data.withIndex())
-                        {
-                            val file = File(strFilePath, data.musicId.toString()+".mp3")
+                    if (res.data!!.size != 0) {
+                        for ((index, data) in res.data.withIndex()) {
+                            val file = File(strFilePath, data.musicId.toString() + ".mp3")
                             val mid = data.mid
                             val resId = data.musicId
-                            if (file.exists())
-                            {
+                            if (file.exists()) {
                                 //上传音乐
-                                postFileMusic(file,mid,resId)
-                            }else{
-                                if (flag)
-                                {
+                                postFileMusic(file, mid, resId)
+                            } else {
+                                if (flag) {
                                     flag = false
                                     postFileViewModel.findResByNotUploadedadvert()//继续获取未上传广告列表
                                 }
                             }
                         }
-                    }else{
+                    } else {
                         postFileViewModel.findResByNotUploadedadvert()//继续获取未上传广告列表
                     }
                 }
@@ -243,35 +248,32 @@ class PostFileActivity : BaseActivity() {
             }
         }
     }
+
     /**
      * 初始化广告列表
      */
     private fun initAdvertList() {
-        postFileViewModel.findResByNotUploadedadvertliveData.observe(this){res->
-            LogUtils.logD("initAdvertList"+res.data)
+        postFileViewModel.findResByNotUploadedadvertliveData.observe(this) { res ->
+            LogUtils.logD("initAdvertList" + res.data)
             when (res?.code) {
                 BaseBean.SUCCESS -> {
                     flag = true
                     finishLoading()
-                    if (res.data!!.size != 0)
-                    {
-                        for ((index,data) in res.data.withIndex())
-                        {
-                            val file = File(strFilePath, data.aid.toString()+".mp4")
+                    if (res.data!!.size != 0) {
+                        for ((index, data) in res.data.withIndex()) {
+                            val file = File(strFilePath, data.aid.toString() + ".mp4")
                             val resId = data.aid
-                            if (file.exists())
-                            {
+                            if (file.exists()) {
                                 //上传广告
-                                postFileAdvert(file,123456L,resId)
-                            }else{
-                                if (flag)
-                                {
+                                postFileAdvert(file, 123456L, resId)
+                            } else {
+                                if (flag) {
                                     flag = false
                                     postFileViewModel.findResByNotUploadedgame()//继续获取未上传游戏列表
                                 }
                             }
                         }
-                    }else{
+                    } else {
                         postFileViewModel.findResByNotUploadedgame()//继续获取未上传游戏列表
                     }
                 }
@@ -289,26 +291,23 @@ class PostFileActivity : BaseActivity() {
      */
     private fun initGameList() {
         //监听游戏列表
-        postFileViewModel.findResByNotUploadedgameliveData.observe(this){res->
-           // LogUtils.logD("game"+res)
+        postFileViewModel.findResByNotUploadedgameliveData.observe(this) { res ->
+            // LogUtils.logD("game"+res)
             when (res?.code) {
                 BaseBean.SUCCESS -> {
                     finishLoading()
 
-                    if (res.data!!.size != 0)
-                    {
-                        for ((index,data) in res.data.withIndex())
-                        {
-                            val file = File(strFilePath, data.gid.toString()+".apk")
+                    if (res.data!!.size != 0) {
+                        for ((index, data) in res.data.withIndex()) {
+                            val file = File(strFilePath, data.gid.toString() + ".apk")
                             val mid = data.mid
                             val resId = data.gid
-                            if (file.exists())
-                            {
+                            if (file.exists()) {
                                 //上传游戏
-                                postFileGame(file,mid,resId)
+                                postFileGame(file, mid, resId)
                             }
                         }
-                    }else{
+                    } else {
                         LogUtils.logD("上传数据为空")
                     }
                 }
@@ -320,20 +319,20 @@ class PostFileActivity : BaseActivity() {
             }
         }
     }
+
     /**
      * 上传游戏
      */
-    private fun postFileGame(file: File,mid : Long,resId:Long) {
+    private fun postFileGame(file: File, mid: Long, resId: Long) {
         totalitem++
-        HttpFileUtil.postFile(this, Config.ApiBaseUrl + "/game/upload",
+        HttpFileUtil.getInstance().postFile(this, Config.ApiBaseUrl + "/game/upload",
             object : ProgressListener {
                 override fun onProgress(currentBytes: Long, contentLength: Long, done: Boolean) {
                     //  Log.i(TAG, "file="+file.getName()+"id="+id+"currentBytes==" + currentBytes + "==contentLength==" + contentLength + "==done==" + done);
                     val progress = (currentBytes * 100 / contentLength).toInt()
                     if (done == true) {
                         lenitem++
-                        if (lenitem == totalitem)
-                        {
+                        if (lenitem == totalitem) {
                             //数据下标重置
                             lenitem = 1
                             totalitem = 0
@@ -356,23 +355,23 @@ class PostFileActivity : BaseActivity() {
                     val result = response.body!!.string()
                     LogUtils.logD(result.toString())
                 }
-            }, file,mid,resId)
+            }, file, mid, resId
+        )
     }
 
     /**
      * 上传音乐
      */
-    private fun postFileMusic(file: File,mid : Long,resId:Long) {
+    private fun postFileMusic(file: File, mid: Long, resId: Long) {
         totalitem++
-        HttpFileUtil.postFile(this, Config.ApiBaseUrl + "/music/upload",
+        HttpFileUtil.getInstance().postFile(this, Config.ApiBaseUrl + "/music/upload",
             object : ProgressListener {
                 override fun onProgress(currentBytes: Long, contentLength: Long, done: Boolean) {
                     //  Log.i(TAG, "file="+file.getName()+"id="+id+"currentBytes==" + currentBytes + "==contentLength==" + contentLength + "==done==" + done);
                     val progress = (currentBytes * 100 / contentLength).toInt()
                     if (done == true) {
                         lenitem++
-                        if (lenitem == totalitem)
-                        {
+                        if (lenitem == totalitem) {
                             //数据下标重置
                             lenitem = 1
                             totalitem = 0
@@ -395,72 +394,84 @@ class PostFileActivity : BaseActivity() {
                     val result = response.body!!.string()
                     LogUtils.logD(result.toString())
                 }
-            }, file,mid,resId)
+            }, file, mid, resId
+        )
     }
 
     /**
      * 上传音乐
      */
-    private fun postFileAdvert(file: File,mid : Long,resId:Long) {
+    private fun postFileAdvert(file: File, mid: Long, resId: Long) {
         totalitem++
-        HttpFileUtil.postFile(this, Config.ApiBaseUrl + "/advert/upload",
-                object : ProgressListener {
-                    override fun onProgress(currentBytes: Long, contentLength: Long, done: Boolean) {
-                        //  Log.i(TAG, "file="+file.getName()+"id="+id+"currentBytes==" + currentBytes + "==contentLength==" + contentLength + "==done==" + done);
-                        val progress = (currentBytes * 100 / contentLength).toInt()
-                        if (done == true) {
-                            lenitem++
-                            if (lenitem == totalitem)
-                            {
-                                //数据下标重置
-                                lenitem = 1
-                                totalitem = 0
-                                postFileViewModel.findResByNotUploadedgame()//继续获取未上传游戏列表
-                            }
+        HttpFileUtil.getInstance().postFile(this, Config.ApiBaseUrl + "/advert/upload",
+            object : ProgressListener {
+                override fun onProgress(currentBytes: Long, contentLength: Long, done: Boolean) {
+                    //  Log.i(TAG, "file="+file.getName()+"id="+id+"currentBytes==" + currentBytes + "==contentLength==" + contentLength + "==done==" + done);
+                    val progress = (currentBytes * 100 / contentLength).toInt()
+                    if (done == true) {
+                        lenitem++
+                        if (lenitem == totalitem) {
+                            //数据下标重置
+                            lenitem = 1
+                            totalitem = 0
+                            postFileViewModel.findResByNotUploadedgame()//继续获取未上传游戏列表
                         }
-                        val msg: Message = mHandler.obtainMessage()
-                        msg.arg1 = progress
-                        msg.what = 3
-                        msg.obj = file.name
-                        mHandler.sendMessage(msg)
                     }
-                }, object : Callback {
-            override fun onFailure(call: okhttp3.Call, e: IOException) {
-                LogUtils.logE(e.toString())
-            }
+                    val msg: Message = mHandler.obtainMessage()
+                    msg.arg1 = progress
+                    msg.what = 3
+                    msg.obj = file.name
+                    mHandler.sendMessage(msg)
+                }
+            }, object : Callback {
+                override fun onFailure(call: okhttp3.Call, e: IOException) {
+                    LogUtils.logE(e.toString())
+                }
 
-            @Throws(IOException::class)
-            override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) {
-                val result = response.body!!.string()
-                LogUtils.logD(result.toString())
-            }
-        }, file,mid,resId)
+                @Throws(IOException::class)
+                override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) {
+                    val result = response.body!!.string()
+                    LogUtils.logD(result.toString())
+                }
+            }, file, mid, resId
+        )
     }
+
     /**
      * 上传电影
      */
-    private fun postFileMovie(file: File,mid : Long,resId:Long) {
+
+    private fun postFileMovie(file: File, mid: Long, resId: Long) {
         totalitem++
-        HttpFileUtil.postFile(this, Config.ApiBaseUrl + "/movie/upload",
+        HttpFileUtil.getInstance().postFile(this, Config.ApiBaseUrl + "/movie/upload",
             object : ProgressListener {
                 override fun onProgress(currentBytes: Long, contentLength: Long, done: Boolean) {
-                    //  Log.i(TAG, "file="+file.getName()+"id="+id+"currentBytes==" + currentBytes + "==contentLength==" + contentLength + "==done==" + done);
+                    //  Log.i("PostFile====", "file="+file.getName()+"currentBytes==" + currentBytes + "==contentLength==" + contentLength + "==done==" + done);
                     val progress = (currentBytes * 100 / contentLength).toInt()
-                    if (done == true) {
-                        lenitem++
-                        if (lenitem == totalitem)
-                        {
+                    if (done) {
+
+                        if (lenitem == totalitem) {
                             //数据下标重置
                             lenitem = 1
                             totalitem = 0
                             postFileViewModel.findResByNotUploadedmusic()//继续获取未上传音乐列表
                         }
+                        lenitem++
                     }
-                    val msg: Message = mHandler.obtainMessage()
-                    msg.arg1 = progress
-                    msg.what = 0
-                    msg.obj = file.name
-                    mHandler.sendMessage(msg)
+                    if (progress > progressitem)
+                    {
+                        progressitem = progress
+                        val msg: Message = mHandler.obtainMessage()
+                        msg.arg1 = progress
+                        msg.what = 0
+                        msg.obj = file.name
+                        mHandler.sendMessage(msg)
+                        if (progress >= 100)
+                        {
+                            progressitem = 0
+                        }
+                    }
+
                 }
             }, object : Callback {
                 override fun onFailure(call: okhttp3.Call, e: IOException) {
@@ -472,12 +483,210 @@ class PostFileActivity : BaseActivity() {
                     val result = response.body!!.string()
                     LogUtils.logD(result.toString())
                 }
-            }, file,mid,resId)
+            }, file, mid, resId
+        )
     }
 
+
+    /**
+     * 电影上传分片
+     */
+    private fun postFileMovieByFragmentUpload(file: File, mid: Long, resId: Long) {
+        LogUtils.logD("进入分片上传")
+//        Thread {
+//            totalitem++
+//        }.start()
+
+////        //触发第一次UI
+        var msg: Message = myHandler.obtainMessage()
+        msg.arg1 = 0//当前进度  按分片进度进行
+        msg.what = 123
+        msg.obj = file.name
+        myHandler.sendMessage(msg)
+
+        //将数据分片
+        var s1 = file.name //文件名称
+        //计算文件总分片大小
+        var length = file.length() //当前文件大小
+        var total = 0 //总分片大小
+        var chunkSize = 100 * 1024 * 1024 //分片大小 最好是long型
+        total = if (length % chunkSize == 0L) {
+            (length / chunkSize).toInt()
+        } else {
+            (length / chunkSize).toInt() + 1
+        }
+        LogUtils.logD("当前分片数大小:$total")
+        var tmp = true //读取进度结束符
+        var index = 0
+        //获取缓存地址
+//        val cachePath = cacheDir
+        var uploadIndex = 0  //当前已上传的分片
+        while (tmp) {//这里true一直在循环就阻塞了
+            //判断当前已分个数 和已上传分片个数差值  现在只允许4个同时上传
+            if ((index - uploadIndex) < 1) {  //(index - uploadIndex) < 1
+//                Thread(Runnable {
+                var offset = chunkSize * index * 1L
+
+                var block: ByteArray? = getBlock(offset, file, chunkSize)
+                if (block != null) {
+                    var filePath =
+                        cacheDir.absolutePath + "/" + s1 + "_" + index + ".tmp" //缓存目录 外部自定义
+                    var out: OutputStream = FileOutputStream(filePath)
+                    var inputStream: InputStream = ByteArrayInputStream(block)
+                    var buff = ByteArray(1024)
+                    var len = 0
+                    while (inputStream.read(buff).also { len = it } != -1) {
+                        out.write(buff, 0, len)
+                    }
+                    inputStream.close()
+                    out.close()
+                    LogUtils.logD("开始上传" + filePath)
+                    HttpFileUtils.postFileByFragmentUpload(
+                        Config.ApiBaseUrl + "/movie/uploadFile",
+                        object : ProgressListener {
+                            override fun onProgress(
+                                currentBytes: Long,
+                                contentLength: Long,
+                                done: Boolean
+                            ) {
+                                //UI进度展示问题
+                                //LogUtils.logD("当前进度:currentBytes=$currentBytes====contentLength=$contentLength===" + done)
+
+//                                var msg: Message = myHandler.obtainMessage()
+//                                msg.arg1 = progress//当前进度  按分片进度进行
+//                                msg.what = 123
+//                                msg.obj = file.name
+//                                myHandler.sendMessage(msg)
+                                //一会在处理...
+                            }
+                        },
+                        object : Callback {
+                            override fun onFailure(call: okhttp3.Call, e: IOException) {
+                                LogUtils.logE(e.toString())
+                            }
+
+                            @Throws(IOException::class)
+                            override fun onResponse(
+                                call: okhttp3.Call,
+                                response: okhttp3.Response
+                            ) {
+                                val result = response.body!!.string()
+                                //      LogUtils.logD(result.toString())
+                                val resultData = gson!!.fromJson(result, ResultBean::class.java)
+                                //设置当前已完成的片数
+                                if (resultData.flag) {
+                                    //估计会有线程安全问题
+                                    uploadIndex++//计数已上传个数
+                                    File(filePath).delete()//删除缓存文件
+                                    //根据返回值判断是否上传完成
+                                    if (resultData.message == "1") {
+                                        // 通知
+                                        var msg: Message = myHandler.obtainMessage()
+                                        msg.what = 4
+                                        myHandler.sendMessage(msg)
+                                    }
+                                    // UI更新
+                                    var msg: Message = myHandler.obtainMessage()
+                                    msg.arg1 = (uploadIndex * 100 / total)//当前进度  按分片进度进行
+                                    msg.what = 123
+                                    msg.obj = file.name
+                                    myHandler.sendMessage(msg)
+                                    LogUtils.logD("当前上传进度uploadIndex=$uploadIndex==total=$total:" + (uploadIndex * 100 / total))
+                                }
+                            }
+                        }, File(filePath), total, chunkSize * 1L, "111", s1, index, resId, mid
+                    )
+                    index++
+                } else {
+                    tmp = false
+                }
+            }
+        }
+    }
+
+    inner class WorkerThread : Thread() {
+        override fun run() {
+            super.run()
+            Looper.prepare()
+            myHandler = object : Handler() {
+                override fun handleMessage(msg: Message) {
+                    super.handleMessage(msg)
+                    when (msg.what) {
+                        123 -> {
+                            val id: Int = msg.arg1
+                            val file = msg.obj as String
+                            //LogUtils.logD("id===$id====file==$file lenitem==$lenitem====totalitem==$totalitem ")
+                            progressdialog!!.setTitle("Uploading Movie ( $lenitem/$totalitem )")
+                            progressdialog!!.progress = id
+                            progressdialog!!.setMessage(file)
+                            progressdialog!!.setCancelable(false)
+                            progressdialog!!.setCanceledOnTouchOutside(false)
+                            progressdialog!!.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
+                            progressdialog!!.show()
+                            if (id == 100) {
+                                progressdialog!!.dismiss()
+                            }
+                        }
+                        4->{
+                            lenitem++
+                            if (lenitem == totalitem) {
+                                //数据下标重置
+                                lenitem = 1
+                                totalitem = 0
+                                postFileViewModel.findResByNotUploadedmusic()//继续获取未上传音乐列表
+                            }
+                        }
+                        5->{
+                            lenitem++
+                        }
+                    }
+                }
+            }
+            Looper.loop()
+        }
+    }
+
+    /**
+     * 文件分块工具
+     *
+     * @param offset    起始偏移位置
+     * @param file      文件
+     * @param blockSize 分块大小
+     * @return 分块数据
+     */
+    private fun getBlock(offset: Long, file: File?, blockSize: Int): ByteArray? {
+        val result = ByteArray(blockSize)
+        var accessFile: RandomAccessFile? = null
+        try {
+            accessFile = RandomAccessFile(file, "r")
+            accessFile.seek(offset)
+            val readSize: Int = accessFile.read(result)
+            return if (readSize == -1) {
+                null
+            } else if (readSize == blockSize) {
+                result
+            } else {
+                val tmpByte = ByteArray(readSize)
+                System.arraycopy(result, 0, tmpByte, 0, readSize)
+                tmpByte
+            }
+        } catch (e: IOException) {
+            e.printStackTrace()
+        } finally {
+            if (accessFile != null) {
+                try {
+                    accessFile.close()
+                } catch (e1: IOException) {
+                }
+            }
+        }
+        return null
+    }
+
+
     override fun onDestroy() {
         super.onDestroy()
-        progressdialog!!.dismiss()
+          progressdialog!!.dismiss()
         if (EventBus.getDefault().isRegistered(this)) {
             EventBus.getDefault().unregister(this)
         }

+ 11 - 0
app/src/main/java/com/jld/vod/view/SettingsActivity.kt

@@ -10,6 +10,7 @@ import android.view.WindowManager
 import androidx.appcompat.app.AppCompatActivity
 import androidx.preference.Preference
 import androidx.preference.PreferenceFragmentCompat
+import androidx.preference.SwitchPreference
 import com.jld.vod.R
 import com.jld.vod.config.Config
 import com.jld.vod.model.event.ReceiveEvent
@@ -83,6 +84,7 @@ class SettingsActivity : AppCompatActivity() {
             sendSocketManager!!.startUdpConnection()
 
             setPreferencesFromResource(R.xml.root_preferences, rootKey)
+            val home_settings = findPreference<Preference>("home_settings")
             val wifi_settings = findPreference<Preference>("wifi_settings")
             val seat_settings = findPreference<Preference>("seat_settings")
             val order_system = findPreference<Preference>("order_system")
@@ -90,6 +92,14 @@ class SettingsActivity : AppCompatActivity() {
             val ads_control = findPreference<Preference>("ads_control")
             val screen_control = findPreference<Preference>("screen_control")
 
+            home_settings!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {
+                var i: Intent? = Intent()
+                i = Intent(Settings.ACTION_SETTINGS)
+                startActivity(i)
+
+                false
+            }
+
 
             wifi_settings!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {
                 var i: Intent? = Intent()
@@ -111,6 +121,7 @@ class SettingsActivity : AppCompatActivity() {
                 false
             }
 
+
             //一键广告播放
             ads_control!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, newValue ->
                 LogUtils.logD("preference"+preference+"newValue"+newValue)

+ 54 - 40
app/src/main/java/com/jld/vod/view/SplashActivity.kt

@@ -23,7 +23,6 @@ import com.jld.vod.base.BaseActivity
 import com.jld.vod.config.Config
 import com.jld.vod.interfaces.IDownloadCallBack
 import com.jld.vod.model.bean.*
-import com.jld.vod.service.LatLongService
 import com.jld.vod.service.MyAccessibilityService
 import com.jld.vod.service.SocketService
 import com.jld.vod.utils.AppUtil
@@ -44,6 +43,7 @@ import kotlinx.android.synthetic.main.activity_splash.*
 import okhttp3.Response
 import java.io.File
 import java.util.*
+import kotlin.math.log
 
 
 /**
@@ -121,6 +121,7 @@ class SplashActivity : BaseActivity(){
                     val result: String = message.obj.toString()
                     val resultData = gson!!.fromJson(result, ResultBean::class.java)
                     Log.i(TAG, "handleMessage: 当前位置设置状态$resultData")
+
                     SharedPrefUtils.putString(this, "flagDebug", resultData.code.toString())
                     if(resultData.flag){
                         //进入调试界面
@@ -136,7 +137,7 @@ class SplashActivity : BaseActivity(){
 
                 }
                 5->{
-                    findGameByNoInstall()
+                  //  findGameByNoInstall()
                 }
                 6->{
                     val result: String = message.obj.toString()
@@ -147,6 +148,10 @@ class SplashActivity : BaseActivity(){
                         networkFlag = true
                     }
                 }
+                7->{
+                   //获取座位号
+
+                }
             }
             false
         })
@@ -158,9 +163,7 @@ class SplashActivity : BaseActivity(){
         super.initView()
         progressdialog = ProgressDialog(this@SplashActivity)
         deviceSN =  AppUtil.getDeviceSN()
-
         startService(Intent(this, SocketService::class.java))
-
         //第一次进入标识
         SharedPrefUtils.putBoolean(this,"isFirstShowAds",true)
         //座位号显示
@@ -199,8 +202,11 @@ class SplashActivity : BaseActivity(){
 
         //如果WiFi没有连接,循环判断知道WiFi连接再请求网络
         requestWifiState()
+
         //初始化车辆信息
         initCarInfo()
+        //初始化为安装的游戏
+        initGameByNoInstall()
         //初始游戏安装
         initGameInstall()
         //初始化apk更新
@@ -208,6 +214,7 @@ class SplashActivity : BaseActivity(){
         //初始化卸载游戏
         initDelGame()
 
+
     }
     override fun initEvent() {
         super.initEvent()
@@ -235,17 +242,17 @@ class SplashActivity : BaseActivity(){
                     }
                 })
 
-//        if (!MyAccessibilityService.isRunning) {
-//            //默认开启全局返回服务
-//            Settings.Secure.putString(mContext.getContentResolver(),
-//                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
-//                    "com.jld.vod/com.jld.vod.service.MyAccessibilityService");
-//
-//            Settings.Secure.putInt(mContext.getContentResolver(),
-//                    Settings.Secure.ACCESSIBILITY_ENABLED, 1);
-//            val mIntnet = Intent(mContext,MyAccessibilityService::class.java)
-//            startService(mIntnet)
-//        }
+        if (!MyAccessibilityService.isRunning) {
+            //默认开启全局返回服务
+            Settings.Secure.putString(mContext.getContentResolver(),
+                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+                    "com.jld.vod/com.jld.vod.service.MyAccessibilityService");
+
+            Settings.Secure.putInt(mContext.getContentResolver(),
+                    Settings.Secure.ACCESSIBILITY_ENABLED, 1);
+            val mIntnet = Intent(mContext,MyAccessibilityService::class.java)
+            startService(mIntnet)
+        }
     }
     /**
      * 初始apk版本更新
@@ -298,10 +305,11 @@ class SplashActivity : BaseActivity(){
         Thread(Runnable {
             ajaxInfo(getString(R.string.inspection_application_welcome)+"....",null)
             try {
-                val response: Response = OkHttpUtils.getInstance()
-                        .getData(Config.ApiBaseUrl + "/synchronization/findGameInstalledPath/"+deviceSN)
+                val response: Response = OkHttpUtils.getInstance().getData(Config.ApiBaseUrl + "/synchronization/findGameInstalledPath/"+deviceSN)
                 val res = response.body!!.string()
                 val resultData = gson!!.fromJson(res, TerminalInstallBean::class.java)
+
+                LogUtils.logD("resultData"+resultData.data)
                 if (resultData.flag){
                     var ids:StringBuilder= StringBuilder("")
                     resultData!!.data!!.forEach {
@@ -317,16 +325,18 @@ class SplashActivity : BaseActivity(){
                         val responseDel: Response = OkHttpUtils.getInstance()
                                 .getData(Config.ApiBaseUrl + "/synchronization/delGameInstalledPath/"+ids.toString())
                         val resDel = responseDel.body!!.string()
+
                         val resultData = gson!!.fromJson(resDel, TerminalInstallBean::class.java)
+                        LogUtils.logD("responseDel"+resultData)
                         if(resultData.flag){
                             //放置主线程上运行
-                            handlerGetGameByNoInstall()
+                           // handlerGetGameByNoInstall()
                         }
                     }else {
-                        handlerGetGameByNoInstall()
+                      //  handlerGetGameByNoInstall()
                     }
                 }else{
-                    handlerGetGameByNoInstall()
+                  //  handlerGetGameByNoInstall()
                 }
             } catch (e: Exception) {
                 e.printStackTrace()
@@ -486,8 +496,9 @@ class SplashActivity : BaseActivity(){
                 }else{
                     //地图存在,获取未安装的apk
                     ajaxInfo(getString(R.string.map_loaded_successfully)+"....",null)
-                    Log.i(TAG, "eqCarliveData: 进入游戏未安装检测:"+mapFile.path)
+
                     splashViewmodel.findGameByNoInstall(deviceSN)
+                  //  handlerGetGameByNoInstall()
                 }
             }else if(res == "20001")//未绑定
             {
@@ -593,7 +604,7 @@ class SplashActivity : BaseActivity(){
                     ajaxInfo(getString(R.string.download_games1)+getString(R.string.sum_total)+totalitem+getString(R.string.download_games2) +"${(totalitem-lenitem)}"+ getString(R.string.fail_sum)+failitem,null)
 
                     LogUtils.logD("lenitem$lenitem==$totalitem")
-                    if (lenitem == totalitem)
+                    if (lenitem >= totalitem)
                     {
                         lenitem = 0
                         totalitem = 0
@@ -605,20 +616,20 @@ class SplashActivity : BaseActivity(){
     /**
      * 通知主线程获取未安装apk
      */
-    fun handlerGetGameByNoInstall(){
-        val msg = Message()
-        msg.what = 5
-        mHandler.sendMessage(msg)
-    }
+//    fun handlerGetGameByNoInstall(){
+//        val msg = Message()
+//        msg.what = 5
+//        mHandler.sendMessage(msg)
+//    }
     /**
      * 获取未安装apk
      */
-    fun findGameByNoInstall(){
+    fun initGameByNoInstall(){
         splashViewmodel.findGameByNoInstallliveData.observe(this){ res->
             ajaxInfo(getString(R.string.get_no_app_installed)+"....",null)
             when (res?.code) {
                 BaseBean.SUCCESS -> {
-                    LogUtils.logD("走到这")
+                    //LogUtils.logD("走到这")
                     val list = res.data
                     if(list!!.size != 0) {
                         totalitem = res.data.size//总共待安装的数组数量
@@ -649,6 +660,7 @@ class SplashActivity : BaseActivity(){
                     }
                 }
                 BaseBean.ERROR -> {
+
                     loaderror(false)//弹框设置 点击取消不回调
                     Toast.makeText(this, res.message, Toast.LENGTH_SHORT).show()
                 }
@@ -661,13 +673,14 @@ class SplashActivity : BaseActivity(){
      * 卸载游戏
      */
     private fun initDelGame() {
-        LogUtils.logD("开始卸载游戏")
+
+
 
         splashViewmodel.NuInstallGameLiveData.observe(this) { res ->
             ajaxInfo(getString(R.string.del_game)+"....",null)
             when (res?.code) {
                 BaseBean.SUCCESS -> {
-
+                    LogUtils.logD("开始卸载游戏"+res.data)
                     var delnum = 0
                     if (!res.data.isNullOrEmpty()){
                         LogUtils.logD("res"+res.data)
@@ -759,6 +772,8 @@ class SplashActivity : BaseActivity(){
                     //地图下载完成,获取未安装的apk
                     ajaxInfo(getString(R.string.map_download_successfully)+"....",null)
                     splashViewmodel.findGameByNoInstall(deviceSN)
+
+
                 }
 
                 override fun progress(progress: Int) {
@@ -866,8 +881,9 @@ class SplashActivity : BaseActivity(){
                     offNoWiFiConnectionTiming()//关闭计时
                     splashViewmodel.findLanguageAll()
                     splashViewmodel.getCarInfo()
-                    splashViewmodel.getCarRunInfo()
+                    splashViewmodel.getCarRunInfo(this)
                     splashViewmodel.findHomePageImg()
+                    splashViewmodel.findTime(this)//获取时区和时间
                     finishLoading()
                     flagwifi = false
                     getDebugStatus(deviceSN)
@@ -977,7 +993,7 @@ class SplashActivity : BaseActivity(){
      */
     fun InstallGame(fileName: String?, packageName: String?,gid:Long) //
     {
-        if (fileName == null || fileName.length == 0) {
+        if (fileName == null || fileName.isEmpty()) {
             return
         }
 
@@ -1008,15 +1024,16 @@ class SplashActivity : BaseActivity(){
         }
         override fun packageInstalled(packageName: String?, returnCode: Int) { //如果returnCode == 1就为成功
             LogUtils.logD("GameObserver $packageName 下载完成安装完成.且更新安装状态:$returnCode")
+            lenitem++
             //是否安装成功
             if (returnCode == 1) {
-                lenitem++
+
                 try {
                     splashViewmodel.updateGameInstallState(gid.toString(),packageName!!,deviceSN)
                 }catch (e:Exception) {
                     e.printStackTrace()
                 }
-                if (lenitem == totalitem) {
+                if (lenitem >= totalitem) {
                     lenitem = 0
                     totalitem = 0
 
@@ -1026,14 +1043,11 @@ class SplashActivity : BaseActivity(){
             }else{
                 LogUtils.logD("游戏安装失败?")
                 failitem++
-                lenitem++
-                XToast.error(mContext,getString(R.string.fail_sum))
-
-                if (lenitem == totalitem) {
+                LogUtils.logD("lenitem$lenitem==$totalitem")
+                if (lenitem >= totalitem) {
                     lenitem = 0
                     totalitem = 0
                     splashViewmodel.getNuInstallGame(deviceSN)//开始卸载游戏
-
                 }
             }
 

+ 1 - 0
app/src/main/java/com/jld/vod/view/WebActivity.kt

@@ -114,6 +114,7 @@ class WebActivity : AppCompatActivity() {
         var factoryClass: Class<*>? = null
         try {
 
+
             factoryClass = Class.forName("android.webkit.WebViewFactory")
             var getProviderClassMethod: Method? = null
             var sProviderInstance: Any? = null

+ 2 - 0
app/src/main/java/com/jld/vod/view/adapter/HostAllOrdersAdapter.kt

@@ -14,6 +14,7 @@ import com.jld.vod.R
 import com.jld.vod.model.bean.AllOrdersBean
 import com.jld.vod.model.bean.OrderFoodAllBean
 import com.jld.vod.utils.LogUtils
+import com.jld.vod.utils.SharedPrefUtils
 import com.jld.vod.view.adapter.HostAllOrderItemAdapter
 
 
@@ -92,6 +93,7 @@ class HostAllOrdersAdapter :
                     }
                 }
             })
+
             tv_all_orders_oid.text = itemView.context.getText(R.string.order_number).toString() + ":"+moviet!!.oid
 
             if (moviet.bigOrderStatus == "1")

+ 4 - 4
app/src/main/java/com/jld/vod/view/adapter/MusicListAdapter.kt

@@ -64,16 +64,16 @@ class MusicListAdapter :
         var tv = itemView.findViewById<TextView>(R.id.tv_music_title)
         val ll = itemView.findViewById<LinearLayout>(R.id.ll_item_music)
 
-        fun bindTo(moviet: MusicByMidBean?) {
+        fun bindTo(music: MusicByMidBean?) {
             Glide.with(itemView).load(com.jld.vod.config.Config.ApiBaseUrl+
-                    "/synchronization/previewImg?imgUrl="+moviet!!.musicImgUrl)
+                    "/synchronization/previewImg?imgUrl="+music!!.musicImgUrl)
                 .skipMemoryCache(true).diskCacheStrategy(
                 DiskCacheStrategy.ALL).into(img)
-            tv.text = moviet?.musicName
+            tv.text = music?.musicName
 
 
             ll.setOnClickListener {
-                 itemClickListener!!.onItemClickListener(position, moviet.cid,moviet.mid)
+                 itemClickListener!!.onItemClickListener(position, music.cid,music.mid)
             }
         }
     }

+ 1 - 0
app/src/main/java/com/jld/vod/view/adapter/MyAllOrdersAdapter.kt

@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView
 import com.jld.vod.R
 import com.jld.vod.model.bean.AllOrdersBean
 import com.jld.vod.model.bean.OrderFoodAllBean
+import com.jld.vod.utils.SharedPrefUtils
 import com.jld.vod.view.adapter.MyAllOrderItemAdapter
 
 

+ 3 - 1
app/src/main/java/com/jld/vod/view/fragment/HostAllOrdersFragment.kt

@@ -55,7 +55,9 @@ class HostAllOrdersFragment : BaseFragment() {
          */
         listAdapter.setOnCompleteClickListener(object : HostAllOrdersAdapter.ICompleteItemClickListener{
             override fun onItemClickListener(oid: String?) {
-                myOrderViewModel.oneClickCompletion(oid!!)
+                val split = oid!!.split("-")
+                myOrderViewModel.oneClickCompletion(split[1])
+//                myOrderViewModel.oneClickCompletion(oid!!)
             }
         })
         /**

+ 2 - 1
app/src/main/java/com/jld/vod/view/fragment/HostNewOrdersFragment.kt

@@ -53,7 +53,8 @@ class HostNewOrdersFragment : BaseFragment() {
          */
         listAdapter.setOnCompleteClickListener(object : HostAllOrdersAdapter.ICompleteItemClickListener{
             override fun onItemClickListener(oid: String?) {
-                myOrderViewModel.oneClickCompletion(oid!!)
+                val split = oid!!.split("-")
+                myOrderViewModel.oneClickCompletion(split[1])
             }
         })
         /**

+ 1 - 0
app/src/main/java/com/jld/vod/view/widget/MyJzvdStd.kt

@@ -6,6 +6,7 @@ import android.view.View
 import android.widget.FrameLayout
 import android.widget.ImageView
 import cn.jzvd.JZUtils
+import cn.jzvd.Jzvd
 import cn.jzvd.JzvdStd
 import com.jld.vod.R
 

+ 43 - 13
app/src/main/java/com/jld/vod/viewmodel/SplashViewModel.kt

@@ -1,6 +1,7 @@
 package com.jld.vod.viewmodel
 
 import android.app.Application
+import android.content.Context
 import android.util.Log
 import androidx.lifecycle.AndroidViewModel
 import androidx.lifecycle.MutableLiveData
@@ -10,7 +11,9 @@ import com.jld.vod.db.LanguageDatabase
 import com.jld.vod.model.bean.*
 import com.jld.vod.utils.DateUtils
 import com.jld.vod.utils.LogUtils
+import com.jld.vod.utils.ToastUtils
 import com.jld.vod.utils.http.RetrofitUtils
+import com.xuexiang.xui.widget.toast.XToast
 
 /**
  * Create by zhaofuxin on 2020/7/14
@@ -40,6 +43,8 @@ class SplashViewModel(app: Application) : AndroidViewModel(app) {
     val NuInstallGameLiveData: MutableLiveData<BaseBean<List<NuInstallGameBean>>> = MutableLiveData()
     val updateUserLiveData: MutableLiveData<Boolean> = MutableLiveData()
 
+    val findTimeliveData: MutableLiveData<BaseBean<SysFindTimeBean>> = MutableLiveData()
+
     /**
      * 获取所有语言信息
      */
@@ -120,16 +125,16 @@ class SplashViewModel(app: Application) : AndroidViewModel(app) {
     /**
      * 获取车辆运行信息
      */
-    fun getCarRunInfo(): MutableLiveData<BaseBean<CarRunInfoBean>> {
+    fun getCarRunInfo(mContext:Context): MutableLiveData<BaseBean<CarRunInfoBean>> {
         carRunInfoliveData.postValue(BaseBean.loading(null))
         RetrofitUtils.carRunInfo(
             { t ->
                 when (t.code) {
                     20000 -> {
-                        if (t.data != null)
-                        {
-                            DateUtils.setSystemDate(t.data.date)//设置系统时间
-                        }
+//                        if (t.data != null)
+//                        {
+//                            DateUtils.setSystemDate(t.data.date,mContext)//设置系统时间
+//                        }
                         carRunInfoliveData.postValue(BaseBean.success(t.data))
                     }
                     else -> carRunInfoliveData.postValue(BaseBean.error(t.message, t.data))
@@ -257,25 +262,24 @@ class SplashViewModel(app: Application) : AndroidViewModel(app) {
      * 获取未安装游戏列表
      */
     fun findGameByNoInstall(terminal:String): MutableLiveData<BaseBean<List<FindGameByNoInstallBean>>> {
-        LogUtils.logD("findGameInstalledPath: 正在未安装游戏")
-        findGameByNoInstallliveData.postValue(null)
-        RetrofitUtils.findGameByNoInstall(terminal,
-            { t ->
+        //findGameByNoInstallliveData.postValue(null)
+        RetrofitUtils.findGameByNoInstall(terminal, { t ->
                 when (t.code) {
                     20000 ->{
-
-                        if (t.data != null)
-                        {
-                            LogUtils.logD("findGameInstalledPath: 获取未安装游戏,$t----"+t.data)
+                        if (t.data != null ) {
+                            LogUtils.logD("findGameInstalledPath: 获取未安装游戏,$t----"+t.data+"-----------"+BaseBean.success(t.data))
                             findGameByNoInstallliveData.postValue(BaseBean.success(t.data))
                         }else{
+                            LogUtils.logD("findGameInstalledPath: 没有数据,$t----"+t.data+"-----------"+BaseBean.success(t.data))
                             findGameByNoInstallliveData.postValue(BaseBean.error(t.message, t.data))
+
                         }
                     }
                     else -> findGameByNoInstallliveData.postValue(BaseBean.error(t.message, t.data))
                 }
             },
             { ex ->
+
                 LogUtils.logD("获取游戏未安装,获取游戏未安装$ex")
                 findGameByNoInstallliveData.postValue(BaseBean.error(ex.message!!, null))
             }
@@ -380,4 +384,30 @@ class SplashViewModel(app: Application) : AndroidViewModel(app) {
         )
         return updateUserLiveData
     }
+
+    /**
+     * 获取车辆运行信息
+     */
+    fun findTime(mContext:Context): MutableLiveData<BaseBean<SysFindTimeBean>> {
+        findTimeliveData.postValue(BaseBean.loading(null))
+        RetrofitUtils.findTime(
+            { t ->
+                when (t.code) {
+                    20000 -> {
+                        if (t.data != null)
+                        {
+                            DateUtils.setSystemDate(t.data.timestamp,t.data.timeZone,mContext)//设置系统时间
+                        }
+                        findTimeliveData.postValue(BaseBean.success(t.data))
+                    }
+                    else -> findTimeliveData.postValue(BaseBean.error(t.message, t.data))
+                }
+            },
+            { ex ->
+
+                findTimeliveData.postValue(BaseBean.error(ex.message!!, null))
+            }
+        )
+        return findTimeliveData
+    }
 }

+ 16 - 15
app/src/main/res/layout/activity_musice_play.xml

@@ -125,34 +125,35 @@
                     android:textColor="#fff">
                 </TextView>
             </LinearLayout>
-            <LinearLayout
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="30dp"
+            <GridLayout
+                android:layout_width="500dp"
+                android:layout_height="80dp"
+                android:layout_marginTop="10dp"
                 android:layout_gravity="center">
+
                 <ImageView
                     android:id="@+id/act_audio_player_button_prebuttonId"
+                    android:layout_width="60dp"
+                    android:layout_height="60dp"
                     android:layout_margin="10dp"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:src="@mipmap/music_play_left">
-                </ImageView>
+                    android:layout_marginLeft="100dp"
+                    android:src="@mipmap/music_play_left"/>
                 <ImageView
                     android:id="@+id/act_audio_player_button_playId"
-                    android:paddingRight="30dp"
-                    android:paddingLeft="30dp"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
+                    android:layout_marginStart="40dp"
+                    android:layout_marginEnd="40dp"
+                    android:layout_width="80dp"
+                    android:layout_height="80dp"
                     android:src="@mipmap/music_state_pause">
                 </ImageView>
                 <ImageView
                     android:id="@+id/act_audio_player_button_nextId"
                     android:layout_margin="10dp"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
+                    android:layout_width="60dp"
+                    android:layout_height="60dp"
                     android:src="@mipmap/music_play_right">
                 </ImageView>
-            </LinearLayout>
+            </GridLayout>
         </LinearLayout>
         </RelativeLayout>
         <ImageView

+ 1 - 1
app/src/main/res/layout/fragment_maps.xml

@@ -22,7 +22,7 @@
             android:layout_marginRight="30dp"
             android:layout_width="match_parent"
             android:layout_height="380dp"
-            android:src="@mipmap/test_maps"
+            android:src="@mipmap/test_maps_1"
             android:id="@+id/bt_look_maps" />
         <LinearLayout
             android:orientation="vertical"

+ 1 - 1
app/src/main/res/layout/fragment_order.xml

@@ -26,7 +26,7 @@
             android:textColor="@color/white"
             android:textSize="24sp"
             android:layout_marginTop="10dp"
-            android:text="点餐"
+            android:text="@string/order_text"
             />
     </RelativeLayout>
 </RelativeLayout>

BIN
app/src/main/res/mipmap-hdpi/home_default.png


BIN
app/src/main/res/mipmap-mdpi/test_maps_1.png


+ 91 - 0
app/src/main/res/values-es-rES/strings.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Vod</string>
+    <string name="welcometext">Bienvenido al sistema Vod</string>
+    <string name="lab_monday">Lunes</string>
+    <string name="lab_tuesday">Martes</string>
+    <string name="lab_wednesday">Miércoles</string>
+    <string name="lab_thursday">Jueves</string>
+    <string name="lab_friday">Viernes</string>
+    <string name="lab_saturday">sábado</string>
+    <string name="lab_sunday">Domingo</string>
+    <string name="lab_director">Director</string>
+    <string name="lab_years">Año</string>
+    <string name="lab_type">Tipo</string>
+    <string name="lab_duration">Duración</string>
+    <string name="lab_actor">Actor</string>
+    <string name="lab_details">Detalles</string>
+    <string name="lab_play">Reproducir</string>
+    <string name="title_activity_main2">Interfaz principal</string>
+    <string name="first_fragment_label">Primer fragmento</string>
+    <string name="second_fragment_label">Segundo fragmento</string>
+    <string name="next">Siguiente</string>
+    <string name="previous">Antes</string>
+    <string name="hello_first_fragment">Hola primer clip</string>
+    <string name="hello_second_fragment">Hola segundo clip</string>
+    <string name="title_activity_settings">Configuración</string>
+    <string name="messages_header">Mensaje</string>
+    <string name="sync_header">Sincronización</string>
+    <string name="signature_title">Su firma</string>
+    <string name="reply_title">Acción de respuesta predeterminada</string>
+    <string name="sync_title">Responder periódicamente al correo electrónico</string>
+    <string name="attachment_title">Descargar archivos adjuntos entrantes</string>
+    <string name="attachment_summary_on">Descarga automática de archivos adjuntos de correo electrónico entrante</string>
+    <string name="attachment_summary_off">Descargar adjuntos sólo cuando se solicita manualmente</string>
+    <string name="lab_no_equipment">Sin equipo</string>
+    <string name="setting_name_start">Inicio de la vinculación del asiento</string>
+    <string name="setting_name_end">Fin de la vinculación</string>
+    <string name="setting_name_del">Borrar información de ubicación</string>
+    <string name="update_info">Modificar la información del asiento</string>
+    <string name="define">Determinar</string>
+    <string name="cancel">Cancelar</string>
+    <string name="please_network">¡Operación fallida!¡Por favor, compruebe la red!</string>
+    <string name="tips">Recordatorio</string>
+    <string name="tips_clear_info">Borrar la información de ubicación</string>
+    <string name="tips_end_linkage">Fin de la vinculación</string>
+    <string name="tips_seat_linkage">Conexión de asientos abierta</string>
+    <string name="tips_seat_err">¡Falló la apertura!¡El dispositivo está en estado de depuración!</string>
+    <string name="tips_success">¡Cierre exitoso!</string>
+    <string name="tips_off_failed">¡Falló el cierre!¡El dispositivo no está encendido para depurar!</string>
+    <string name="tips_clear_success">¡Limpieza exitosa!</string>
+    <string name="tips_clear_failed">¡Limpieza fallida!El dispositivo está en estado de depuración</string>
+    <string name="confirm_success">Confirmación exitosa</string>
+    <string name="confirmation_failed">Confirmación fallida</string>
+    <string name="cancel_confirmation_successful">Confirmación cancelada con éxito</string>
+    <string name="cancel_failed">Cancelación fallida</string>
+    <string name="internet_connection">Detección del Estado de conexión a la red</string>
+    <string name="resource_loaded_successfully">Acceso exitoso a los recursos estáticos de la página principal del sistema</string>
+    <string name="load_language">Idioma de inicialización</string>
+    <string name="Load_vehicle_information">Acceso a la información del vehículo</string>
+    <string name="no_vehicle">Sin vehículo para vincular</string>
+    <string name="inspection_application_welcome">Detectar el entorno de instalación del juego</string>
+    <string name="detection_map">Comprobar si el mapa está descargado</string>
+    <string name="download_map">Descargar mapa</string>
+    <string name="map_loaded_successfully">Mapa cargado con éxito</string>
+    <string name="check_for_version_updates">Detectar actualizaciones de versiones</string>
+    <string name="check_whether_the_vehicle_is_bound">Comprobar vinculación del vehículo </string>
+    <string name="User_binding_succeeded">Vinculación exitosa del usuario</string>
+    <string name="Failure_to_Bind_a_user">Falló la vinculación del usuario</string>
+    <string name="get_no_app_installed">Obtener aplicaciones de juego no instaladas</string>
+    <string name="data_loading_successfully">Finalización de la carga de datos</string>
+    <string name="map_download_successfully">Descargar mapa completo</string>
+    <string name="download_games1">Descargar e instalar juegos</string>
+    <string name="download_games2">No instalado</string>
+    <string name="sum_total">Total</string>
+    <string name="fail_sum">Fracaso</string>
+    <string name="del_game">Desinstalando juego</string>
+    <string name="affirm">Confirmar</string>
+    <string name="myoder">Mi orden</string>
+    <string name="totalprice">Precio total</string>
+    <string name="neworders">Nuevo pedido</string>
+    <string name="completeorders">Completado</string>
+    <string name="cancelorders">Cancelado</string>
+    <string name="allorders">Todos los pedidos</string>
+    <string name="order_number">Número de orden</string>
+    <string name="finished">Completado</string>
+    <string name="underway">En curso</string>
+    <string name="canceled">Cancelado</string>
+    <string name="finish">Complete</string>
+    <string name="unbound_vehicle">Vehículo no vinculado</string>
+    <string name="order_text">Ordenar</string>
+</resources>

+ 3 - 0
app/src/main/res/values-th-rTH/strings.xml

@@ -87,4 +87,7 @@
     <string name="canceled">ยกเลิก</string>
     <string name="unbound_vehicle">"ไม่มีการเชื่อมต่อรถ "</string>
     <string name="finish">"เรียบร้อยแล้ว "</string>
+    <string name="order_text">สั่งอาหาร</string>
+    <string name="User_binding_succeeded">ผูกผู้ใช้เรียบร้อยแล้ว</string>
+    <string name="Failure_to_Bind_a_user">ผูกผู้ใช้ล้มเหลว</string>
 </resources>

+ 2 - 1
app/src/main/res/values-zh-rCN/strings.xml

@@ -76,7 +76,7 @@
 
     <string name="sum_total">总数 </string>
     <string name="fail_sum">失败 </string>
-    <string name="download_games1">下载安装游戏,</string>
+    <string name="download_games1">下载安装游戏</string>
     <string name="download_games2">未安装</string>
     <string name="del_game">正在卸载游戏</string>
 
@@ -93,4 +93,5 @@
     <string name="underway">进行中</string>
     <string name="canceled">已取消</string>
     <string name="finish">完成</string>
+    <string name="order_text">点餐</string>
 </resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -140,4 +140,5 @@
     <string name="canceled">Canceled</string>
     <string name="finish">Finish</string>
     <string name="unbound_vehicle">Unbound vehicle</string>
+    <string name="order_text">order</string>
 </resources>

+ 6 - 2
app/src/main/res/xml/root_preferences.xml

@@ -2,7 +2,10 @@
     xmlns:android="http://schemas.android.com/apk/res/android">
 
     <PreferenceCategory app:title="Settings">
-
+        <Preference
+            app:key="home_settings"
+            app:title="Home Settings"
+            />
         <Preference
             app:key="wifi_settings"
             app:title="WIFI Settings"
@@ -23,7 +26,8 @@
             app:key="screen_control"
             app:title="Screen Control"
             />
-<!--        <EditTextPreference-->
+
+        <!--        <EditTextPreference-->
 <!--            app:key="Password"-->
 <!--            app:title="Password"-->
 <!--            app:useSimpleSummaryProvider="true"-->

+ 2 - 2
gradlew

@@ -69,7 +69,7 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 # Determine the Java command to use to start the JVM.
 if [ -n "$JAVA_HOME" ] ; then
     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM'rank_mark JDK on AIX uses strange locations for the executables
+        # IBM's JDK on AIX uses strange locations for the executables
         JAVACMD="$JAVA_HOME/jre/sh/java"
     else
         JAVACMD="$JAVA_HOME/bin/java"
@@ -156,7 +156,7 @@ fi
 
 # Escape application args
 save () {
-    for i do printf %rank_mark\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
     echo " "
 }
 APP_ARGS=$(save "$@")

+ 7 - 1
keystore.properties

@@ -1,4 +1,10 @@
+#android 6.0ϵͳǩ��
 storePassWord=android
 keyPassWord=android
 keyAlias=androiddebugkey
-storeFile=./platform.jks
+storeFile=./platform.jks
+#android 10ϵͳǩ��
+#storePassWord=vod123456
+#keyPassWord=vod123456
+#keyAlias=vod
+#storeFile=./platform.keystore

+ 8 - 1
library_zhy_CircleMenu/src/main/java/com/zhy/view/CircleMenuLayout.java

@@ -15,6 +15,7 @@ import android.widget.TextView;
 import com.bumptech.glide.Glide;
 import com.zhy.ccbCricleMenu.R;
 
+
 import java.util.List;
 
 /**
@@ -485,7 +486,13 @@ public class CircleMenuLayout extends ViewGroup
 			if (iv != null)
 			{
 				iv.setVisibility(View.VISIBLE);
-				Glide.with(this).load(mItemImgs.get(i)).into(iv);
+				Glide.with(this).load(mItemImgs.get(i))
+			//			.placeholder()
+						.into(iv);
+
+//				.placeholder(.app_logo)//设置加载中图片
+//					.fallback( R.mipmap.app_logo)
+//					.error(R.mipmap.app_logo)
 				//iv.setImageResource(mItemImgs[i]);
 				iv.setOnClickListener(new OnClickListener()
 				{

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 17383 - 0
replay_pid17268.log