Skip to content

Commit 6feb534

Browse files
committed
import: add granular power-user source toggles
1 parent 863cdd3 commit 6feb534

11 files changed

Lines changed: 194 additions & 11 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.kyhsgeekcode.disassembler.importing
2+
3+
enum class AdvancedImportSource {
4+
Filesystem,
5+
InstalledApps,
6+
ResearchTools
7+
}
8+
9+
data class AdvancedImportOptions(
10+
val powerUserMode: Boolean,
11+
val filesystemAccess: Boolean,
12+
val installedAppsAccess: Boolean,
13+
val researchToolsAccess: Boolean
14+
)
15+
16+
interface AdvancedImportSourceCatalog {
17+
fun visibleSources(options: AdvancedImportOptions): List<AdvancedImportSource>
18+
}
19+
20+
object DefaultAdvancedImportSourceCatalog : AdvancedImportSourceCatalog {
21+
override fun visibleSources(options: AdvancedImportOptions): List<AdvancedImportSource> {
22+
if (!options.powerUserMode) {
23+
return emptyList()
24+
}
25+
26+
val visible = mutableListOf<AdvancedImportSource>()
27+
if (options.filesystemAccess) {
28+
visible += AdvancedImportSource.Filesystem
29+
}
30+
if (options.installedAppsAccess) {
31+
visible += AdvancedImportSource.InstalledApps
32+
}
33+
if (options.researchToolsAccess) {
34+
visible += AdvancedImportSource.ResearchTools
35+
}
36+
return visible
37+
}
38+
}

app/src/main/java/com/kyhsgeekcode/disassembler/preference/PowerUserModeSettings.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,26 @@ package com.kyhsgeekcode.disassembler.preference
22

33
import android.content.Context
44
import com.kyhsgeekcode.disassembler.MainActivity
5+
import com.kyhsgeekcode.disassembler.importing.AdvancedImportOptions
56

67
object PowerUserModeSettings {
78
const val POWER_USER_IMPORT_MODE_KEY = "power_user_import_mode"
9+
const val POWER_USER_FILESYSTEM_IMPORT_KEY = "power_user_filesystem_import"
10+
const val POWER_USER_APPS_IMPORT_KEY = "power_user_apps_import"
11+
const val POWER_USER_RESEARCH_TOOLS_IMPORT_KEY = "power_user_research_tools_import"
812

913
fun isEnabled(context: Context): Boolean {
1014
return context.getSharedPreferences(MainActivity.SETTINGKEY, Context.MODE_PRIVATE)
1115
.getBoolean(POWER_USER_IMPORT_MODE_KEY, false)
1216
}
17+
18+
fun advancedImportOptions(context: Context): AdvancedImportOptions {
19+
val prefs = context.getSharedPreferences(MainActivity.SETTINGKEY, Context.MODE_PRIVATE)
20+
return AdvancedImportOptions(
21+
powerUserMode = prefs.getBoolean(POWER_USER_IMPORT_MODE_KEY, false),
22+
filesystemAccess = prefs.getBoolean(POWER_USER_FILESYSTEM_IMPORT_KEY, true),
23+
installedAppsAccess = prefs.getBoolean(POWER_USER_APPS_IMPORT_KEY, true),
24+
researchToolsAccess = prefs.getBoolean(POWER_USER_RESEARCH_TOOLS_IMPORT_KEY, false)
25+
)
26+
}
1327
}

