소스 검색

wa8888 in progress

Dola TENG 2 년 전
부모
커밋
496cbc7e29

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

@@ -10,8 +10,7 @@
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
-
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
 
     <meta-data
         android:name="firebase_crashlytics_collection_enabled"
@@ -26,6 +25,17 @@
         android:theme="@style/AppTheme"
         android:usesCleartextTraffic="true"
         tools:targetApi="m">
+
+        <provider
+            android:name="androidx.core.content.FileProvider"
+            android:authorities="${applicationId}.provider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_provider_paths" />
+        </provider>
+
         <activity
             android:name="com.khmer9.sbcmain.app.ShareActivity"
             android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"

+ 1 - 1
app/src/main/java/com/khmer9/sbcmain/app/App.kt

@@ -4,12 +4,12 @@ import android.app.Application
 import android.content.Context
 import com.itkacher.okhttpprofiler.OkHttpProfilerInterceptor
 import com.khmer9.sbcmain.BuildConfig
-import com.khmer9.sbcmain.config.Config
 import com.khmer9.sbcmain.remote.service.ApiService
 import com.khmer9.sbcmain.util.ModelPreferencesManager
 import com.khmer9.sbcmain.util.PrefHelper
 import com.khmer9.sbcmain.util.UnsafeOkHttpClient
 import com.khmer9.sbcmain.util.screenRectPx
+import com.khmer9.yuki.config.Config
 import com.mazenrashed.printooth.Printooth
 import com.squareup.moshi.Moshi
 import com.squareup.picasso.Picasso

+ 50 - 0
app/src/main/java/com/khmer9/sbcmain/app/AppCompatActivity.kt

@@ -0,0 +1,50 @@
+package com.khmer9.sbcmain.app
+
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.app.ActivityCompat
+import com.google.android.material.snackbar.Snackbar
+
+fun AppCompatActivity.checkSelfPermissionCompat(permission: String) =
+    ActivityCompat.checkSelfPermission(this, permission)
+
+fun AppCompatActivity.shouldShowRequestPermissionRationaleCompat(permission: String) =
+    ActivityCompat.shouldShowRequestPermissionRationale(this, permission)
+
+fun AppCompatActivity.requestPermissionsCompat(
+    permissionsArray: Array<String>,
+    requestCode: Int
+) {
+    ActivityCompat.requestPermissions(this, permissionsArray, requestCode)
+}
+
+fun View.showSnackbar(msgId: Int, length: Int) {
+    showSnackbar(context.getString(msgId), length)
+}
+
+fun View.showSnackbar(msg: String, length: Int) {
+    showSnackbar(msg, length, null, {})
+}
+
+fun View.showSnackbar(
+    msgId: Int,
+    length: Int,
+    actionMessageId: Int,
+    action: (View) -> Unit
+) {
+    showSnackbar(context.getString(msgId), length, context.getString(actionMessageId), action)
+}
+
+fun View.showSnackbar(
+    msg: String,
+    length: Int,
+    actionMessage: CharSequence?,
+    action: (View) -> Unit
+) {
+    val snackbar = Snackbar.make(this, msg, length)
+    if (actionMessage != null) {
+        snackbar.setAction(actionMessage) {
+            action(this)
+        }.show()
+    }
+}

+ 87 - 0
app/src/main/java/com/khmer9/sbcmain/app/DownloadController.kt

