From 74ab0f90ac79fbd4db78618c32ce18574bf6cfb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bala=CC=81zs=20Gerlei?= Date: Tue, 3 Sep 2024 12:34:58 +0200 Subject: [PATCH] Pass AppInfo as Parcelable between Activities instead of relying on storing it in memory in a Singleton manner - Add Kotlin Parcelize dependency and make AppInfo Parcelable - Remove no longer necessary custom Application class (that was previously used to temporarily store the selected AppInfo while navigating between Activities) - Some UI improvements - Improve nullability handling, visibility and mutability --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 1 - .../gerlot/intentfuzzer/AppInfoActivity.kt | 39 +++-- .../dev/gerlot/intentfuzzer/AppInfoAdapter.kt | 16 +- .../gerlot/intentfuzzer/ComponentAdapter.kt | 6 +- .../dev/gerlot/intentfuzzer/FuzzerActivity.kt | 148 ++++++++---------- .../gerlot/intentfuzzer/IntentFuzzerApp.kt | 10 -- .../dev/gerlot/intentfuzzer/MainActivity.kt | 61 +++----- .../gerlot/intentfuzzer/MainMenuAdapter.kt | 6 +- .../dev/gerlot/intentfuzzer/util/AppInfo.kt | 9 +- .../dev/gerlot/intentfuzzer/util/Utils.kt | 27 ++-- app/src/main/res/layout/fuzzer.xml | 31 ++-- build.gradle.kts | 1 + gradle/libs.versions.toml | 1 + 14 files changed, 166 insertions(+), 191 deletions(-) delete mode 100644 app/src/main/java/dev/gerlot/intentfuzzer/IntentFuzzerApp.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 87c7341..caa21fb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.jetbrains.kotlin.parcelize) } android { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f2e572e..ae503a4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,6 @@ tools:ignore="QueryAllPackagesPermission" /> { - progressBar!!.visibility = View.GONE - listView!!.adapter = appInfoAdapter + progressBar?.visibility = View.GONE + listView?.adapter = appInfoAdapter } - Utils.MSG_PROCESSING -> progressBar!!.visibility = View.VISIBLE + Utils.MSG_PROCESSING -> progressBar?.visibility = View.VISIBLE Utils.MSG_ERROR -> {} } } @@ -51,7 +51,6 @@ class AppInfoActivity : AppCompatActivity() { mHandler.obtainMessage(msg).sendToTarget() } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setProgressBarVisibility(true) @@ -62,13 +61,12 @@ class AppInfoActivity : AppCompatActivity() { progressBar = findViewById(R.id.progressbar) as ProgressBar listView = findViewById(R.id.app_listview) as ListView - progressBar!!.isIndeterminate = false + progressBar?.isIndeterminate = false mHandler.obtainMessage(msg).sendToTarget() - val intent = intent - if (intent.hasExtra("type")) { - appType = intent.getIntExtra("type", Utils.ALL_APPS) + if (intent.hasExtra(Utils.APPTYPE_KEY)) { + appType = intent.getIntExtra(Utils.APPTYPE_KEY, Utils.ALL_APPS) } if (mGetPkgInfoThread == null) { @@ -76,19 +74,18 @@ class AppInfoActivity : AppCompatActivity() { mGetPkgInfoThread!!.start() } - listView!!.onItemClickListener = - OnItemClickListener { parent, view, position, id -> - val appInfo: AppInfo = appInfoAdapter!!.getItem(position) as AppInfo - (application as IntentFuzzerApp).packageInfo = appInfo.packageInfo - - val intent = Intent( - this@AppInfoActivity, - FuzzerActivity::class.java - ) - //Bundle bundle = new Bundle(); - //bundle.putParcelable(Utils.PKGINFO_KEY, appInfo.getPackageInfo()); - //intent.putExtras(bundle); - startActivity(intent) + listView?.onItemClickListener = + OnItemClickListener { _, _, position, _ -> + (appInfoAdapter?.getItem(position) as AppInfo).let { appInfo -> + Intent(this, FuzzerActivity::class.java).also { newIntent -> + Bundle().apply { + putParcelable(Utils.APPINFO_KEY, appInfo) + }.also { + newIntent.putExtras(it); + startActivity(newIntent) + } + } + } } } diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/AppInfoAdapter.kt b/app/src/main/java/dev/gerlot/intentfuzzer/AppInfoAdapter.kt index 4fd41d6..bc956c1 100644 --- a/app/src/main/java/dev/gerlot/intentfuzzer/AppInfoAdapter.kt +++ b/app/src/main/java/dev/gerlot/intentfuzzer/AppInfoAdapter.kt @@ -7,13 +7,13 @@ import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ImageView import android.widget.TextView +import androidx.core.graphics.drawable.toDrawable import dev.gerlot.intentfuzzer.util.AppInfo -class AppInfoAdapter(context: Context, appInfos: List?) : - BaseAdapter() { +class AppInfoAdapter(context: Context, appInfos: List?) : BaseAdapter() { private var mlistAppInfo: List? = null - var infater: LayoutInflater? = null + private var infater: LayoutInflater? = null init { infater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater @@ -38,16 +38,16 @@ class AppInfoAdapter(context: Context, appInfos: List?) : if (convertview?.tag == null) { view = infater?.inflate(R.layout.package_info, null) holder = ViewHolder(view!!) - view!!.tag = holder + view.tag = holder } else { view = convertview holder = convertview.tag as ViewHolder } val appInfo: AppInfo = getItem(position) as AppInfo - holder!!.appIcon.setImageDrawable(appInfo.appIcon) - holder.appName.setText(appInfo.appName) - holder.packageName.setText(appInfo.packageName) - return view!! + holder.appIcon.setImageBitmap(appInfo.appIcon) + holder.appName.text = appInfo.appName + holder.packageName.text = appInfo.packageName + return view } internal inner class ViewHolder(view: View) { diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/ComponentAdapter.kt b/app/src/main/java/dev/gerlot/intentfuzzer/ComponentAdapter.kt index b9fba0f..3efb7aa 100644 --- a/app/src/main/java/dev/gerlot/intentfuzzer/ComponentAdapter.kt +++ b/app/src/main/java/dev/gerlot/intentfuzzer/ComponentAdapter.kt @@ -12,7 +12,7 @@ class ComponentAdapter(context: Context, componentInfos: List?) : BaseAdapter() { private var mlistComponentInfo: List? = null - var infater: LayoutInflater? = null + private var infater: LayoutInflater? = null init { infater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater @@ -32,8 +32,8 @@ class ComponentAdapter(context: Context, componentInfos: List?) : } override fun getView(position: Int, convertview: View?, viewGroup: ViewGroup): View { - var view: View? = null - var holder: ViewHolder? = null + val view: View? + val holder: ViewHolder? if (convertview?.tag == null) { view = infater?.inflate(R.layout.component, null) holder = ViewHolder(view!!) diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/FuzzerActivity.kt b/app/src/main/java/dev/gerlot/intentfuzzer/FuzzerActivity.kt index 4f7fb4f..dacd1c0 100644 --- a/app/src/main/java/dev/gerlot/intentfuzzer/FuzzerActivity.kt +++ b/app/src/main/java/dev/gerlot/intentfuzzer/FuzzerActivity.kt @@ -7,17 +7,15 @@ import android.os.Bundle import android.util.Log import android.view.MenuItem import android.view.View -import android.widget.AdapterView import android.widget.AdapterView.OnItemClickListener import android.widget.AdapterView.OnItemLongClickListener -import android.widget.ArrayAdapter import android.widget.Button import android.widget.ListView -import android.widget.Spinner import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButtonToggleGroup +import dev.gerlot.intentfuzzer.util.AppInfo import dev.gerlot.intentfuzzer.util.ComponentInfo import dev.gerlot.intentfuzzer.util.SerializableTest import dev.gerlot.intentfuzzer.util.Utils @@ -31,7 +29,6 @@ class FuzzerActivity : AppCompatActivity() { private var fuzzAllNullBtn: Button? = null private var fuzzAllSeBtn: Button? = null - //private var cmpAdapter: ArrayAdapter? = null private var cmpAdapter: ComponentAdapter? = null private val cmpNames = ArrayList() @@ -44,9 +41,14 @@ class FuzzerActivity : AppCompatActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) - //pkgInfo = getPkgInfo(); - pkgInfo = (application as IntentFuzzerApp).packageInfo - if (pkgInfo == null) { + val appInfo: AppInfo? = if (intent.hasExtra(Utils.APPINFO_KEY)) { + intent.getParcelableExtra(Utils.APPINFO_KEY) + } else null + + if (appInfo != null) { + title = appInfo.appName + pkgInfo = appInfo.packageInfo + } else { Toast.makeText(this, R.string.pkginfo_null, Toast.LENGTH_LONG).show() return } @@ -65,79 +67,70 @@ class FuzzerActivity : AppCompatActivity() { return super.onOptionsItemSelected(item) } - private fun getPkgInfo(): PackageInfo? { - var pkgInfo: PackageInfo? = null - - val intent = intent - if (intent.hasExtra(Utils.PKGINFO_KEY)) { - pkgInfo = intent.getParcelableExtra(Utils.PKGINFO_KEY) - } - - return pkgInfo - } - private fun initView() { - typeGroup = findViewById(R.id.type_select)!! + typeGroup = findViewById(R.id.type_select) cmpListView = findViewById(R.id.cmp_listview) fuzzAllNullBtn = findViewById(R.id.fuzz_all_null) fuzzAllSeBtn = findViewById(R.id.fuzz_all_se) - cmpListView!!.onItemClickListener = - OnItemClickListener { parent, view, position, id -> - var toSend: ComponentName? = null - val intent = Intent() - val className = cmpAdapter!!.getItem(position).toString() - for (component in components) { - if (component.name.className == className) { - toSend = component.name - break + cmpListView?.onItemClickListener = + OnItemClickListener { _, _, position, _ -> + cmpAdapter?.getItem(position).toString().let { className -> + val intentToSend = Intent() + var targetComponentName: ComponentName? = null + for (component in components) { + if (component.name.className == className) { + targetComponentName = component.name + break + } } - } - intent.setComponent(toSend) - if (sendIntentByType(intent, currentType)) { - Toast.makeText(this@FuzzerActivity, "Sent Null $intent", Toast.LENGTH_LONG) - .show() - } else { - Toast.makeText(this@FuzzerActivity, "Send $intent Failed!", Toast.LENGTH_LONG) - .show() + intentToSend.setComponent(targetComponentName) + if (sendIntentByType(intentToSend, currentType)) { + Toast.makeText(this@FuzzerActivity, "Sent Null $intentToSend", Toast.LENGTH_LONG) + .show() + } else { + Toast.makeText(this@FuzzerActivity, "Send $intentToSend Failed!", Toast.LENGTH_LONG) + .show() + } } } - cmpListView!!.onItemLongClickListener = - OnItemLongClickListener { parent, view, position, id -> - var toSend: ComponentName? = null - val intent = Intent() - val className = cmpAdapter!!.getItem(position).toString() - for (component in components) { - if (component.name.className == className) { - toSend = component.name - break + cmpListView?.onItemLongClickListener = + OnItemLongClickListener { _, _, position, _ -> + cmpAdapter?.getItem(position).toString().let { className -> + val intentToSend = Intent() + var targetComponentName: ComponentName? = null + for (component in components) { + if (component.name.className == className) { + targetComponentName = component.name + break + } } - } - - intent.setComponent(toSend) - intent.putExtra("test", SerializableTest()) - if (sendIntentByType(intent, currentType)) { - Toast.makeText( - this@FuzzerActivity, - "Sent Serializeable $intent", Toast.LENGTH_LONG - ).show() - } else { - Toast.makeText(this@FuzzerActivity, "Send $intent Failed!", Toast.LENGTH_LONG) - .show() + intentToSend.setComponent(targetComponentName) + intentToSend.putExtra("test", SerializableTest()) + + if (sendIntentByType(intentToSend, currentType)) { + Toast.makeText( + this@FuzzerActivity, + "Sent Serializeable $intentToSend", Toast.LENGTH_LONG + ).show() + } else { + Toast.makeText(this@FuzzerActivity, "Send $intentToSend Failed!", Toast.LENGTH_LONG) + .show() + } } true } - fuzzAllNullBtn!!.setOnClickListener { + fuzzAllNullBtn?.setOnClickListener { for (component in components) { - val intent = Intent() - intent.setComponent(component.name) - if (sendIntentByType(intent, currentType)) { - Toast.makeText(this@FuzzerActivity, "Sent Null $intent", Toast.LENGTH_LONG) + val intentToSend = Intent() + intentToSend.setComponent(component.name) + if (sendIntentByType(intentToSend, currentType)) { + Toast.makeText(this@FuzzerActivity, "Sent Null $intentToSend", Toast.LENGTH_LONG) .show() } else { Toast.makeText(this@FuzzerActivity, R.string.send_faild, Toast.LENGTH_LONG) @@ -146,15 +139,15 @@ class FuzzerActivity : AppCompatActivity() { } } - fuzzAllSeBtn!!.setOnClickListener { + fuzzAllSeBtn?.setOnClickListener { for (component in components) { - val intent = Intent() - intent.setComponent(component.name) - intent.putExtra("test", SerializableTest()) - if (sendIntentByType(intent, currentType)) { + val intentToSend = Intent() + intentToSend.setComponent(component.name) + intentToSend.putExtra("test", SerializableTest()) + if (sendIntentByType(intentToSend, currentType)) { Toast.makeText( this@FuzzerActivity, - "Sent Serializeable $intent", Toast.LENGTH_LONG + "Sent Serializeable $intentToSend", Toast.LENGTH_LONG ).show() } else { Toast.makeText(this@FuzzerActivity, R.string.send_faild, Toast.LENGTH_LONG) @@ -168,9 +161,9 @@ class FuzzerActivity : AppCompatActivity() { cmpTypes.forEach { type -> val button = MaterialButton(this, null, com.google.android.material.R.attr.materialButtonOutlinedStyle) button.text = type - typeGroup!!.addView(button) + typeGroup?.addView(button) } - typeGroup!!.addOnButtonCheckedListener { toggleButton, checkedId, isChecked -> + typeGroup?.addOnButtonCheckedListener { _, checkedId, isChecked -> if (isChecked) { Log.d("salala", "checkedId: $checkedId") cmpTypes.forEachIndexed { index, _ -> @@ -181,12 +174,12 @@ class FuzzerActivity : AppCompatActivity() { } } } - (typeGroup!!.getChildAt(0) as MaterialButton).isChecked = true + (typeGroup?.getChildAt(0) as MaterialButton?)?.isChecked = true } private fun updateComponents(currentType: String?) { - fuzzAllNullBtn!!.visibility = View.INVISIBLE - fuzzAllSeBtn!!.visibility = View.INVISIBLE + fuzzAllNullBtn?.visibility = View.INVISIBLE + fuzzAllSeBtn?.visibility = View.INVISIBLE components = getComponents(currentType) cmpNames.clear() if (components.isNotEmpty()) { @@ -196,8 +189,8 @@ class FuzzerActivity : AppCompatActivity() { } } - fuzzAllNullBtn!!.visibility = View.VISIBLE - fuzzAllSeBtn!!.visibility = View.VISIBLE + fuzzAllNullBtn?.visibility = View.VISIBLE + fuzzAllSeBtn?.visibility = View.VISIBLE } else { Toast.makeText(this, R.string.no_compt, Toast.LENGTH_LONG).show() } @@ -227,7 +220,7 @@ class FuzzerActivity : AppCompatActivity() { private fun setListView() { cmpAdapter = ComponentAdapter(this, components) - cmpListView!!.adapter = cmpAdapter + cmpListView?.adapter = cmpAdapter } private fun sendIntentByType(intent: Intent, type: String?): Boolean { @@ -237,17 +230,14 @@ class FuzzerActivity : AppCompatActivity() { startActivity(intent) return true } - Utils.RECEIVERS -> { sendBroadcast(intent) return true } - Utils.SERVICES -> { startService(intent) return true } - else -> return true } } catch (e: Exception) { diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/IntentFuzzerApp.kt b/app/src/main/java/dev/gerlot/intentfuzzer/IntentFuzzerApp.kt deleted file mode 100644 index 77bb505..0000000 --- a/app/src/main/java/dev/gerlot/intentfuzzer/IntentFuzzerApp.kt +++ /dev/null @@ -1,10 +0,0 @@ -package dev.gerlot.intentfuzzer - -import android.app.Application -import android.content.pm.PackageInfo - -class IntentFuzzerApp: Application() { - - var packageInfo: PackageInfo? = null - -} diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/MainActivity.kt b/app/src/main/java/dev/gerlot/intentfuzzer/MainActivity.kt index edf6316..4cf5a59 100644 --- a/app/src/main/java/dev/gerlot/intentfuzzer/MainActivity.kt +++ b/app/src/main/java/dev/gerlot/intentfuzzer/MainActivity.kt @@ -14,52 +14,39 @@ import dev.gerlot.intentfuzzer.util.Utils class MainActivity : AppCompatActivity() { - private var gridView: GridView? = null - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) - gridView = findViewById(R.id.gridview) as GridView - gridView!!.selector = ColorDrawable(Color.TRANSPARENT) - gridView!!.setAdapter(MainMenuAdapter(this)) - gridView!!.onItemClickListener = - OnItemClickListener { parent, view, position, id -> - if (position == 0) { - val intent = Intent( - this@MainActivity, - AppInfoActivity::class.java - ) - intent.putExtra("type", Utils.ALL_APPS) - startActivity(intent) - } - if (position == 1) { - val intent = Intent( - this@MainActivity, - AppInfoActivity::class.java - ) - intent.putExtra("type", Utils.SYSTEM_APPS) - startActivity(intent) - } - - if (position == 2) { - val intent = Intent( - this@MainActivity, - AppInfoActivity::class.java - ) - intent.putExtra("type", Utils.NONSYSTEM_APPS) - startActivity(intent) - } - if (position == 3) { - val dialog = Dialog(this@MainActivity, R.style.dialog) - dialog.setContentView(R.layout.dialog) - dialog.show() + val gridView: GridView = findViewById(R.id.gridview) + gridView.selector = ColorDrawable(Color.TRANSPARENT) + gridView.setAdapter(MainMenuAdapter(this)) + gridView.onItemClickListener = + OnItemClickListener { _, _, position, _ -> + when(position) { + Utils.ALL_APPS -> Intent(this@MainActivity, AppInfoActivity::class.java).apply { + putExtra(Utils.APPTYPE_KEY, Utils.ALL_APPS) + }.also { + startActivity(it) + } + Utils.SYSTEM_APPS -> Intent(this@MainActivity, AppInfoActivity::class.java).apply { + putExtra(Utils.APPTYPE_KEY, Utils.SYSTEM_APPS) + }.also { + startActivity(it) + } + Utils.NONSYSTEM_APPS -> Intent(this@MainActivity, AppInfoActivity::class.java).apply { + putExtra(Utils.APPTYPE_KEY, Utils.NONSYSTEM_APPS) + }.also { + startActivity(it) + } + Utils.ABOUT -> Dialog(this@MainActivity, R.style.dialog).apply { + setContentView(R.layout.dialog) + }.show() } } } override fun onCreateOptionsMenu(menu: Menu?): Boolean { - // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.main, menu) return true } diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/MainMenuAdapter.kt b/app/src/main/java/dev/gerlot/intentfuzzer/MainMenuAdapter.kt index 3fbc508..ee397b2 100644 --- a/app/src/main/java/dev/gerlot/intentfuzzer/MainMenuAdapter.kt +++ b/app/src/main/java/dev/gerlot/intentfuzzer/MainMenuAdapter.kt @@ -12,7 +12,7 @@ class MainMenuAdapter(context: Context) : BaseAdapter() { private var mContext: Context? = null private val alpha = 180 - var infater: LayoutInflater? = null + private var infater: LayoutInflater? = null override fun getCount(): Int { return mThumbIds.size @@ -27,8 +27,8 @@ class MainMenuAdapter(context: Context) : BaseAdapter() { } override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - var view: View? = null - var holder: ViewHolder? = null + val view: View? + val holder: ViewHolder? if (convertView == null) { view = infater?.inflate(R.layout.menu_item, null) holder = ViewHolder(view!!) diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/util/AppInfo.kt b/app/src/main/java/dev/gerlot/intentfuzzer/util/AppInfo.kt index ebd212c..752f3ae 100644 --- a/app/src/main/java/dev/gerlot/intentfuzzer/util/AppInfo.kt +++ b/app/src/main/java/dev/gerlot/intentfuzzer/util/AppInfo.kt @@ -1,11 +1,14 @@ package dev.gerlot.intentfuzzer.util import android.content.pm.PackageInfo -import android.graphics.drawable.Drawable +import android.graphics.Bitmap +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +@Parcelize data class AppInfo( var appName: String = "", var packageName: String = "", - var appIcon: Drawable? = null, + var appIcon: Bitmap? = null, var packageInfo: PackageInfo? = null, -) +) : Parcelable diff --git a/app/src/main/java/dev/gerlot/intentfuzzer/util/Utils.kt b/app/src/main/java/dev/gerlot/intentfuzzer/util/Utils.kt index 0479cb1..5b0e2bb 100644 --- a/app/src/main/java/dev/gerlot/intentfuzzer/util/Utils.kt +++ b/app/src/main/java/dev/gerlot/intentfuzzer/util/Utils.kt @@ -4,25 +4,26 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo import android.content.pm.PackageManager +import androidx.core.graphics.drawable.toBitmap object Utils { - var ALL_APPS: Int = 0 - var SYSTEM_APPS: Int = 1 - var NONSYSTEM_APPS: Int = 2 - var ABOUNT: Int = 3 + const val ALL_APPS: Int = 0 + const val SYSTEM_APPS: Int = 1 + const val NONSYSTEM_APPS: Int = 2 + const val ABOUT: Int = 3 - val MSG_PROCESSING: Int = 0 - val MSG_DONE: Int = 1 - val MSG_ERROR: Int = 2 + const val MSG_PROCESSING: Int = 0 + const val MSG_DONE: Int = 1 + const val MSG_ERROR: Int = 2 - val ACTIVITIES: Int = 0 - val RECEIVERS: Int = 1 - val SERVICES: Int = 2 + const val ACTIVITIES: Int = 0 + const val RECEIVERS: Int = 1 + const val SERVICES: Int = 2 - val PKGINFO_KEY: String = "pkginfo" - val APPTYPE_KEY: String = "apptype" + const val APPINFO_KEY: String = "appinfo" + const val APPTYPE_KEY: String = "apptype" fun getPackageInfo(context: Context, type: Int): List { val pkgInfoList: MutableList = ArrayList() @@ -59,7 +60,7 @@ object Utils { appInfo.packageInfo = packageInfo appInfo.appName = packageInfo.applicationInfo.loadLabel(context.packageManager).toString() appInfo.packageName = packageInfo.packageName - appInfo.appIcon = packageInfo.applicationInfo.loadIcon(context.packageManager) + appInfo.appIcon = packageInfo.applicationInfo.loadIcon(context.packageManager).toBitmap() return appInfo } diff --git a/app/src/main/res/layout/fuzzer.xml b/app/src/main/res/layout/fuzzer.xml index 4f25d54..25c1a91 100644 --- a/app/src/main/res/layout/fuzzer.xml +++ b/app/src/main/res/layout/fuzzer.xml @@ -23,30 +23,35 @@ android:layout_height="0dp" android:layout_weight="1"/> - + android:layout_height="68dp" + android:layout_marginTop="10dp" + android:orientation="horizontal">