From 62f8cc679afd48683ef9c9fc6e178c0f3044a31c Mon Sep 17 00:00:00 2001 From: ottoptj Date: Sat, 7 Sep 2024 10:59:58 +0300 Subject: [PATCH] Contacts searching. Broken. --- app/src/main/AndroidManifest.xml | 1 + .../eu/ottop/yamlauncher/AppMenuAdapter.kt | 2 +- .../eu/ottop/yamlauncher/ContactsAdapter.kt | 77 +++++++ .../java/eu/ottop/yamlauncher/MainActivity.kt | 213 ++++++++++++++---- .../settings/SharedPreferenceManager.kt | 4 + .../eu/ottop/yamlauncher/utils/UIUtils.kt | 27 ++- app/src/main/res/drawable/apps_24px.xml | 10 + app/src/main/res/drawable/close_24px.xml | 10 + app/src/main/res/drawable/contacts_24px.xml | 10 + app/src/main/res/drawable/delete_24px.xml | 10 + app/src/main/res/drawable/edit_24px.xml | 10 + app/src/main/res/drawable/info_24px.xml | 10 + app/src/main/res/drawable/search_24px.xml | 9 + .../main/res/drawable/visibility_off_24px.xml | 10 + app/src/main/res/layout/activity_main.xml | 96 ++++++-- app/src/main/res/layout/app_item_layout.xml | 3 +- app/src/main/res/xml/app_menu_preferences.xml | 6 + 17 files changed, 443 insertions(+), 65 deletions(-) create mode 100644 app/src/main/java/eu/ottop/yamlauncher/ContactsAdapter.kt create mode 100644 app/src/main/res/drawable/apps_24px.xml create mode 100644 app/src/main/res/drawable/close_24px.xml create mode 100644 app/src/main/res/drawable/contacts_24px.xml create mode 100644 app/src/main/res/drawable/delete_24px.xml create mode 100644 app/src/main/res/drawable/edit_24px.xml create mode 100644 app/src/main/res/drawable/info_24px.xml create mode 100644 app/src/main/res/drawable/search_24px.xml create mode 100644 app/src/main/res/drawable/visibility_off_24px.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3eacae3..b9ce09f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + diff --git a/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt b/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt index 5121eb2..e82c455 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt @@ -136,7 +136,7 @@ class AppMenuAdapter( uiUtils.setItemSpacing(holder.textView) - uiUtils.setTextFont(holder.textView) + uiUtils.setTextFont(holder.listItem) holder.textView.setTextColor(sharedPreferenceManager.getTextColor()) // Update the application information (allows updating apps to work) diff --git a/app/src/main/java/eu/ottop/yamlauncher/ContactsAdapter.kt b/app/src/main/java/eu/ottop/yamlauncher/ContactsAdapter.kt new file mode 100644 index 0000000..639ca2a --- /dev/null +++ b/app/src/main/java/eu/ottop/yamlauncher/ContactsAdapter.kt @@ -0,0 +1,77 @@ +package eu.ottop.yamlauncher + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.TextView +import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.RecyclerView +import eu.ottop.yamlauncher.settings.SharedPreferenceManager +import eu.ottop.yamlauncher.utils.UIUtils + +class ContactsAdapter( + private val context: Context, + private var contacts: MutableList>, + private val contactClickListener: OnContactClickListener +) : + RecyclerView.Adapter() { + + private val uiUtils = UIUtils(context) + private val sharedPreferenceManager = SharedPreferenceManager(context) + + interface OnContactClickListener { + fun onContactClick(contactId: Int) + } + + inner class AppViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val listItem: FrameLayout = itemView.findViewById(R.id.listItem) + val textView: TextView = listItem.findViewById(R.id.appName) + + init { + textView.setOnClickListener { + val position = bindingAdapterPosition + val contact = contacts[position] + contactClickListener.onContactClick(contact.second) + + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.app_item_layout, parent, false) + return AppViewHolder(view) + } + + override fun onBindViewHolder(holder: AppViewHolder, position: Int) { + val contact = contacts[position] + holder.textView.setCompoundDrawablesWithIntrinsicBounds( + ResourcesCompat.getDrawable(context.resources, R.drawable.ic_empty, null),null, ResourcesCompat.getDrawable(context.resources, R.drawable.ic_empty, null),null) + + uiUtils.setAppAlignment(holder.textView) + + uiUtils.setAppSize(holder.textView) + + uiUtils.setItemSpacing(holder.textView) + + uiUtils.setTextFont(holder.listItem) + holder.textView.setTextColor(sharedPreferenceManager.getTextColor()) + + holder.textView.text = contact.first + + holder.textView.visibility = View.VISIBLE + } + + override fun getItemCount(): Int { + return contacts.size + } + + @SuppressLint("NotifyDataSetChanged") + fun updateContacts(newContacts: List>) { + contacts = newContacts.toMutableList() + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt index a9a9fd4..807a079 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt @@ -1,33 +1,44 @@ package eu.ottop.yamlauncher +import android.Manifest import android.annotation.SuppressLint +import android.content.ContentResolver import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.content.pm.LauncherActivityInfo import android.content.pm.LauncherApps +import android.content.pm.PackageManager +import android.database.Cursor import android.graphics.BlendMode import android.graphics.BlendModeColorFilter +import android.net.Uri import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper import android.os.UserHandle import android.provider.AlarmClock +import android.provider.ContactsContract import android.text.Editable import android.text.TextWatcher import android.view.GestureDetector import android.view.MotionEvent import android.view.View import android.view.inputmethod.InputMethodManager +import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextClock import android.widget.TextView import android.widget.Toast +import android.widget.ViewSwitcher import androidx.activity.OnBackPressedCallback import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.database.getStringOrNull import androidx.core.view.ViewCompat import androidx.core.view.marginLeft import androidx.lifecycle.Lifecycle @@ -49,6 +60,7 @@ import eu.ottop.yamlauncher.utils.GestureUtils import eu.ottop.yamlauncher.utils.StringUtils import eu.ottop.yamlauncher.utils.UIUtils import eu.ottop.yamlauncher.utils.WeatherSystem +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -57,7 +69,7 @@ import java.lang.reflect.Method import kotlin.math.abs -class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, AppMenuAdapter.OnItemClickListener, AppMenuAdapter.OnShortcutListener, AppMenuAdapter.OnItemLongClickListener { +class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, AppMenuAdapter.OnItemClickListener, AppMenuAdapter.OnShortcutListener, AppMenuAdapter.OnItemLongClickListener, ContactsAdapter.OnContactClickListener { private lateinit var weatherSystem: WeatherSystem private lateinit var appUtils: AppUtils @@ -66,6 +78,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private lateinit var gestureUtils: GestureUtils private val appMenuLinearLayoutManager = AppMenuLinearLayoutManager(this@MainActivity) + private val contactMenuLinearLayoutManager = AppMenuLinearLayoutManager(this@MainActivity) private val appMenuEdgeFactory = AppMenuEdgeFactory(this@MainActivity) private lateinit var sharedPreferenceManager: SharedPreferenceManager @@ -77,9 +90,13 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private lateinit var dateText: TextClock private var dateElements = mutableListOf() - private lateinit var recyclerView: RecyclerView + private lateinit var menuView: ViewSwitcher + private lateinit var appRecycler: RecyclerView + private lateinit var contactRecycler: RecyclerView + private lateinit var searchSwitcher: ImageView private lateinit var searchView: TextInputEditText - private var adapter: AppMenuAdapter? = null + private var appAdapter: AppMenuAdapter? = null + private var contactAdapter: ContactsAdapter? = null private var batteryReceiver: BatteryReceiver? = null private lateinit var binding: ActivityMainBinding @@ -105,6 +122,8 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh var returnAllowed = true + private val handler = Handler(Looper.getMainLooper()) + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) @@ -154,15 +173,19 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh gestureDetector = GestureDetector(this, GestureListener()) shortcutGestureDetector = GestureDetector(this, TextGestureListener()) - clock = findViewById(R.id.textClock) + clock = binding.textClock clockMargin = clock.marginLeft - dateText = findViewById(R.id.textDate) + dateText = binding.textDate dateElements = mutableListOf(dateText.format12Hour.toString(), dateText.format24Hour.toString(), "", "") - searchView = findViewById(R.id.searchView) + menuView = binding.menuView + + searchSwitcher = binding.searchSwitcher + + searchView = binding.searchView preferences = PreferenceManager.getDefaultSharedPreferences(this) } @@ -183,8 +206,6 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh else { textView.visibility = View.VISIBLE - - val savedView = sharedPreferenceManager.getShortcut(textView) // Set the non-work profile drawable by default @@ -217,7 +238,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setMenuTitleAlignment(binding.menuTitle) binding.menuTitle.visibility = View.VISIBLE - adapter?.shortcutTextView = textView + appAdapter?.shortcutTextView = textView toAppMenu() true } @@ -236,7 +257,8 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setMenuTitleAlignment(binding.menuTitle) binding.menuTitle.visibility = View.VISIBLE - adapter?.shortcutTextView = textView + appAdapter?.shortcutTextView = textView + searchSwitcher.visibility = View.GONE toAppMenu() return@setOnLongClickListener true @@ -246,11 +268,12 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private fun toAppMenu() { try { // The menu opens from the top - recyclerView.scrollToPosition(0) - } - catch (_: UninitializedPropertyAccessException) { - + appRecycler.scrollToPosition(0) + contactRecycler.scrollToPosition(0) + menuView.displayedChild = 0 + searchSwitcher.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.contacts_24px, null)) } + catch (_: UninitializedPropertyAccessException) {} animations.showApps(binding.homeView, binding.appView) animations.backgroundIn(this@MainActivity) if (sharedPreferenceManager.isAutoKeyboardEnabled()) { @@ -293,7 +316,6 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private fun setPreferences() { uiUtils.setBackground(window) - uiUtils.setTextFont(binding.homeView) uiUtils.setFont(searchView) uiUtils.setFont(binding.menuTitle) @@ -302,9 +324,11 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setMenuItemColors(binding.menuTitle, "A9") + uiUtils.setImageColor(searchSwitcher) + uiUtils.setClockVisibility(clock) uiUtils.setDateVisibility(dateText) - uiUtils.setSearchVisibility(searchView, binding.searchReplacement) + uiUtils.setSearchVisibility(searchView, binding.searchLayout, binding.searchReplacement) uiUtils.setClockAlignment(clock, dateText) uiUtils.setSearchAlignment(searchView) @@ -317,11 +341,10 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setShortcutsSpacing(binding.homeView) // This didn't work and somehow delaying it by 0 makes it work - val handler = Handler(Looper.getMainLooper()) handler.postDelayed({ uiUtils.setStatusBar(window) uiUtils.setMenuItemColors(searchView) - }, 0) + }, 100) clockApp = gestureUtils.getSwipeInfo(launcherApps, "clock") dateApp = gestureUtils.getSwipeInfo(launcherApps, "date") @@ -420,8 +443,9 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh } private fun openAppMenu() { - adapter?.shortcutTextView = null + appAdapter?.shortcutTextView = null binding.menuTitle.visibility = View.GONE + uiUtils.setContactsVisibility(searchSwitcher, binding.searchLayout, binding.searchReplacement) toAppMenu() } @@ -437,6 +461,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setTextColors(binding.homeView) uiUtils.setMenuItemColors(searchView) uiUtils.setMenuItemColors(binding.menuTitle, "A9") + uiUtils.setImageColor(searchSwitcher) } "textFont" -> { @@ -460,7 +485,14 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh } "searchEnabled" -> { - uiUtils.setSearchVisibility(searchView, binding.searchReplacement) + uiUtils.setSearchVisibility(searchView, binding.searchLayout, binding.searchReplacement) + } + + "contactsEnabled" -> { + if (sharedPreferenceManager.areContactsEnabled()) { + checkContactsPermission() + } + uiUtils.setContactsVisibility(searchSwitcher, binding.searchLayout, binding.searchReplacement) } "clockAlignment" -> { @@ -569,7 +601,6 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh // Delay app menu changes so that the user doesn't see them - val handler = Handler(Looper.getMainLooper()) handler.postDelayed({ try { searchView.setText(R.string.empty) @@ -583,8 +614,6 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh handler.postDelayed({ lifecycleScope.launch { refreshAppMenu() - - }}, animSpeed + 50) } @@ -627,7 +656,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh private suspend fun updateMenu(updatedApps: List>) { withContext(Dispatchers.Main) { - adapter?.updateApps(updatedApps) + appAdapter?.updateApps(updatedApps) } } @@ -660,39 +689,120 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh installedApps = appUtils.getInstalledApps() val newApps = installedApps.toMutableList() - setupRecyclerView(newApps) + setupAppRecycler(newApps) setupSearch() + if (sharedPreferenceManager.areContactsEnabled()) { + setupContactRecycler() + } } } - private suspend fun setupRecyclerView(newApps: MutableList>) { - adapter = AppMenuAdapter(this@MainActivity, binding, newApps, this@MainActivity, this@MainActivity, this@MainActivity, launcherApps) + private suspend fun setupAppRecycler(newApps: MutableList>) { + appAdapter = AppMenuAdapter(this@MainActivity, binding, newApps, this@MainActivity, this@MainActivity, this@MainActivity, launcherApps) appMenuLinearLayoutManager.stackFromEnd = true - recyclerView = findViewById(R.id.recyclerView) + appRecycler = binding.appRecycler withContext(Dispatchers.Main) { - recyclerView.layoutManager = appMenuLinearLayoutManager - recyclerView.edgeEffectFactory = appMenuEdgeFactory - recyclerView.adapter = adapter + appRecycler.layoutManager = appMenuLinearLayoutManager + appRecycler.edgeEffectFactory = appMenuEdgeFactory + appRecycler.adapter = appAdapter } - setupRecyclerListener() + setupRecyclerListener(appRecycler, appMenuLinearLayoutManager) } // Inform the layout manager of scroll states to calculate whether the menu is on the top - private fun setupRecyclerListener() { - recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener() { + private fun setupRecyclerListener(recycler:RecyclerView, layoutManager: AppMenuLinearLayoutManager) { + recycler.addOnScrollListener(object: RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { - appMenuLinearLayoutManager.setScrollInfo() + layoutManager.setScrollInfo() } } }) } + private suspend fun setupContactRecycler() { + contactAdapter = ContactsAdapter(this, mutableListOf(), this) + contactRecycler = binding.contactRecycler + withContext(Dispatchers.Main) { + contactRecycler.layoutManager = contactMenuLinearLayoutManager + contactRecycler.edgeEffectFactory = appMenuEdgeFactory + contactRecycler.adapter = contactAdapter + } + setupRecyclerListener(contactRecycler, contactMenuLinearLayoutManager) + } + + private fun getContacts(filterString: String): MutableList> { + if (!checkContactsPermission()) { + return mutableListOf() + } + + val contacts = mutableListOf>() + + val contentResolver: ContentResolver = contentResolver + + val projection = arrayOf( + ContactsContract.Contacts._ID, + ContactsContract.Contacts.DISPLAY_NAME + ) + + val selection = "${ContactsContract.Contacts.DISPLAY_NAME} LIKE ?" + val selectionArgs = arrayOf("%$filterString%") + + val cursor: Cursor? = contentResolver.query( + ContactsContract.Contacts.CONTENT_URI, + projection, + selection, + selectionArgs, + "${ContactsContract.Contacts.DISPLAY_NAME} ASC" + ) + + cursor?.use { + val nameIndex = it.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME) + val idIndex = it.getColumnIndex(ContactsContract.Contacts._ID) + while (it.moveToNext()) { + val name = it.getStringOrNull(nameIndex) + val id = it.getStringOrNull(idIndex)?.toInt() + if (name != null && id != null) { + contacts.add(Pair(name, id)) + } + } + } + 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) + withContext(Dispatchers.Main) { + contactAdapter?.updateContacts(contacts) + } + } + private suspend fun setupSearch() { binding.appView.addOnLayoutChangeListener { _, _, top, _, bottom, _, oldTop, _, oldBottom -> @@ -718,6 +828,19 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh } } }) + + searchSwitcher.setOnClickListener { + menuView.showNext() + when (menuView.displayedChild) { + 0 -> searchSwitcher.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.contacts_24px, null)) + 1 -> { + lifecycleScope.launch(Dispatchers.Default) { + updateContacts("") + } + searchSwitcher.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.apps_24px, null))} + } + } + } private suspend fun filterItems(query: String?) { @@ -727,6 +850,9 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh val updatedApps = appUtils.getInstalledApps() getFilteredApps(cleanQuery, newFilteredApps, updatedApps) + if (sharedPreferenceManager.areContactsEnabled() && cleanQuery != null) { + updateContacts(cleanQuery) + } } private suspend fun getFilteredApps(cleanQuery: String?, newFilteredApps: MutableList>, updatedApps: List>) { @@ -767,12 +893,12 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh fun disableAppMenuScroll() { appMenuLinearLayoutManager.setScrollEnabled(false) - recyclerView.layoutManager = appMenuLinearLayoutManager + appRecycler.layoutManager = appMenuLinearLayoutManager } fun enableAppMenuScroll() { appMenuLinearLayoutManager.setScrollEnabled(true) - recyclerView.layoutManager = appMenuLinearLayoutManager + appRecycler.layoutManager = appMenuLinearLayoutManager } // On home key or swipe, return to home screen @@ -801,7 +927,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh backToHome(0) } returnAllowed = true - adapter?.notifyDataSetChanged() + appAdapter?.notifyDataSetChanged() } override fun onItemClick(appInfo: LauncherActivityInfo, userHandle: UserHandle) { @@ -932,4 +1058,15 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh } } + + override fun onContactClick(contactId: Int) { + val contactUri: Uri = Uri.withAppendedPath( + ContactsContract.Contacts.CONTENT_URI, + contactId.toString() + ) + + val intent = Intent(Intent.ACTION_VIEW, contactUri) + startActivity(intent) + returnAllowed = false + } } \ No newline at end of file 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 b303878..fe6e924 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt @@ -204,6 +204,10 @@ class SharedPreferenceManager (private val context: Context) { return preferences.getBoolean("autoKeyboard", false) } + fun areContactsEnabled(): Boolean { + return preferences.getBoolean("contactsEnabled", false) + } + // 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/UIUtils.kt b/app/src/main/java/eu/ottop/yamlauncher/utils/UIUtils.kt index bf85eb4..6c81912 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/utils/UIUtils.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/utils/UIUtils.kt @@ -13,6 +13,7 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.Window import android.view.WindowInsets import android.view.WindowInsetsController +import android.widget.ImageView import android.widget.LinearLayout import android.widget.Space import android.widget.TextClock @@ -36,6 +37,10 @@ class UIUtils(private val context: Context) { ) } + fun setImageColor(view: ImageView) { + view.setColorFilter(sharedPreferenceManager.getTextColor()) + } + fun setTextColors(view: View) { val color = sharedPreferenceManager.getTextColor() when { @@ -148,13 +153,31 @@ class UIUtils(private val context: Context) { } } - fun setSearchVisibility(searchView: TextInputEditText, replacementView: View) { + fun setSearchVisibility(searchView: View, searchLayout: View, replacementView: View) { + setSearchLayoutVisibility(searchLayout, replacementView) if (sharedPreferenceManager.isSearchEnabled()) { searchView.visibility = View.VISIBLE - replacementView.visibility = View.GONE } else { searchView.visibility = View.GONE + } + } + + fun setContactsVisibility(contactsView: View, searchLayout: View, replacementView: View) { + setSearchLayoutVisibility(searchLayout, replacementView) + if (sharedPreferenceManager.areContactsEnabled()) { + contactsView.visibility = View.VISIBLE + } else { + contactsView.visibility = View.GONE + } + } + + private fun setSearchLayoutVisibility(searchLayout: View, replacementView: View) { + if (!sharedPreferenceManager.isSearchEnabled() && !sharedPreferenceManager.areContactsEnabled()) { + searchLayout.visibility = View.GONE replacementView.visibility = View.VISIBLE + } else { + replacementView.visibility = View.GONE + searchLayout.visibility = View.VISIBLE } } diff --git a/app/src/main/res/drawable/apps_24px.xml b/app/src/main/res/drawable/apps_24px.xml new file mode 100644 index 0000000..2004718 --- /dev/null +++ b/app/src/main/res/drawable/apps_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/close_24px.xml b/app/src/main/res/drawable/close_24px.xml new file mode 100644 index 0000000..182489c --- /dev/null +++ b/app/src/main/res/drawable/close_24px.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/contacts_24px.xml b/app/src/main/res/drawable/contacts_24px.xml new file mode 100644 index 0000000..2eb3607 --- /dev/null +++ b/app/src/main/res/drawable/contacts_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/delete_24px.xml b/app/src/main/res/drawable/delete_24px.xml new file mode 100644 index 0000000..d724c2e --- /dev/null +++ b/app/src/main/res/drawable/delete_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/edit_24px.xml b/app/src/main/res/drawable/edit_24px.xml new file mode 100644 index 0000000..b253108 --- /dev/null +++ b/app/src/main/res/drawable/edit_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/info_24px.xml b/app/src/main/res/drawable/info_24px.xml new file mode 100644 index 0000000..3186ebf --- /dev/null +++ b/app/src/main/res/drawable/info_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/search_24px.xml b/app/src/main/res/drawable/search_24px.xml new file mode 100644 index 0000000..3e235a7 --- /dev/null +++ b/app/src/main/res/drawable/search_24px.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/visibility_off_24px.xml b/app/src/main/res/drawable/visibility_off_24px.xml new file mode 100644 index 0000000..6fa698a --- /dev/null +++ b/app/src/main/res/drawable/visibility_off_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5b9a518..061023e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -36,38 +36,90 @@ android:textColor="#C1F3F3F3" android:textSize="36sp" /> - + android:layout_weight="1.1" + android:clipToPadding="false"> - + - + + + + + + + + + android:orientation="horizontal" + app:layout_constraintEnd_toStartOf="@+id/searchSwitcher" + app:layout_constraintStart_toStartOf="@+id/searchSwitcher"> + + + + + + + android:visibility="visible" /> +