@@ -0,0 +1,87 @@
+package com.khmer9.sbcmain.app
+
+import android.app.DownloadManager
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.net.Uri
+import android.os.Build
+import android.os.Environment
+import android.widget.Toast
+import androidx.core.content.FileProvider
+import com.khmer9.sbcmain.R
+import java.io.File
+
+
+class DownloadController(private val context: Context, private val url: String) {
+    companion object {
+        private const val FILE_NAME = "SampleDownloadApp.apk"
+        private const val FILE_BASE_PATH = "file://"
+        private const val MIME_TYPE = "application/vnd.android.package-archive"
+        private const val PROVIDER_PATH = ".provider"
+        private const val APP_INSTALL_PATH = "\"application/vnd.android.package-archive\""
+    }
+
+    fun enqueueDownload() {
+        var destination =
+            context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + "/"
+        destination += FILE_NAME
+        val uri = Uri.parse("$FILE_BASE_PATH$destination")
+        val file = File(destination)
+        if (file.exists()) file.delete()
+        val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
+        val downloadUri = Uri.parse(url)
+        val request = DownloadManager.Request(downloadUri)
+        request.setMimeType(MIME_TYPE)
+        request.setTitle(context.getString(R.string.title_file_download))
+        request.setDescription(context.getString(R.string.downloading))
+        // set destination
+        request.setDestinationUri(uri)
+        showInstallOption(destination, uri)
+        // Enqueue a new download and same the referenceId
+        downloadManager.enqueue(request)
+        Toast.makeText(context, context.getString(R.string.downloading), Toast.LENGTH_LONG)
+            .show()
+    }
+
+    private fun showInstallOption(
+        destination: String,
+        uri: Uri
+    ) {
+        // set BroadcastReceiver to install app when .apk is downloaded
+        val onComplete = object : BroadcastReceiver() {
+            override fun onReceive(
+                context: Context,
+                intent: Intent
+            ) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                    val contentUri = FileProvider.getUriForFile(
+                        context,
+                        "com.khmer9.sbcmain" + PROVIDER_PATH,
+                        File(destination)
+                    )
+                    val install = Intent(Intent.ACTION_VIEW)
+                    install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+                    install.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+                    install.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
+                    install.data = contentUri
+                    context.startActivity(install)
+                    context.unregisterReceiver(this)
+                    // finish()
+                } else {
+                    val install = Intent(Intent.ACTION_VIEW)
+                    install.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
+                    install.setDataAndType(
+                        uri,
+                        APP_INSTALL_PATH
+                    )
+                    context.startActivity(install)
+                    context.unregisterReceiver(this)
+                    // finish()
+                }
+            }
+        }
+        context.registerReceiver(onComplete, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
+    }
+}

+ 60 - 0
app/src/main/java/com/khmer9/sbcmain/app/ShareActivity.kt

@@ -1,6 +1,8 @@
 package com.khmer9.sbcmain.app
 
+import android.Manifest
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.os.Bundle
 import android.os.StrictMode
 import android.view.View
@@ -9,13 +11,16 @@ import android.widget.TextView
 import androidx.appcompat.app.AlertDialog
 import androidx.constraintlayout.widget.Group
 import androidx.core.view.isVisible
+import com.google.android.material.snackbar.Snackbar
 import com.khmer9.sbcmain.R
+import com.khmer9.sbcmain.app.ShareActivity.Companion.PERMISSION_REQUEST_STORAGE
 import com.khmer9.sbcmain.base.BaseActivity
 import com.khmer9.sbcmain.remote.LoginData
 import com.khmer9.sbcmain.screen.main.MainFragment
 import com.khmer9.sbcmain.util.Const
 import com.khmer9.sbcmain.util.ModelPreferencesManager
 import com.khmer9.sbcmain.util.PrefHelper
