0
0
Fork 0
mirror of https://github.com/YTVanced/VancedManager synced 2024-11-27 05:23:00 +00:00

new services

This commit is contained in:
X1nto 2020-06-22 16:11:57 +04:00
parent f804344824
commit 8c2dc882cf
12 changed files with 171 additions and 70 deletions

View file

@ -61,6 +61,7 @@
<service android:name=".core.installer.StubInstaller" /> <service android:name=".core.installer.StubInstaller" />
<service android:name=".core.installer.RootAppUninstaller" /> <service android:name=".core.installer.RootAppUninstaller" />
<service android:name=".core.installer.AppUninstallerService" /> <service android:name=".core.installer.AppUninstallerService" />
<service android:name=".core.installer.AppInstallerService" />
<service android:name=".core.downloader.VancedDownloadService" /> <service android:name=".core.downloader.VancedDownloadService" />
<service android:name=".core.downloader.MicrogDownloadService" /> <service android:name=".core.downloader.MicrogDownloadService" />

View file

@ -4,9 +4,4 @@ import androidx.fragment.app.Fragment
open class BaseFragment : Fragment() { open class BaseFragment : Fragment() {
companion object {
const val APP_UNINSTALL = 69
const val MICROG_INSTALL = 420
}
} }

View file

@ -1,6 +1,33 @@
package com.vanced.manager.core.base; package com.vanced.manager.core.base;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageInstaller;
import com.vanced.manager.core.installer.AppUninstallerService;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class DummyJava { public class DummyJava {
public static void installApp(Activity activity, InputStream in, String pkg) throws IOException {
PackageInstaller packageInstaller = activity.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
params.setAppPackageName(pkg);
int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
OutputStream outputStream = session.openWrite("install", 0, -1);
byte[] buffer = new byte[65536];
int c;
while ((c = in.read(buffer)) != -1) {
outputStream.write(buffer, 0, c);
}
session.fsync(outputStream);
in.close();
outputStream.close();
}
} }

View file

@ -0,0 +1,69 @@
package com.vanced.manager.core.installer
import android.app.Service
import android.content.Context
import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.IBinder
import android.util.Log
import android.widget.Toast
import androidx.annotation.Nullable
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.R
import com.vanced.manager.ui.MainActivity
class AppInstallerService: Service() {
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> {
Toast.makeText(this, "Installing...", Toast.LENGTH_SHORT).show()
Log.d(TAG, "Requesting user confirmation for installation")
val confirmationIntent = intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT)
confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try {
startActivity(confirmationIntent)
} catch (e: Exception) {
}
}
PackageInstaller.STATUS_SUCCESS -> {
Log.d(TAG, "Installation succeed")
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_COMPLETED)
mIntent.action = MainActivity.INSTALL_COMPLETED
mIntent.putExtra("package", "normal")
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
else -> sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999))
}
stopSelf()
return START_NOT_STICKY
}
private fun sendFailure(status: Int) {
val msg = when (status) {
PackageInstaller.STATUS_FAILURE_ABORTED -> getString(R.string.installation_aborted)
PackageInstaller.STATUS_FAILURE_BLOCKED -> getString(R.string.installation_blocked)
PackageInstaller.STATUS_FAILURE_STORAGE -> getString(R.string.installation_storage)
PackageInstaller.STATUS_FAILURE_INVALID -> getString(R.string.installation_invalid)
PackageInstaller.STATUS_FAILURE_INCOMPATIBLE -> getString(R.string.installation_incompatible)
PackageInstaller.STATUS_FAILURE_CONFLICT -> getString(R.string.installation_conflict)
else -> getString(R.string.installation_failed)
}
val mIntent = Intent(MainActivity.INSTALL_FAILED)
mIntent.action = MainActivity.INSTALL_FAILED
mIntent.putExtra("errorMsg", msg)
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
@Nullable
override fun onBind(intent: Intent?): IBinder? {
return null
}
companion object{
const val TAG = "VMInstall"
}
}

View file

