From 1ac6814b580ca46a73209bc513bc23ec12be1b0b Mon Sep 17 00:00:00 2001 From: ottoptj Date: Sun, 8 Sep 2024 06:15:55 +0300 Subject: [PATCH] Less broken contacts functionality --- .../java/eu/ottop/yamlauncher/MainActivity.kt | 36 ++++--------------- .../settings/AppMenuSettingsFragment.kt | 24 +++++++++++++ .../yamlauncher/settings/SettingsActivity.kt | 32 ++++++++++++++++- .../yamlauncher/settings/SettingsFragment.kt | 1 + .../settings/SharedPreferenceManager.kt | 6 ++++ .../eu/ottop/yamlauncher/utils/AppUtils.kt | 3 ++ .../yamlauncher/utils/PermissionUtils.kt | 15 ++++++++ 7 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/eu/ottop/yamlauncher/utils/PermissionUtils.kt diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt index 807a079..8ce3796 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt @@ -57,6 +57,7 @@ import eu.ottop.yamlauncher.utils.AppMenuEdgeFactory import eu.ottop.yamlauncher.utils.AppMenuLinearLayoutManager import eu.ottop.yamlauncher.utils.AppUtils import eu.ottop.yamlauncher.utils.GestureUtils +import eu.ottop.yamlauncher.utils.PermissionUtils import eu.ottop.yamlauncher.utils.StringUtils import eu.ottop.yamlauncher.utils.UIUtils import eu.ottop.yamlauncher.utils.WeatherSystem @@ -74,6 +75,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private lateinit var weatherSystem: WeatherSystem private lateinit var appUtils: AppUtils private val stringUtils = StringUtils() + private val permissionUtils = PermissionUtils() private lateinit var uiUtils: UIUtils private lateinit var gestureUtils: GestureUtils @@ -489,9 +491,6 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh } "contactsEnabled" -> { - if (sharedPreferenceManager.areContactsEnabled()) { - checkContactsPermission() - } uiUtils.setContactsVisibility(searchSwitcher, binding.searchLayout, binding.searchReplacement) } @@ -692,9 +691,8 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh setupAppRecycler(newApps) setupSearch() - if (sharedPreferenceManager.areContactsEnabled()) { - setupContactRecycler() - } + setupContactRecycler() + } } @@ -737,10 +735,6 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh } private fun getContacts(filterString: String): MutableList> { - if (!checkContactsPermission()) { - return mutableListOf() - } - val contacts = mutableListOf>() val contentResolver: ContentResolver = contentResolver @@ -775,26 +769,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh return contacts } - private fun checkContactsPermission(): Boolean { - try { - if (ContextCompat.checkSelfPermission( - this, - Manifest.permission.READ_CONTACTS - ) != PackageManager.PERMISSION_GRANTED - ) { - ActivityCompat.requestPermissions( - this, - arrayOf(Manifest.permission.READ_CONTACTS), - 1 - ) - return false - } - return true - } catch(_: Exception) { - return false - } - } private suspend fun updateContacts(filterString: String) { val contacts = getContacts(filterString) @@ -923,6 +898,9 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh @SuppressLint("NotifyDataSetChanged") override fun onResume() { super.onResume() + if (!permissionUtils.hasContactsPermission(this@MainActivity, Manifest.permission.READ_CONTACTS)) { + sharedPreferenceManager.setContactsEnabled(false) + } if (returnAllowed) { backToHome(0) } diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/AppMenuSettingsFragment.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/AppMenuSettingsFragment.kt index e76ca66..412815e 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/AppMenuSettingsFragment.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/AppMenuSettingsFragment.kt @@ -1,16 +1,40 @@ package eu.ottop.yamlauncher.settings +import android.Manifest +import android.content.pm.PackageManager import android.os.Bundle +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference import eu.ottop.yamlauncher.R +import eu.ottop.yamlauncher.utils.AppUtils +import eu.ottop.yamlauncher.utils.PermissionUtils class AppMenuSettingsFragment : PreferenceFragmentCompat(), TitleProvider { + private val permissionUtils = PermissionUtils() + private var contactPref: SwitchPreference? = null override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.app_menu_preferences, rootKey) + contactPref = findPreference("contactsEnabled") + contactPref?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + + if (newValue as Boolean && !permissionUtils.hasContactsPermission(requireContext(), Manifest.permission.READ_CONTACTS)) { + (requireActivity() as SettingsActivity).requestContactsPermission() + return@OnPreferenceChangeListener false + } else { + return@OnPreferenceChangeListener true + } + } } override fun getTitle(): String { return "App Menu Settings" } + + fun setContactPreference(isEnabled: Boolean) { + contactPref?.isChecked = isEnabled + } } \ No newline at end of file diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsActivity.kt index 0dd9d4a..2766cf2 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsActivity.kt @@ -1,19 +1,22 @@ package eu.ottop.yamlauncher.settings +import android.Manifest import android.app.Activity import android.content.Intent import android.content.SharedPreferences +import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager import eu.ottop.yamlauncher.R import eu.ottop.yamlauncher.databinding.ActivitySettingsBinding import org.json.JSONObject -import java.io.IOException class SettingsActivity : AppCompatActivity() { @@ -179,4 +182,31 @@ class SettingsActivity : AppCompatActivity() { } } + fun requestContactsPermission() { + try { + ActivityCompat.requestPermissions( + this, + arrayOf(Manifest.permission.READ_CONTACTS), + 1 + ) + } catch(_: Exception) {} + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + val fragment = supportFragmentManager.findFragmentById(R.id.settingsLayout) as AppMenuSettingsFragment + if (requestCode == 1) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + fragment.setContactPreference(true) + } else { + Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show() + fragment.setContactPreference(false) + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsFragment.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsFragment.kt index 6cde41c..eada624 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsFragment.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/SettingsFragment.kt @@ -6,6 +6,7 @@ import android.provider.Settings import android.widget.Toast import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference import eu.ottop.yamlauncher.R import eu.ottop.yamlauncher.utils.UIUtils diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt index fe6e924..0d479d2 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt @@ -208,6 +208,12 @@ class SharedPreferenceManager (private val context: Context) { return preferences.getBoolean("contactsEnabled", false) } + fun setContactsEnabled(isEnabled: Boolean) { + val editor = preferences.edit() + editor.putBoolean("contactsEnabled", isEnabled) + editor.apply() + } + // Hidden Apps fun setAppHidden(packageName: String, profile: Int, hidden: Boolean) { val editor = preferences.edit() diff --git a/app/src/main/java/eu/ottop/yamlauncher/utils/AppUtils.kt b/app/src/main/java/eu/ottop/yamlauncher/utils/AppUtils.kt index ba8e5a1..2d4f2ab 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/utils/AppUtils.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/utils/AppUtils.kt @@ -1,11 +1,14 @@ package eu.ottop.yamlauncher.utils +import android.Manifest import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.LauncherActivityInfo import android.content.pm.LauncherApps +import android.content.pm.PackageManager import android.os.UserHandle import android.widget.Toast +import androidx.core.content.ContextCompat import eu.ottop.yamlauncher.settings.SharedPreferenceManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/app/src/main/java/eu/ottop/yamlauncher/utils/PermissionUtils.kt b/app/src/main/java/eu/ottop/yamlauncher/utils/PermissionUtils.kt new file mode 100644 index 0000000..87d6e28 --- /dev/null +++ b/app/src/main/java/eu/ottop/yamlauncher/utils/PermissionUtils.kt @@ -0,0 +1,15 @@ +package eu.ottop.yamlauncher.utils + +import android.content.Context +import android.content.pm.PackageManager +import androidx.core.content.ContextCompat + +class PermissionUtils { + + fun hasContactsPermission(context: Context, permission: String): Boolean { + return ContextCompat.checkSelfPermission( + context, + permission + ) == PackageManager.PERMISSION_GRANTED + } +} \ No newline at end of file