app/src/main/java/com/kyhsgeekcode/disassembler/preference/SettingsFragment.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ import java.util.*
2424
class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceClickListener,
2525
Preference.OnPreferenceChangeListener {
2626
private lateinit var prefnames: Array<String?>
27+
private var powerUserPreference: SwitchPreferenceCompat? = null
28+
private var filesystemPreference: SwitchPreferenceCompat? = null
29+
private var appsPreference: SwitchPreferenceCompat? = null
30+
private var researchToolsPreference: SwitchPreferenceCompat? = null
31+
2732
override fun onPreferenceChange(p1: Preference, p2: Any): Boolean {
2833
val key = p1.key
2934
if ("predefinedcolor" == key) {
@@ -60,6 +65,9 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceClic
6065
val ed = sp.edit()
6166
ed.putString("PaletteName", name).apply()
6267
ColorHelper.setPalette(name)
68+
} else if (PowerUserModeSettings.POWER_USER_IMPORT_MODE_KEY == key) {
69+
updatePowerUserPreferenceVisibility(p2 as Boolean)
70+
return true
6371
}
6472
return false
6573
}
@@ -118,7 +126,18 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceClic
118126
false
119127
}
120128
lp.onPreferenceChangeListener = this
121-
findPreference<SwitchPreferenceCompat>(PowerUserModeSettings.POWER_USER_IMPORT_MODE_KEY)
129+
powerUserPreference =
130+
findPreference(PowerUserModeSettings.POWER_USER_IMPORT_MODE_KEY)
131+
filesystemPreference =
132+
findPreference(PowerUserModeSettings.POWER_USER_FILESYSTEM_IMPORT_KEY)
133+
appsPreference =
134+
findPreference(PowerUserModeSettings.POWER_USER_APPS_IMPORT_KEY)
135+
researchToolsPreference =
136+
findPreference(PowerUserModeSettings.POWER_USER_RESEARCH_TOOLS_IMPORT_KEY)
137+
powerUserPreference?.onPreferenceChangeListener = this
138+
updatePowerUserPreferenceVisibility(
139+
powerUserPreference?.isChecked ?: false
140+
)
122141
val scrn = findPreference<Preference>("openscrn")
123142
scrn?.setOnPreferenceClickListener {
124143
LibsBuilder()
@@ -139,4 +158,10 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceClic
139158
// setOnPreferenceChange(findPreference("autoUpdate_ringtone"));
140159
// requestAppPermissions(this);
141160
}
161+
162+
private fun updatePowerUserPreferenceVisibility(enabled: Boolean) {
163+
filesystemPreference?.isVisible = enabled
164+
appsPreference?.isVisible = enabled
165+
researchToolsPreference?.isVisible = enabled
166+
}
142167
}