@ -4,19 +4,21 @@ import android.app.Service
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.os.IBinder import android.os.IBinder
import android.util.Log
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.ui.fragments.HomeFragment import com.vanced.manager.ui.MainActivity
class AppUninstallerService: Service() { class AppUninstallerService: Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
when (intent?.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) { when (intent?.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_SUCCESS -> { PackageInstaller.STATUS_SUCCESS -> {
sendBroadCast(HomeFragment.APP_UNINSTALLED) sendBroadCast(MainActivity.APP_UNINSTALLED)
Log.d("VMpm", "Successfully uninstalled ${PackageInstaller.EXTRA_PACKAGE_NAME}")
} }
PackageInstaller.STATUS_FAILURE -> { PackageInstaller.STATUS_FAILURE -> {
sendBroadCast(HomeFragment.APP_NOT_UNINSTALLED) sendBroadCast(MainActivity.APP_NOT_UNINSTALLED)
Log.d("VMpm", "Failed to uninstall ${PackageInstaller.EXTRA_PACKAGE_NAME}")
} }
} }
return START_NOT_STICKY return START_NOT_STICKY

View file

@ -11,6 +11,7 @@ import androidx.annotation.Nullable
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import com.vanced.manager.R
import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.MainActivity
import com.vanced.manager.utils.FileInfo import com.vanced.manager.utils.FileInfo
import java.io.File import java.io.File
@ -75,10 +76,12 @@ class RootSplitInstallerService: Service() {
if (installResult.isSuccess) { if (installResult.isSuccess) {
val mIntent = Intent(MainActivity.INSTALL_COMPLETED) val mIntent = Intent(MainActivity.INSTALL_COMPLETED)
mIntent.action = MainActivity.INSTALL_COMPLETED mIntent.action = MainActivity.INSTALL_COMPLETED
mIntent.putExtra("package", "split")
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent) LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
} else { } else {
val mIntent = Intent(MainActivity.INSTALL_FAILED) val mIntent = Intent(MainActivity.INSTALL_FAILED)
mIntent.action = MainActivity.INSTALL_FAILED mIntent.action = MainActivity.INSTALL_FAILED
mIntent.putExtra("errorMsg", getString(R.string.installation_failed))
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent) LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
} }
} }

View file

@ -32,6 +32,7 @@ class SplitInstallerService: Service() {
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply() getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_COMPLETED) val mIntent = Intent(MainActivity.INSTALL_COMPLETED)
mIntent.action = MainActivity.INSTALL_COMPLETED mIntent.action = MainActivity.INSTALL_COMPLETED
mIntent.putExtra("package", "split")
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent) LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
} }
else -> sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) else -> sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999))

View file

@ -2,6 +2,7 @@ package com.vanced.manager.ui
import android.content.* import android.content.*
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
@ -16,6 +17,7 @@ import com.vanced.manager.core.Main
import com.vanced.manager.databinding.ActivityMainBinding import com.vanced.manager.databinding.ActivityMainBinding
import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder
import com.vanced.manager.ui.dialogs.DialogContainer.launchVanced import com.vanced.manager.ui.dialogs.DialogContainer.launchVanced
import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.ThemeHelper.setFinalTheme import com.vanced.manager.utils.ThemeHelper.setFinalTheme
class MainActivity : Main() { class MainActivity : Main() {
@ -54,10 +56,15 @@ class MainActivity : Main() {
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
when (intent.action) { when (intent.action) {
INSTALL_COMPLETED -> launchVanced(this@MainActivity) INSTALL_COMPLETED -> {
INSTALL_FAILED -> { if (intent.getStringExtra("package") == "split")
installAlertBuilder(intent.getStringExtra("errorMsg") as String, this@MainActivity) launchVanced(this@MainActivity)
else
installAlertBuilder(getString(R.string.microg_installed), this@MainActivity)
} }
INSTALL_FAILED -> installAlertBuilder(intent.getStringExtra("errorMsg") as String, this@MainActivity)
APP_UNINSTALLED -> restartActivity()
APP_NOT_UNINSTALLED -> installAlertBuilder(getString(R.string.failed_uninstall) + intent.getStringExtra("pkgName"), this@MainActivity)
} }
} }
} }
@ -129,8 +136,15 @@ class MainActivity : Main() {
} }
private fun restartActivity() {
startActivity(Intent(this, MainActivity::class.java))
finish()
}
companion object { companion object {
const val INSTALL_COMPLETED = "Installation completed" const val INSTALL_COMPLETED = "Installation completed"
const val INSTALL_FAILED = "it just failed idk" const val INSTALL_FAILED = "it just failed idk"
const val APP_UNINSTALLED = "App uninstalled"
const val APP_NOT_UNINSTALLED = "App not uninstalled"
} }
} }

View file