+import kotlinx.android.synthetic.main.layout_fragment_main_yuki.*
 
 class ShareActivity : BaseActivity() {
     lateinit var settingImageView: ImageView
@@ -27,6 +32,11 @@ class ShareActivity : BaseActivity() {
     lateinit var loginData: LoginData
     lateinit var groupToolbarIcons: Group
     lateinit var sharePref: PrefHelper
+    lateinit var downloadController: DownloadController
+
+    companion object {
+        const val PERMISSION_REQUEST_STORAGE = 0
+    }
 
     override fun onCreate(savedInstanceState: Bundle?) {
         val builder: StrictMode.VmPolicy.Builder = StrictMode.VmPolicy.Builder()
@@ -131,4 +141,54 @@ class ShareActivity : BaseActivity() {
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
         super.onActivityResult(requestCode, resultCode, data)
     }
+
+    override fun onRequestPermissionsResult(
+        requestCode: Int,
+        permissions: Array<out String>,
+        grantResults: IntArray
+    ) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+        if (requestCode == PERMISSION_REQUEST_STORAGE) {
+            // Request for camera permission.
+            if (grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                // start downloading
+                downloadController.enqueueDownload()
+            } else {
+                // Permission request was denied.
+                mainLayout.showSnackbar(R.string.storage_permission_denied, Snackbar.LENGTH_SHORT)
+            }
+        }
+    }
+
+    fun checkStoragePermission() {
+        // Check if the storage permission has been granted
+        if (checkSelfPermissionCompat(Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
+            PackageManager.PERMISSION_GRANTED
+        ) {
+            // start downloading
+            downloadController.enqueueDownload()
+        } else {
+            // Permission is missing and must be requested.
+            requestStoragePermission()
+        }
+    }
+
+    private fun requestStoragePermission() {
+        if (shouldShowRequestPermissionRationaleCompat(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+            mainLayout.showSnackbar(
+                R.string.storage_access_required,
+                Snackbar.LENGTH_INDEFINITE, R.string.ok
+            ) {
+                requestPermissionsCompat(
+                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
+                    PERMISSION_REQUEST_STORAGE
+                )
+            }
+        } else {
+            requestPermissionsCompat(
+                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
+                PERMISSION_REQUEST_STORAGE
+            )
+        }
+    }
 }

+ 47 - 0
app/src/main/java/com/khmer9/sbcmain/base/BaseActivity.kt

@@ -2,7 +2,10 @@ package com.khmer9.sbcmain.base
 
 import android.os.Bundle
 import android.view.MenuItem
+import android.view.View
 import androidx.appcompat.app.AppCompatActivity
+import androidx.core.app.ActivityCompat
+import com.google.android.material.snackbar.Snackbar
 import com.khmer9.sbcmain.R
 
 abstract class BaseActivity : AppCompatActivity() {
@@ -38,4 +41,48 @@ abstract class BaseActivity : AppCompatActivity() {
             R.anim.slide_out_exit
         )
     }
+
+    fun AppCompatActivity.checkSelfPermissionCompat(permission: String) =
+        ActivityCompat.checkSelfPermission(this, permission)
+
+    fun AppCompatActivity.shouldShowRequestPermissionRationaleCompat(permission: String) =
+        ActivityCompat.shouldShowRequestPermissionRationale(this, permission)
+
+    fun AppCompatActivity.requestPermissionsCompat(
+        permissionsArray: Array<String>,
+        requestCode: Int
+    ) {
+        ActivityCompat.requestPermissions(this, permissionsArray, requestCode)
+    }
+
+    fun View.showSnackbar(msgId: Int, length: Int) {
+        showSnackbar(context.getString(msgId), length)
+    }
+
+    fun View.showSnackbar(msg: String, length: Int) {
+        showSnackbar(msg, length, null, {})
+    }
+
+    fun View.showSnackbar(
+        msgId: Int,
+        length: Int,
+        actionMessageId: Int,
+        action: (View) -> Unit
+    ) {
+        showSnackbar(context.getString(msgId), length, context.getString(actionMessageId), action)
+    }
+
+    fun View.showSnackbar(
+        msg: String,
+        length: Int,
+        actionMessage: CharSequence?,
+        action: (View) -> Unit
+    ) {
+        val snackbar = Snackbar.make(this, msg, length)
+        if (actionMessage != null) {
+            snackbar.setAction(actionMessage) {
+                action(this)
+            }.show()
+        }
+    }
 }

+ 3 - 7
app/src/main/java/com/khmer9/sbcmain/base/BaseFragment.kt

@@ -9,7 +9,10 @@ import android.view.ViewGroup
 import android.widget.TextView
 import android.widget.Toast
 import androidx.annotation.LayoutRes
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.app.ActivityCompat
 import androidx.fragment.app.Fragment
+import com.google.android.material.snackbar.Snackbar
 import com.khmer9.sbcmain.remote.LottoSet
 import com.mazenrashed.printooth.Printooth
 import com.mazenrashed.printooth.data.printable.Printable
@@ -40,13 +43,6 @@ abstract class BaseFragment(@LayoutRes private val layoutRes: Int) : Fragment()
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        /*val guideLeft = view.findViewById<Guideline>(R.id.left_guideline)
-        val guideRight = view.findViewById<Guideline>(R.id.right_guideline)
-        val leftParams = guideLeft.layoutParams as ConstraintLayout.LayoutParams
-        leftParams.guidePercent = App.guidelineLeft
-        val rightParams = guideRight.layoutParams as ConstraintLayout.LayoutParams
-        rightParams.guidePercent = App.guidelineRight
-        guideRight.layoutParams = rightParams*/
     }
 
     fun currencyFormat(amount: Int): String? {

+ 1 - 1
app/src/main/java/com/khmer9/sbcmain/remote/service/SocketService.java

@@ -5,8 +5,8 @@ import static java.util.Collections.singletonMap;
 
 import android.util.Log;
 
-import com.khmer9.sbcmain.config.Config;
 import com.khmer9.sbcmain.util.BaseObservable;
+import com.khmer9.yuki.config.Config;
 
 import org.json.JSONObject;
 

+ 16 - 5
app/src/main/java/com/khmer9/sbcmain/screen/main/MainFragment.kt

@@ -1,7 +1,9 @@
 package com.khmer9.sbcmain.screen.main
 
+import android.Manifest
 import android.annotation.SuppressLint
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.content.res.AssetManager
 import android.media.MediaPlayer
 import android.net.Uri
@@ -12,9 +14,11 @@ import android.widget.Toast
 import androidx.lifecycle.Observer
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.snackbar.Snackbar
 import com.khmer9.sbcmain.R
 import com.khmer9.sbcmain.adapter.MainModuleAdapter
 import com.khmer9.sbcmain.app.App
+import com.khmer9.sbcmain.app.DownloadController
 import com.khmer9.sbcmain.app.ShareActivity
 import com.khmer9.sbcmain.base.BaseFragment
 import com.khmer9.sbcmain.extension.btnClick
@@ -23,6 +27,7 @@ import com.khmer9.sbcmain.remote.service.ConnectivityStates
 import com.khmer9.sbcmain.screen.report.StatementFragment
 import com.khmer9.sbcmain.screen.setting.SettingFragment
 import com.khmer9.sbcmain.screen.splash.SplashScreenActivity
+import kotlinx.android.synthetic.main.layout_fragment_main_yuki.*
 import java.io.File
 import java.io.FileOutputStream
 import java.io.InputStream
@@ -36,7 +41,6 @@ class MainFragment : BaseFragment(R.layout.layout_fragment_main_yuki) {
     private lateinit var adapter: MainModuleAdapter
     private lateinit var recyclerView: RecyclerView
     private lateinit var betTouch: MediaPlayer
-
     private val YUKI_APP_ID = "630478c22983a591133f0492"
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -154,8 +158,8 @@ class MainFragment : BaseFragment(R.layout.layout_fragment_main_yuki) {
                                     var outPutStream: OutputStream? = null
 
                                     try {
-                                        inputStream = assetManager.open("Khmer9_Yuki_prodRelease_1.0.1.apk")
-                                        outPutStream = FileOutputStream(filesDir.path+ "/" + "Khmer9_Yuki_prodRelease_1.0.1.apk")
+                                        /*inputStream = assetManager.open("Khmer9_Yuki_prodRelease_1.0.1.apk")
+                                        outPutStream = FileOutputStream(filesDir.path + "/" + "Khmer9_Yuki_prodRelease_1.0.1.apk")
                                         val buffer = ByteArray(1024)
 
                                         var read: Int
@@ -174,8 +178,15 @@ class MainFragment : BaseFragment(R.layout.layout_fragment_main_yuki) {
 
                                         val intent: Intent = Intent(Intent.ACTION_VIEW)
                                         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
-                                        intent.setDataAndType(Uri.fromFile(File(filesDir.path+ "/" + "Khmer9_Yuki_prodRelease_1.0.1.apk")), "application/vnd.android.package-archive")
-                                        startActivity(intent)
+                                        intent.setDataAndType(Uri.fromFile(File(filesDir.path + "/" + "Khmer9_Yuki_prodRelease_1.0.1.apk")), "application/vnd.android.package-archive")
+                                        startActivity(intent)*/
+
+                                        (requireActivity() as ShareActivity).apply {
+                                            downloadController = DownloadController(this, "https://www.dropbox.com/s/779i8wxxwg0zwdd/Khmer9_Yuki_prodRelease_1.0.1.apk?dl=1")
+
+                                            checkStoragePermission()
+                                        }
+
                                     } catch (e: Exception) {
                                         e.printStackTrace()
                                     }

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

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/mainLayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center_vertical"

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

@@ -17,6 +17,11 @@
     <string name="withdraw_statement">ដកប្រាក់</string>
     <string name="result_statement">លទ្ធផល</string>
 
+    <string name="downloading">កំពុងដោនឡូត...</string>
+    <string name="title_file_download">កម្មវិធីកំពុងដោនឡូត</string>
+    <string name="storage_access_required">Storage access is required to downloading the file.</string>
+    <string name="storage_permission_denied">Storage permission request was denied.</string>
+
     <!-- Report -->
     <string name="bet_type_under">Under</string>
     <string name="bet_type_over">Over</string>
@@ -61,4 +66,5 @@
     <string name="cast">សងត្រឡប់</string>
     <string name="total_cast">សរុបសងត្រឡប់</string>
     <string name="group">លេខហ្គេម/ក្រុម</string>
+    <string name="ok">យល់ព្រម</string>
 </resources>

+ 12 - 0
app/src/main/res/xml/file_provider_paths.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths>
+    <external-path
+        name="external"
+        path="." />
+    <external-files-path
+        name="external_files"
+        path="." />
+    <files-path
+        name="files"
+        path="." />
+</paths>