app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.lifecycle.lifecycleScope
1313
import androidx.recyclerview.widget.LinearLayoutManager
1414
import com.kyhsgeekcode.disassembler.ProgressHandler
1515
import com.kyhsgeekcode.disassembler.databinding.ActivityNewFileChooserBinding
16+
import com.kyhsgeekcode.disassembler.preference.PowerUserModeSettings
1617
import com.kyhsgeekcode.disassembler.showYesNoDialog
1718
import com.kyhsgeekcode.download
1819
import com.kyhsgeekcode.filechooser.model.FileItem
@@ -37,6 +38,9 @@ class NewFileChooserActivity : AppCompatActivity(), ProgressHandler {
3738
private val powerUserMode by lazy {
3839
intent?.getBooleanExtra(EXTRA_POWER_USER_MODE, false) ?: false
3940
}
41+
val advancedImportOptions by lazy {
42+
PowerUserModeSettings.advancedImportOptions(this).copy(powerUserMode = powerUserMode)
43+
}
4044

4145
private val snackProgressBarManager by lazy {
4246
SnackProgressBarManager(
@@ -73,7 +77,7 @@ class NewFileChooserActivity : AppCompatActivity(), ProgressHandler {
7377
super.onCreate(savedInstanceState)
7478
_binding = ActivityNewFileChooserBinding.inflate(layoutInflater)
7579
setContentView(binding.root)
76-
adapter = NewFileChooserAdapter(this, powerUserMode)
80+
adapter = NewFileChooserAdapter(this, advancedImportOptions)
7781
lifecycleScope.launch {
7882
adapter.tryAddRootItems()
7983
}

app/src/main/java/com/kyhsgeekcode/filechooser/NewFileChooserAdapter.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.widget.Toast
99
import androidx.appcompat.app.AlertDialog
1010
import androidx.recyclerview.widget.RecyclerView
1111
import com.kyhsgeekcode.disassembler.databinding.NewFileChooserRowBinding
12+
import com.kyhsgeekcode.disassembler.importing.AdvancedImportOptions
1213
import com.kyhsgeekcode.disassembler.showEditDialog
1314
import com.kyhsgeekcode.filechooser.model.FileItem
1415
import kotlinx.coroutines.*
@@ -19,7 +20,7 @@ import kotlin.collections.ArrayList
1920
class NewFileChooserAdapter(
2021
private
2122
val parentActivity: NewFileChooserActivity,
22-
private val powerUserMode: Boolean
23+
private val advancedImportOptions: AdvancedImportOptions
2324
) : RecyclerView.Adapter<NewFileChooserAdapter.ViewHolder>() {
2425
val TAG = "Adapter"
2526
private val values: MutableList<FileItem> = ArrayList()
@@ -166,7 +167,7 @@ class NewFileChooserAdapter(
166167
}
167168

168169
suspend fun tryAddRootItems() {
169-
val items: List<FileItem> = FileItem.rootEntries(powerUserMode)
170+
val items: List<FileItem> = FileItem.rootEntries(advancedImportOptions)
170171
values.addAll(items)
171172
}
172173

@@ -250,7 +251,7 @@ class NewFileChooserAdapter(
250251
currentParentItem = lastItem
251252
CoroutineScope(Dispatchers.Default).launch {
252253
val items = if (currentParentItem == FileItem.rootItem) {
253-
FileItem.rootEntries(powerUserMode)
254+
FileItem.rootEntries(advancedImportOptions)
254255
} else {
255256
listSubItemsCached(currentParentItem)
256257
}

app/src/main/java/com/kyhsgeekcode/filechooser/model/FileItem.kt

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import androidx.core.content.ContextCompat
88
import at.pollaknet.api.facile.Facile
99
import com.kyhsgeekcode.*
1010
import com.kyhsgeekcode.disassembler.R
11+
import com.kyhsgeekcode.disassembler.importing.AdvancedImportOptions
12+
import com.kyhsgeekcode.disassembler.importing.AdvancedImportSource
13+
import com.kyhsgeekcode.disassembler.importing.DefaultAdvancedImportSourceCatalog
1114
import kotlinx.coroutines.Dispatchers
1215
import kotlinx.coroutines.withContext
1316
import splitties.init.appCtx
@@ -207,20 +210,41 @@ open class FileItem : Serializable {
207210
companion object {
208211
val rootItem = object : FileItem("Main") {
209212
override suspend fun listSubItems(publisher: (Int, Int) -> Unit): List<FileItem> {
210-
return rootEntries(powerUserMode = true)
213+
return rootEntries(
214+
AdvancedImportOptions(
215+
powerUserMode = true,
216+
filesystemAccess = true,
217+
installedAppsAccess = true,
218+
researchToolsAccess = true
219+
)
220+
)
211221
}
212222

213223
override fun canExpand(): Boolean = true
214224
override fun isRawAvailable(): Boolean = false
215225
override fun isProjectAble(): Boolean = false
216226
}
217227

218-
fun rootEntries(powerUserMode: Boolean): List<FileItem> {
219-
return if (powerUserMode) {
220-
listOf(fileRoot, fileSdcard, apps, processes, others, zoo, hash)
221-
} else {
222-
listOf(others)
228+
fun rootEntries(options: AdvancedImportOptions): List<FileItem> {
229+
if (!options.powerUserMode) {
230+
return listOf(others)
223231
}
232+
233+
val visibleSources = DefaultAdvancedImportSourceCatalog.visibleSources(options)
234+
val result = mutableListOf<FileItem>(others)
235+
if (AdvancedImportSource.Filesystem in visibleSources) {
236+
result += fileRoot
237+
result += fileSdcard
238+
result += processes
239+
}
240+
if (AdvancedImportSource.InstalledApps in visibleSources) {
241+
result += apps
242+
}
243+
if (AdvancedImportSource.ResearchTools in visibleSources) {
244+
result += zoo
245+
result += hash
246+
}
247+
return result
224248
}
225249

226250
val fileRoot = FileItem(file = File("/"))

app/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@
5858
<string name="power_user_features">Power-user features</string>
5959
<string name="power_user_import_title">Enable power-user import options</string>
6060
<string name="power_user_import_summary">Show advanced non-SAF import entry points such as root and direct filesystem browsing.</string>
61+
<string name="power_user_filesystem_import_title">Enable filesystem sources</string>
62+
<string name="power_user_filesystem_import_summary">Show root, storage, and process-oriented filesystem entry points in Advanced import.</string>
63+
<string name="power_user_apps_import_title">Enable installed apps source</string>
64+
<string name="power_user_apps_import_summary">Show installed application packages in Advanced import.</string>
65+
<string name="power_user_research_tools_import_title">Enable research tools</string>
66+
<string name="power_user_research_tools_import_summary">Show malware zoo and hash lookup tools in Advanced import.</string>
6167
<string name="architecture">Architecture:</string>
6268
<string name="finish_setup">Finish Setup</string>
6369
<string name="override_autosetup">Override autosetup</string>

app/src/main/res/xml-v30/pref_settings.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@
2626
android:key="power_user_import_mode"
2727
android:summary="@string/power_user_import_summary"
2828
android:title="@string/power_user_import_title" />
29+
<SwitchPreferenceCompat
30+
android:defaultValue="true"
31+
android:key="power_user_filesystem_import"
32+
android:summary="@string/power_user_filesystem_import_summary"
33+
android:title="@string/power_user_filesystem_import_title" />
34+
<SwitchPreferenceCompat
35+
android:defaultValue="true"
36+
android:key="power_user_apps_import"
37+
android:summary="@string/power_user_apps_import_summary"
38+
android:title="@string/power_user_apps_import_title" />
39+
<SwitchPreferenceCompat
40+
android:defaultValue="false"
41+
android:key="power_user_research_tools_import"
42+
android:summary="@string/power_user_research_tools_import_summary"
43+
android:title="@string/power_user_research_tools_import_title" />
2944
</PreferenceCategory>
3045
<PreferenceCategory android:title="@string/app_info">
3146
<Preference

app/src/main/res/xml/pref_settings.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@
2626
android:key="power_user_import_mode"
2727
android:summary="@string/power_user_import_summary"
2828
android:title="@string/power_user_import_title" />
29+
<SwitchPreferenceCompat
30+
android:defaultValue="true"
31+
android:key="power_user_filesystem_import"
32+
android:summary="@string/power_user_filesystem_import_summary"
33+
android:title="@string/power_user_filesystem_import_title" />
34+
<SwitchPreferenceCompat
35+
android:defaultValue="true"
36+
android:key="power_user_apps_import"
37+
android:summary="@string/power_user_apps_import_summary"
38+
android:title="@string/power_user_apps_import_title" />
39+
<SwitchPreferenceCompat
40+
android:defaultValue="false"
41+
android:key="power_user_research_tools_import"
42+
android:summary="@string/power_user_research_tools_import_summary"
43+
android:title="@string/power_user_research_tools_import_title" />
2944
</PreferenceCategory>
3045
<!-- <PreferenceCategory android:title="Security configuration">-->
3146
<!-- <Preference android:title="Manage this app\'s all storage access">-->
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.kyhsgeekcode.disassembler.importing
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.Test
5+
6+
class AdvancedImportSourceCatalogTest {
7+
@Test
8+
fun `power user disabled exposes no advanced sources`() {
9+
assertEquals(
10+
emptyList<AdvancedImportSource>(),
11+
DefaultAdvancedImportSourceCatalog.visibleSources(
12+
AdvancedImportOptions(
13+
powerUserMode = false,
14+
filesystemAccess = true,
15+
installedAppsAccess = true,
16+
researchToolsAccess = true
17+
)
18+
)
19+
)
20+
}
21+
22+
@Test
23+
fun `power user mode exposes only enabled advanced source groups`() {
24+
assertEquals(
25+
listOf(
26+
AdvancedImportSource.Filesystem,
27+
AdvancedImportSource.ResearchTools
28+
),
29+
DefaultAdvancedImportSourceCatalog.visibleSources(
30+
AdvancedImportOptions(
31+
powerUserMode = true,
32+
filesystemAccess = true,
33+
installedAppsAccess = false,
34+
researchToolsAccess = true
35+
)
36+
)
37+
)
38+
}
39+
}

0 commit comments

Comments
 (0)