@ -35,10 +35,13 @@ import com.vanced.manager.core.installer.RootAppUninstaller
import com.vanced.manager.databinding.FragmentHomeBinding import com.vanced.manager.databinding.FragmentHomeBinding
import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.MainActivity
import com.vanced.manager.ui.viewmodels.HomeViewModel import com.vanced.manager.ui.viewmodels.HomeViewModel
import com.vanced.manager.utils.PackageHelper.installApp
import com.vanced.manager.utils.PackageHelper.isPackageInstalled import com.vanced.manager.utils.PackageHelper.isPackageInstalled
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.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import java.io.File
import java.io.FileInputStream
class HomeFragment : Home() { class HomeFragment : Home() {
@ -227,21 +230,6 @@ class HomeFragment : Home() {
} }
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
val tag = "VMpm"
when (requestCode) {
MICROG_INSTALL -> {
Log.d(tag, "Microg install status: $resultCode")
restartActivity()
}
APP_UNINSTALL -> {
Log.d(tag, "App uninstall status: $resultCode")
restartActivity()
}
}
super.onActivityResult(requestCode, resultCode, data)
}
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
val viewModel: HomeViewModel by viewModels() val viewModel: HomeViewModel by viewModels()
@ -284,7 +272,7 @@ class HomeFragment : Home() {
MICROG_DOWNLOADED -> { MICROG_DOWNLOADED -> {
view?.findViewById<TextView>(R.id.microg_downloading)?.visibility = View.GONE view?.findViewById<TextView>(R.id.microg_downloading)?.visibility = View.GONE
view?.findViewById<ProgressBar>(R.id.microg_progress)?.visibility = View.GONE view?.findViewById<ProgressBar>(R.id.microg_progress)?.visibility = View.GONE
activity?.let { installMicrog(it) } activity?.let { installApp(it, it.filesDir.path + "/microg.apk", "com.mgoogle.android.gms") }
} }
VANCED_DOWNLOADED -> { VANCED_DOWNLOADED -> {
view?.findViewById<TextView>(R.id.vanced_downloading)?.visibility = View.GONE view?.findViewById<TextView>(R.id.vanced_downloading)?.visibility = View.GONE
@ -296,15 +284,6 @@ class HomeFragment : Home() {
Toast.makeText(activity, error, Toast.LENGTH_SHORT).show() Toast.makeText(activity, error, Toast.LENGTH_SHORT).show()
Log.d("VMDwnld", error) Log.d("VMDwnld", error)
} }
APP_UNINSTALLED -> {
val pkgName = intent.getStringExtra("pkgName")
restartActivity()
Log.d(tag, "successfully uninstalled $pkgName")
}
APP_NOT_UNINSTALLED -> {
val pkgName = intent.getStringExtra("pkgName")
Log.d(tag, "Failed to uninstall $pkgName")
}
} }
} }
} }
@ -351,18 +330,6 @@ class HomeFragment : Home() {
) )
) )
} }
activity?.let {
LocalBroadcastManager.getInstance(it).registerReceiver(broadcastReceiver, IntentFilter(
APP_UNINSTALLED
)
)
}
activity?.let {
LocalBroadcastManager.getInstance(it).registerReceiver(broadcastReceiver, IntentFilter(
APP_NOT_UNINSTALLED
)
)
}
} }
@ -409,11 +376,6 @@ class HomeFragment : Home() {
vancedinstallbtn?.icon = null vancedinstallbtn?.icon = null
} }
private fun restartActivity() {
startActivity(Intent(activity, MainActivity::class.java))
activity?.finish()
}
companion object { companion object {
const val SIGNATURE_DISABLED = "Signature verification disabled" const val SIGNATURE_DISABLED = "Signature verification disabled"
const val SIGNATURE_ENABLED = "Signature verification enabled" const val SIGNATURE_ENABLED = "Signature verification enabled"
@ -422,8 +384,6 @@ class HomeFragment : Home() {
const val VANCED_DOWNLOADED = "Vanced downloaded" const val VANCED_DOWNLOADED = "Vanced downloaded"
const val MICROG_DOWNLOADED = "MicroG downloaded" const val MICROG_DOWNLOADED = "MicroG downloaded"
const val DOWNLOAD_ERROR = "Error occurred" const val DOWNLOAD_ERROR = "Error occurred"
const val APP_UNINSTALLED = "App uninstalled"
const val APP_NOT_UNINSTALLED = "App not uninstalled"
} }

View file

@ -24,8 +24,10 @@ import com.downloader.PRDownloader
import com.vanced.manager.BuildConfig import com.vanced.manager.BuildConfig
import com.vanced.manager.R import com.vanced.manager.R
import com.vanced.manager.utils.PackageHelper.installApp
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import java.io.File import java.io.File
import java.io.FileInputStream
class UpdateCheckFragment : DialogFragment() { class UpdateCheckFragment : DialogFragment() {
@ -91,18 +93,12 @@ class UpdateCheckFragment : DialogFragment() {
prefs.getBoolean("isUpgrading", false) prefs.getBoolean("isUpgrading", false)
prefs.edit().putBoolean("isUpgrading", true).apply() prefs.edit().putBoolean("isUpgrading", true).apply()
val pn = activity?.packageName activity?.let {
val apk = File(activity?.filesDir?.path, "manager.apk") installApp(
val uri = it,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { it.filesDir.path + "/microg.apk",
FileProvider.getUriForFile(requireContext(), "$pn.provider", apk) "com.vanced.manager")
} else }
Uri.fromFile(apk)
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(uri, "application/vnd.android.package-archive")
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
startActivity(intent)
} }
override fun onError(error: Error?) { override fun onError(error: Error?) {

View file

@ -3,8 +3,12 @@ package com.vanced.manager.utils
import android.app.Activity import android.app.Activity
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller.SessionParams
import android.content.pm.PackageManager import android.content.pm.PackageManager
import com.vanced.manager.core.installer.SplitInstallerService import com.vanced.manager.core.installer.AppUninstallerService
import java.io.FileInputStream
import java.io.IOException
import java.io.InputStream
object PackageHelper { object PackageHelper {
@ -17,8 +21,35 @@ object PackageHelper {
} }
} }
@Throws(IOException::class)
fun installApp(
activity: Activity,
path: String,
pkg: String?
) {
val callbackIntent = Intent(activity.applicationContext, AppUninstallerService::class.java)
val pendingIntent = PendingIntent.getService(activity.applicationContext, 0, callbackIntent, 0)
val packageInstaller = activity.packageManager.packageInstaller
val params = SessionParams(SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(pkg)
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)
val inputStream = FileInputStream(path)
val outputStream = session.openWrite("install", 0, -1)
val buffer = ByteArray(65536)
var c: Int
while (inputStream.read(buffer).also { c = it } != -1) {
outputStream.write(buffer, 0, c)
}
session.fsync(outputStream)
inputStream.close()
outputStream.close()
session.commit(pendingIntent.intentSender)
}
fun uninstallApk(pkg: String, activity: Activity) { fun uninstallApk(pkg: String, activity: Activity) {
val callbackIntent = Intent(activity.applicationContext, SplitInstallerService::class.java) val callbackIntent = Intent(activity.applicationContext, AppUninstallerService::class.java)
val pendingIntent = PendingIntent.getService(activity.applicationContext, 0, callbackIntent, 0) val pendingIntent = PendingIntent.getService(activity.applicationContext, 0, callbackIntent, 0)
activity.packageManager.packageInstaller.uninstall(pkg, pendingIntent.intentSender) activity.packageManager.packageInstaller.uninstall(pkg, pendingIntent.intentSender)
} }

View file

@ -15,6 +15,7 @@
<!-- Home Page --> <!-- Home Page -->
<string name="changelogs">Changelogs</string> <string name="changelogs">Changelogs</string>
<string name="check">Check</string> <string name="check">Check</string>
<string name="failed_uninstall">Failed to uninstall package: </string>
<string name="install">Install</string> <string name="install">Install</string>
<string name="installation_aborted">Operation failed because user aborted installation</string> <string name="installation_aborted">Operation failed because user aborted installation</string>
<string name="installation_blocked">Operation failed because user blocked installation</string> <string name="installation_blocked">Operation failed because user blocked installation</string>
@ -27,6 +28,7 @@
<string name="version_installed">Installed:</string> <string name="version_installed">Installed:</string>
<string name="latest">Latest:</string> <string name="latest">Latest:</string>
<string name="loading">Loading…</string> <string name="loading">Loading…</string>
<string name="microg_installed">MicroG successfully installed</string>
<string name="network_error">Network connection unavailable</string> <string name="network_error">Network connection unavailable</string>
<string name="no_microg">No Microg!</string> <string name="no_microg">No Microg!</string>
<string name="unavailable">Unavailable</string> <string name="unavailable">Unavailable</string>