Skip to content

Commit 554c183

Browse files
authored
Merge branch 'pascua28:master' into master
2 parents bd847ed + f6bdd5e commit 554c183

File tree

6 files changed

+257
-73
lines changed

6 files changed

+257
-73
lines changed

Diff for: manager/src/main/java/moe/shizuku/manager/home/HomeAdapter.kt

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package moe.shizuku.manager.home
22

3+
import android.content.pm.PackageManager
34
import android.os.Build
5+
import moe.shizuku.manager.application
46
import moe.shizuku.manager.management.AppsViewModel
57
import moe.shizuku.manager.utils.EnvironmentUtils
68
import moe.shizuku.manager.utils.UserHandleCompat
@@ -24,8 +26,9 @@ class HomeAdapter(private val homeModel: HomeViewModel, private val appsModel: A
2426
private const val ID_START_ROOT = 3L
2527
private const val ID_START_WADB = 4L
2628
private const val ID_START_ADB = 5L
27-
private const val ID_LEARN_MORE = 6L
28-
private const val ID_ADB_PERMISSION_LIMITED = 7L
29+
private const val ID_START_SYSTEM = 6L
30+
private const val ID_LEARN_MORE = 7L
31+
private const val ID_ADB_PERMISSION_LIMITED = 8L
2932
}
3033

