hopefully fixed all issues

This commit is contained in:
X1nto 2020-05-25 21:18:00 +04:00
parent acff4385aa
commit 61dea49c22
7 changed files with 208 additions and 163 deletions

View File

@ -1,6 +1,9 @@
package com.vanced.manager.core package com.vanced.manager.core
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.PendingIntent
import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
@ -8,14 +11,17 @@ import androidx.preference.PreferenceManager
import com.dezlum.codelabs.getjson.GetJson import com.dezlum.codelabs.getjson.GetJson
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.core.base.BaseActivity import com.vanced.manager.core.base.BaseActivity
import com.vanced.manager.core.installer.SplitInstallerService
import zlc.season.rxdownload4.file import zlc.season.rxdownload4.file
import java.io.File import java.io.*
// This activity will NOT be used in manifest // This activity will NOT be used in manifest
// since MainActivity will extend it // since MainActivity will extend it
@SuppressLint("Registered") @SuppressLint("Registered")
open class Main: BaseActivity() { open class Main: BaseActivity() {
private lateinit var packageInstaller: PackageInstaller
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -76,4 +82,106 @@ open class Main: BaseActivity() {
prefs.edit().putBoolean("statement", true).apply() prefs.edit().putBoolean("statement", true).apply()
} }
fun installSplitApk(): Int {
val apkFolderPath = cacheDir.path
val nameSizeMap = HashMap<String, Long>()
var totalSize: Long = 0
var sessionId = 0
val folder = File(apkFolderPath)
val listOfFiles = folder.listFiles()
try {
for (listOfFile in listOfFiles!!) {
if (listOfFile.isFile) {
Log.d("AppLog", "installApk: " + listOfFile.name)
nameSizeMap[listOfFile.name] = listOfFile.length()
totalSize += listOfFile.length()
}
}
} catch (e: Exception) {
e.printStackTrace()
return -1
}
val installParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
installParams.setSize(totalSize)
try {
sessionId = packageInstaller.createSession(installParams)
Log.d("AppLog","Success: created install session [$sessionId]")
for ((key, value) in nameSizeMap) {
doWriteSession(sessionId, apkFolderPath + key, value, key)
}
doCommitSession(sessionId)
Log.d("AppLog","Success")
} catch (e: IOException) {
e.printStackTrace()
}
return sessionId
}
private fun doWriteSession(sessionId: Int, inPath: String?, sizeBytes: Long, splitName: String): Int {
var inPathToUse = inPath
var sizeBytesToUse = sizeBytes
if ("-" == inPathToUse) {
inPathToUse = null
} else if (inPathToUse != null) {
val file = File(inPathToUse)
if (file.isFile)
sizeBytesToUse = file.length()
}
var session: PackageInstaller.Session? = null
var inputStream: InputStream? = null
var out: OutputStream? = null
try {
session = packageInstaller.openSession(sessionId)
if (inPathToUse != null) {
inputStream = FileInputStream(inPathToUse)
}
out = session.openWrite(splitName, 0, sizeBytesToUse)
var total = 0
val buffer = ByteArray(65536)
var c: Int
while (true) {
c = inputStream!!.read(buffer)
if (c == -1)
break
total += c
out.write(buffer, 0, c)
}
session.fsync(out)
Log.d("AppLog", "Success: streamed $total bytes")
return PackageInstaller.STATUS_SUCCESS
} catch (e: IOException) {
Log.e("AppLog", "Error: failed to write; " + e.message)
return PackageInstaller.STATUS_FAILURE
} finally {
try {
out?.close()
inputStream?.close()
session?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
private fun doCommitSession(sessionId: Int) {
var session: PackageInstaller.Session? = null
try {
try {
session = packageInstaller.openSession(sessionId)
val callbackIntent = Intent(applicationContext, SplitInstallerService::class.java)
val pendingIntent = PendingIntent.getService(applicationContext, 0, callbackIntent, 0)
session.commit(pendingIntent.intentSender)
session.close()
Log.d("AppLog", "install request sent")
Log.d("AppLog", "doCommitSession: " + packageInstaller.mySessions)
Log.d("AppLog", "doCommitSession: after session commit ")
} catch (e: IOException) {
e.printStackTrace()
}
} finally {
session!!.close()
}
}
} }

View File

@ -1,6 +1,5 @@
package com.vanced.manager.core.base package com.vanced.manager.core.base
import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.view.View import android.view.View
@ -10,7 +9,7 @@ import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.findNavController import androidx.navigation.findNavController
import com.vanced.manager.core.installer.SplitInstallActivity import com.vanced.manager.ui.MainActivity
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.rxkotlin.subscribeBy import io.reactivex.rxkotlin.subscribeBy
@ -74,9 +73,11 @@ open class BaseFragment : Fragment() {
if (apk == "lang") { if (apk == "lang") {
if (apkVar != "en") if (apkVar != "en")
downloadEn(loadBar) downloadEn(loadBar)
else
launchInstaller()
} }
else launchInstaller() else
launchInstaller()
} else { } else {
view?.findNavController()?.navigate(navigate) view?.findNavController()?.navigate(navigate)
} }
@ -90,7 +91,6 @@ open class BaseFragment : Fragment() {
private fun downloadEn(loadBar: ProgressBar) { private fun downloadEn(loadBar: ProgressBar) {
val url = "https://x1nto.github.io/VancedFiles/Splits/Language/split_config.en.apk" val url = "https://x1nto.github.io/VancedFiles/Splits/Language/split_config.en.apk"
val task = activity?.cacheDir?.path?.let { val task = activity?.cacheDir?.path?.let {
Task( Task(
url = url, url = url,
@ -122,9 +122,8 @@ open class BaseFragment : Fragment() {
} }
private fun launchInstaller() { private fun launchInstaller() {
val intent = Intent(requireContext(), SplitInstallActivity::class.java) val activity = (activity as MainActivity?)!!
activity?.startActivityForResult(intent, 666) activity.installSplitApk()
} }
} }

View File

@ -0,0 +1,9 @@
package com.vanced.manager.core.base;
import androidx.fragment.app.Fragment;
import com.vanced.manager.ui.MainActivity;
public class DummyJava extends Fragment {
}

View File

@ -1,122 +0,0 @@
package com.vanced.manager.core.installer
import android.app.Activity
import android.app.PendingIntent
import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import java.io.*
class SplitInstallActivity: Activity() {
private lateinit var packageInstaller: PackageInstaller
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
installSplitApk()
}
private fun installSplitApk(): Int {
val apkFolderPath = cacheDir.path
val nameSizeMap = HashMap<String, Long>()
var totalSize: Long = 0
var sessionId = 0
val folder = File(apkFolderPath)
val listOfFiles = folder.listFiles()
try {
for (listOfFile in listOfFiles!!) {
if (listOfFile.isFile) {
Log.d("AppLog", "installApk: " + listOfFile.name)
nameSizeMap[listOfFile.name] = listOfFile.length()
totalSize += listOfFile.length()
}
}
} catch (e: Exception) {
e.printStackTrace()
return -1
}
val installParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
installParams.setSize(totalSize)
try {
sessionId = packageInstaller.createSession(installParams)
Log.d("AppLog","Success: created install session [$sessionId]")
for ((key, value) in nameSizeMap) {
doWriteSession(sessionId, apkFolderPath + key, value, key)
}
doCommitSession(sessionId)
Log.d("AppLog","Success")
} catch (e: IOException) {
e.printStackTrace()
}
return sessionId
}
private fun doWriteSession(sessionId: Int, inPath: String?, sizeBytes: Long, splitName: String): Int {
var inPathToUse = inPath
var sizeBytesToUse = sizeBytes
if ("-" == inPathToUse) {
inPathToUse = null
} else if (inPathToUse != null) {
val file = File(inPathToUse)
if (file.isFile)
sizeBytesToUse = file.length()
}
var session: PackageInstaller.Session? = null
var inputStream: InputStream? = null
var out: OutputStream? = null
try {
session = packageInstaller.openSession(sessionId)
if (inPathToUse != null) {
inputStream = FileInputStream(inPathToUse)
}
out = session.openWrite(splitName, 0, sizeBytesToUse)
var total = 0
val buffer = ByteArray(65536)
var c: Int
while (true) {
c = inputStream!!.read(buffer)
if (c == -1)
break
total += c
out.write(buffer, 0, c)
}
session.fsync(out)
Log.d("AppLog", "Success: streamed $total bytes")
return PackageInstaller.STATUS_SUCCESS
} catch (e: IOException) {
Log.e("AppLog", "Error: failed to write; " + e.message)
return PackageInstaller.STATUS_FAILURE
} finally {
try {
out?.close()
inputStream?.close()
session?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
private fun doCommitSession(sessionId: Int) {
var session: PackageInstaller.Session? = null
try {
try {
session = packageInstaller.openSession(sessionId)
val callbackIntent = Intent(applicationContext, SplitInstallerService::class.java)
val pendingIntent = PendingIntent.getService(applicationContext, 0, callbackIntent, 0)
session.commit(pendingIntent.intentSender)
session.close()
Log.d("AppLog", "install request sent")
Log.d("AppLog", "doCommitSession: " + packageInstaller.mySessions)
Log.d("AppLog", "doCommitSession: after session commit ")
} catch (e: IOException) {
e.printStackTrace()
}
} finally {
session!!.close()
}
}
}

View File

@ -42,6 +42,11 @@ class MainActivity : Main() {
} }
override fun onResume() {
super.onResume()
recreate()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navHost = findNavController(R.id.bottom_nav_host) val navHost = findNavController(R.id.bottom_nav_host)
val prefs = PreferenceManager.getDefaultSharedPreferences(this) val prefs = PreferenceManager.getDefaultSharedPreferences(this)
@ -93,7 +98,6 @@ class MainActivity : Main() {
} }
private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) { private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) {
val toolbar: Toolbar = findViewById(R.id.home_toolbar) val toolbar: Toolbar = findViewById(R.id.home_toolbar)
when { when {

View File

@ -91,11 +91,11 @@ class HomeFragment : Home() {
when { when {
microgRemoteVer > microgVer -> { microgRemoteVer > microgVer -> {
microginstallbtn?.text = activity?.getString(R.string.update) microginstallbtn?.text = activity?.getString(R.string.update)
microginstallbtn?.icon = ResourcesCompat.getDrawable(resources, R.drawable.ic_cloud_upload_black_24dp, null) microginstallbtn?.icon = activity?.getDrawable(R.drawable.ic_cloud_upload_black_24dp)
} }
microgRemoteVer == microgVer -> { microgRemoteVer == microgVer -> {
microginstallbtn?.text = activity?.getString(R.string.button_installed) microginstallbtn?.text = activity?.getString(R.string.button_installed)
microginstallbtn?.icon = ResourcesCompat.getDrawable(resources, R.drawable.outline_cloud_done_24, null) microginstallbtn?.icon = activity?.getDrawable(R.drawable.outline_cloud_done_24)
} }
} }
} }
@ -104,12 +104,12 @@ class HomeFragment : Home() {
pm.getPackageInfo("com.vanced.android.youtube", 0).versionName pm.getPackageInfo("com.vanced.android.youtube", 0).versionName
when { when {
vancedRemoteVer > vancedVer -> { vancedRemoteVer > vancedVer -> {
vancedinstallbtn?.text = getString(R.string.update) vancedinstallbtn?.text = activity?.getString(R.string.update)
vancedinstallbtn?.icon = ResourcesCompat.getDrawable(resources, R.drawable.ic_cloud_upload_black_24dp, null) vancedinstallbtn?.icon = activity?.getDrawable(R.drawable.ic_cloud_upload_black_24dp)
} }
vancedRemoteVer == vancedVer -> { vancedRemoteVer == vancedVer -> {
vancedinstallbtn?.text = getString(R.string.update) vancedinstallbtn?.text = activity?.getString(R.string.button_installed)
vancedinstallbtn?.icon = ResourcesCompat.getDrawable(resources, R.drawable.outline_cloud_done_24, null) vancedinstallbtn?.icon = activity?.getDrawable(R.drawable.outline_cloud_done_24)
} }
} }
} }

View File

@ -1,35 +1,82 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout <com.google.android.material.card.MaterialCardView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="?colorSurface" style="@style/MaterialCard"
xmlns:app="http://schemas.android.com/apk/res-auto"> android:layout_width="wrap_content"
android:layout_gravity="center"
app:contentPaddingTop="0dp"
app:contentPaddingBottom="0dp"
app:contentPaddingRight="6dp"
app:contentPaddingLeft="6dp"
tools:context=".ui.fragments.UpdateCheckFragment">
<com.google.android.material.appbar.AppBarLayout <LinearLayout
android:id="@+id/vanced_install_appbar" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
style="@style/CardTitle"
android:id="@+id/update_center_text"
android:layout_gravity="center"
android:text="@string/update_center"
android:textAlignment="center"
android:fontFamily="@font/exo_semibold" />
<TextView
android:id="@+id/update_center_checking"
style="@style/AppVer.Bold"
android:layout_marginTop="4dp"
android:layout_gravity="center"
android:text="Checking For Updates..."
android:textAlignment="center"
android:textSize="16sp" />
<ProgressBar
android:id="@+id/update_center_progressbar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:elevation="1dp" android:visibility="gone"
android:background="?colorSurface" app:layout_constraintEnd_toEndOf="parent"
android:layout_alignParentTop="true"> app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.appbar.MaterialToolbar <LinearLayout
android:id="@+id/vanced_install_toolbar" android:id="@+id/update_button_container"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="?attr/actionBarSize" android:layout_height="wrap_content">
app:titleTextColor="?attr/toolbarIconColor"
android:background="@android:color/transparent" />
</com.google.android.material.appbar.AppBarLayout> <com.google.android.material.button.MaterialButton
android:id="@+id/update_center_dismiss"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:text="@string/close"
android:textAllCaps="false"/>
<FrameLayout <FrameLayout
android:id="@+id/vanced_install_frame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
android:layout_below="@id/vanced_install_appbar"
android:layout_alignParentBottom="true"
android:layout_marginTop="8dp"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/update_center_update"
style="@style/ButtonStyle"
android:layout_marginStart="4dp"
android:text="@string/update" />
</RelativeLayout> <com.google.android.material.button.MaterialButton
android:id="@+id/update_center_recheck"
style="@style/ButtonStyle"
android:layout_marginStart="4dp"
android:text="@string/re_check" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>