3134
override fun onCreateCreatorPool(): IndexCreatorPool {
@@ -54,6 +57,15 @@ class HomeAdapter(private val homeModel: HomeViewModel, private val appsModel: A
5457
if (isPrimaryUser) {
5558
val root = EnvironmentUtils.isRooted()
5659
val rootRestart = running && status.uid == 0
60+
val system : Boolean = try {
61+
application.applicationContext.packageManager.getPackageInfo("com.sdet.fotaagent", 0)
62+
true
63+
} catch (e: PackageManager.NameNotFoundException) {
64+
false
65+
}
66+
67+
if (system)
68+
addItem(StartSystemViewHolder.CREATOR, rootRestart, ID_START_SYSTEM)
5769

5870
if (root) {
5971
addItem(StartRootViewHolder.CREATOR, rootRestart, ID_START_ROOT)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package moe.shizuku.manager.home
2+
3+
import android.content.Intent
4+
import android.text.method.LinkMovementMethod
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.view.ViewGroup
8+
import androidx.appcompat.app.AlertDialog
9+
import moe.shizuku.manager.R
10+
import moe.shizuku.manager.databinding.HomeItemContainerBinding
11+
import moe.shizuku.manager.databinding.HomeStartSystemBinding
12+
import moe.shizuku.manager.ktx.toHtml
13+
import moe.shizuku.manager.starter.StarterActivity
14+
import rikka.html.text.HtmlCompat
15+
import rikka.recyclerview.BaseViewHolder
16+
import rikka.recyclerview.BaseViewHolder.Creator
17+
18+
class StartSystemViewHolder(private val binding: HomeStartSystemBinding, system: View) :
19+
BaseViewHolder<Boolean>(system) {
20+
21+
companion object {
22+
val CREATOR = Creator<Boolean> { inflater: LayoutInflater, parent: ViewGroup? ->
23+
val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
24+
val inner = HomeStartSystemBinding.inflate(inflater, outer.root, true)
25+
StartSystemViewHolder(inner, outer.root)
26+
}
27+
}
28+
29+
private inline val start get() = binding.button1
30+
31+
private var alertDialog: AlertDialog? = null
32+
33+
init {
34+
val listener = View.OnClickListener { v: View -> onStartClicked(v) }
35+
start.setOnClickListener(listener)
36+
binding.text1.movementMethod = LinkMovementMethod.getInstance()
37+
}
38+
39+
private fun onStartClicked(v: View) {
40+
val context = v.context
41+
val intent = Intent(context, StarterActivity::class.java).apply {
42+
putExtra(StarterActivity.EXTRA_IS_ROOT, false)
43+
putExtra(StarterActivity.EXTRA_IS_SYSTEM, true)
44+
}
45+
context.startActivity(intent)
46+
}
47+
48+
override fun onBind() {
49+
start.isEnabled = true
50+
if (data!!) {
51+
start.visibility = View.GONE
52+
} else {
53+
start.visibility = View.VISIBLE
54+
}
55+
56+
val sb = StringBuilder()
57+
.append(
58+
context.getString(
59+
R.string.home_system_description
60+
)
61+
)
62+
63+
binding.text1.text = sb.toHtml(HtmlCompat.FROM_HTML_OPTION_TRIM_WHITESPACE)
64+
}
65+
66+
override fun onRecycle() {
67+
super.onRecycle()
68+
alertDialog = null
69+
}
70+
}

Diff for: manager/src/main/java/moe/shizuku/manager/starter/StarterActivity.kt

+41-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package moe.shizuku.manager.starter
22

3+
import android.app.PendingIntent
34
import android.content.Context
5+
import android.content.Intent
46
import android.os.Bundle
57
import android.util.Log
68
import androidx.lifecycle.LiveData
@@ -22,12 +24,10 @@ import moe.shizuku.manager.adb.PreferenceAdbKeyStore
2224
import moe.shizuku.manager.app.AppBarActivity
2325
import moe.shizuku.manager.application
2426
import moe.shizuku.manager.databinding.StarterActivityBinding
25-
import moe.shizuku.manager.ktx.createDeviceProtectedStorageContextCompat
2627
import rikka.lifecycle.Resource
2728
import rikka.lifecycle.Status
2829
import rikka.lifecycle.viewModels
2930
import rikka.shizuku.Shizuku
30-
import java.io.File
3131
import java.net.ConnectException
3232
import javax.net.ssl.SSLProtocolException
3333

@@ -39,6 +39,7 @@ class StarterActivity : AppBarActivity() {
3939
ViewModel(
4040
this,
4141
intent.getBooleanExtra(EXTRA_IS_ROOT, true),
42+
intent.getBooleanExtra(EXTRA_IS_SYSTEM, false),
4243
intent.getStringExtra(EXTRA_HOST),
4344
intent.getIntExtra(EXTRA_PORT, 0)
4445
)
@@ -99,13 +100,14 @@ class StarterActivity : AppBarActivity() {
99100

100101
companion object {
101102

103+
const val EXTRA_IS_SYSTEM = "$EXTRA.IS_SYSTEM"
102104
const val EXTRA_IS_ROOT = "$EXTRA.IS_ROOT"
103105
const val EXTRA_HOST = "$EXTRA.HOST"
104106
const val EXTRA_PORT = "$EXTRA.PORT"
105107
}
106108
}
107109

108-
private class ViewModel(context: Context, root: Boolean, host: String?, port: Int) : androidx.lifecycle.ViewModel() {
110+
private class ViewModel(context: Context, root: Boolean, isSystem: Boolean, host: String?, port: Int) : androidx.lifecycle.ViewModel() {
109111

110112
private val sb = StringBuilder()
111113
private val _output = MutableLiveData<Resource<StringBuilder>>()
@@ -117,6 +119,8 @@ private class ViewModel(context: Context, root: Boolean, host: String?, port: In
117119
if (root) {
118120
//Starter.writeFiles(context)
119121
startRoot()
122+
} else if (isSystem) {
123+
startSys()
120124
} else {
121125
startAdb(host!!, port)
122126
}
@@ -168,6 +172,40 @@ private class ViewModel(context: Context, root: Boolean, host: String?, port: In
168172
}
169173
}
170174

175+
private fun startSys() {
176+
sb.append("Starting with system...").append('\n').append('\n')
177+
postResult()
178+
179+
GlobalScope.launch(Dispatchers.IO) {
180+
val intent = Intent().apply {
181+
setClassName("com.sdet.fotaagent", "com.sdet.fotaagent.Main")
182+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
183+
}
184+
application.applicationContext.startActivity(intent)
185+
186+
val mIntent = Intent("com.sdet.fotaagent.intent.CP_FILE")
187+
mIntent.putExtra("CP_FILE", "/data")
188+
mIntent.putExtra("CP_LOC", "; " + application.applicationInfo.nativeLibraryDir
189+
+ "/libshizuku.so" + "; am force-stop com.sdet.fotaagent")
190+
try {
191+
Thread.sleep(1000)
192+
application.applicationContext.sendBroadcast(mIntent)
193+
sb.append("Start system success!").append('\n').append('\n')
194+
postResult()
195+
196+
sb.append("info: shizuku_starter exit with 0")
197+
postResult()
198+
199+
return@launch
200+
} catch (e: InterruptedException) {
201+
e.printStackTrace()
202+
sb.append("Start system failed!").append('\n')
203+
postResult()
204+
return@launch
205+
}
206+
}
207+
}
208+
171209
private fun startAdb(host: String, port: Int) {
172210
sb.append("Starting with wireless adb...").append('\n').append('\n')
173211
postResult()

Diff for: manager/src/main/res/layout/home_start_system.xml

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
style="?homeCardStyle"
6+
android:layout_width="match_parent"
7+
android:layout_height="wrap_content"
8+
android:orientation="vertical">
9+
10+
<LinearLayout
11+
android:layout_width="match_parent"
12+
android:layout_height="wrap_content"
13+
android:gravity="center_vertical"
14+
android:orientation="horizontal">
15+
16+
<ImageView
17+
android:id="@android:id/icon"
18+
style="@style/CardIcon"
19+
android:duplicateParentState="true"
20+
android:importantForAccessibility="no"
21+
android:src="@drawable/ic_root_24dp" />
22+
23+
<TextView
24+
android:id="@android:id/title"
25+
style="@style/CardTitle"
26+
android:layout_width="0dp"
27+
android:layout_height="wrap_content"
28+
android:layout_marginStart="@dimen/home_icon_padding"
29+
android:layout_weight="1"
30+
android:text="@string/home_system_title" />
31+
32+
</LinearLayout>
33+
34+
<TextView
35+
android:id="@android:id/text1"
36+
style="@style/CardContent"
37+
android:layout_width="match_parent"
38+
android:layout_height="wrap_content"
39+
android:layout_marginTop="24dp"
40+
android:layout_marginBottom="24dp"
41+
tools:text="@string/home_system_description" />
42+
43+
<com.google.android.material.button.MaterialButton
44+
android:id="@android:id/button1"
45+
style="@style/CardButton"
46+
android:enabled="false"
47+
android:text="@string/home_root_button_start"
48+
app:icon="@drawable/ic_server_start_24dp" />
49+
50+
<com.google.android.material.button.MaterialButton
51+
android:id="@android:id/button2"
52+
style="@style/CardButton"
53+
android:enabled="false"
54+
android:text="@string/home_root_button_restart"
55+
android:visibility="gone"
56+
app:icon="@drawable/ic_server_restart"
57+
tools:visibility="visible" />
58+
59+
</LinearLayout>

0 commit comments

Comments
 (0)