mirror of
https://github.com/He4eT/yamf_launcher.git
synced 2026-05-04 17:37:25 +00:00
Added an optional web search button
This commit is contained in:
parent
5d913b120c
commit
5c21bdcf26
10 changed files with 103 additions and 9 deletions
|
|
@ -2,6 +2,7 @@ package eu.ottop.yamlauncher
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.SearchManager
|
||||||
import android.content.ActivityNotFoundException
|
import android.content.ActivityNotFoundException
|
||||||
import android.content.ContentResolver
|
import android.content.ContentResolver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
|
@ -95,6 +96,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
private lateinit var appRecycler: RecyclerView
|
private lateinit var appRecycler: RecyclerView
|
||||||
private lateinit var contactRecycler: RecyclerView
|
private lateinit var contactRecycler: RecyclerView
|
||||||
private lateinit var searchSwitcher: ImageView
|
private lateinit var searchSwitcher: ImageView
|
||||||
|
private lateinit var internetSearch: ImageView
|
||||||
private lateinit var searchView: TextInputEditText
|
private lateinit var searchView: TextInputEditText
|
||||||
private var appAdapter: AppMenuAdapter? = null
|
private var appAdapter: AppMenuAdapter? = null
|
||||||
private var contactAdapter: ContactsAdapter? = null
|
private var contactAdapter: ContactsAdapter? = null
|
||||||
|
|
@ -191,6 +193,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
menuView = binding.menuView
|
menuView = binding.menuView
|
||||||
|
|
||||||
searchSwitcher = binding.searchSwitcher
|
searchSwitcher = binding.searchSwitcher
|
||||||
|
internetSearch = binding.internetSearch
|
||||||
|
|
||||||
preferences = PreferenceManager.getDefaultSharedPreferences(this)
|
preferences = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
}
|
}
|
||||||
|
|
@ -272,6 +275,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
appAdapter?.shortcutTextView = textView
|
appAdapter?.shortcutTextView = textView
|
||||||
contactAdapter?.shortcutIndex = index
|
contactAdapter?.shortcutIndex = index
|
||||||
contactAdapter?.shortcutTextView = textView
|
contactAdapter?.shortcutTextView = textView
|
||||||
|
internetSearch.visibility = View.GONE
|
||||||
toAppMenu()
|
toAppMenu()
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
@ -319,6 +323,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
|
|
||||||
private fun toAppMenu() {
|
private fun toAppMenu() {
|
||||||
uiUtils.setContactsVisibility(searchSwitcher, binding.searchLayout, binding.searchReplacement)
|
uiUtils.setContactsVisibility(searchSwitcher, binding.searchLayout, binding.searchReplacement)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// The menu opens from the top
|
// The menu opens from the top
|
||||||
appRecycler.scrollToPosition(0)
|
appRecycler.scrollToPosition(0)
|
||||||
|
|
@ -520,6 +525,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
appAdapter?.shortcutTextView = null
|
appAdapter?.shortcutTextView = null
|
||||||
contactAdapter?.shortcutTextView = null
|
contactAdapter?.shortcutTextView = null
|
||||||
menuTitle.visibility = View.GONE
|
menuTitle.visibility = View.GONE
|
||||||
|
uiUtils.setWebSearchVisibility(internetSearch)
|
||||||
toAppMenu()
|
toAppMenu()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -537,6 +543,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
uiUtils.setMenuItemColors(searchView)
|
uiUtils.setMenuItemColors(searchView)
|
||||||
uiUtils.setMenuItemColors(menuTitle, "A9")
|
uiUtils.setMenuItemColors(menuTitle, "A9")
|
||||||
uiUtils.setImageColor(searchSwitcher)
|
uiUtils.setImageColor(searchSwitcher)
|
||||||
|
uiUtils.setImageColor(internetSearch)
|
||||||
}
|
}
|
||||||
|
|
||||||
"textFont" -> {
|
"textFont" -> {
|
||||||
|
|
@ -561,6 +568,7 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
|
|
||||||
"searchEnabled" -> {
|
"searchEnabled" -> {
|
||||||
uiUtils.setSearchVisibility(searchView, binding.searchLayout, binding.searchReplacement)
|
uiUtils.setSearchVisibility(searchView, binding.searchLayout, binding.searchReplacement)
|
||||||
|
uiUtils.setWebSearchVisibility(internetSearch)
|
||||||
}
|
}
|
||||||
|
|
||||||
"contactsEnabled" -> {
|
"contactsEnabled" -> {
|
||||||
|
|
@ -571,6 +579,10 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"webSearchEnabled" -> {
|
||||||
|
uiUtils.setWebSearchVisibility(internetSearch)
|
||||||
|
}
|
||||||
|
|
||||||
"clockAlignment" -> {
|
"clockAlignment" -> {
|
||||||
uiUtils.setClockAlignment(clock, dateText)
|
uiUtils.setClockAlignment(clock, dateText)
|
||||||
}
|
}
|
||||||
|
|
@ -790,8 +802,24 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
||||||
if (sharedPreferenceManager.areContactsEnabled()) {
|
if (sharedPreferenceManager.areContactsEnabled()) {
|
||||||
setupContactRecycler()
|
setupContactRecycler()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
setupInternetSearch()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupInternetSearch() {
|
||||||
|
uiUtils.setImageColor(internetSearch)
|
||||||
|
internetSearch.setOnClickListener {
|
||||||
|
val intent = Intent(Intent.ACTION_WEB_SEARCH).apply {
|
||||||
|
putExtra(SearchManager.QUERY, searchView.text.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intent.resolveActivity(packageManager) != null) {
|
||||||
|
startActivity(intent)
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this@MainActivity, "No browser app found.", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun setupAppRecycler(newApps: MutableList<Triple<LauncherActivityInfo, UserHandle, Int>>) {
|
private suspend fun setupAppRecycler(newApps: MutableList<Triple<LauncherActivityInfo, UserHandle, Int>>) {
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,15 @@ import eu.ottop.yamlauncher.utils.PermissionUtils
|
||||||
class AppMenuSettingsFragment : PreferenceFragmentCompat(), TitleProvider {
|
class AppMenuSettingsFragment : PreferenceFragmentCompat(), TitleProvider {
|
||||||
private val permissionUtils = PermissionUtils()
|
private val permissionUtils = PermissionUtils()
|
||||||
private var contactPref: SwitchPreference? = null
|
private var contactPref: SwitchPreference? = null
|
||||||
|
private var webSearchPref: SwitchPreference? = null
|
||||||
|
private var autoLaunchPref: SwitchPreference? = null
|
||||||
|
|
||||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
setPreferencesFromResource(R.xml.app_menu_preferences, rootKey)
|
setPreferencesFromResource(R.xml.app_menu_preferences, rootKey)
|
||||||
contactPref = findPreference("contactsEnabled")
|
contactPref = findPreference("contactsEnabled")
|
||||||
|
webSearchPref = findPreference("webSearchEnabled")
|
||||||
|
autoLaunchPref = findPreference("autoLaunch")
|
||||||
|
|
||||||
contactPref?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
contactPref?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
|
||||||
if (newValue as Boolean && !permissionUtils.hasPermission(requireContext(), Manifest.permission.READ_CONTACTS)) {
|
if (newValue as Boolean && !permissionUtils.hasPermission(requireContext(), Manifest.permission.READ_CONTACTS)) {
|
||||||
|
|
@ -24,6 +29,19 @@ class AppMenuSettingsFragment : PreferenceFragmentCompat(), TitleProvider {
|
||||||
return@OnPreferenceChangeListener true
|
return@OnPreferenceChangeListener true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (webSearchPref != null && autoLaunchPref != null) {
|
||||||
|
webSearchPref?.isEnabled = (autoLaunchPref?.isChecked == false)
|
||||||
|
autoLaunchPref?.isEnabled = (webSearchPref?.isChecked == false)
|
||||||
|
webSearchPref?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
autoLaunchPref?.isEnabled = !(newValue as Boolean)
|
||||||
|
return@OnPreferenceChangeListener true
|
||||||
|
}
|
||||||
|
autoLaunchPref?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
webSearchPref?.isEnabled = !(newValue as Boolean)
|
||||||
|
return@OnPreferenceChangeListener true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getTitle(): String {
|
override fun getTitle(): String {
|
||||||
|
|
|
||||||
|
|
@ -240,6 +240,10 @@ class SharedPreferenceManager (private val context: Context) {
|
||||||
editor.apply()
|
editor.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isWebSearchEnabled(): Boolean {
|
||||||
|
return preferences.getBoolean("webSearchEnabled", false) && isSearchEnabled()
|
||||||
|
}
|
||||||
|
|
||||||
// Hidden Apps
|
// Hidden Apps
|
||||||
fun setAppHidden(packageName: String, profile: Int, hidden: Boolean) {
|
fun setAppHidden(packageName: String, profile: Int, hidden: Boolean) {
|
||||||
val editor = preferences.edit()
|
val editor = preferences.edit()
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,8 @@ class UIUtils(private val context: Context) {
|
||||||
|
|
||||||
view.compoundDrawables[0]?.mutate()?.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP)
|
view.compoundDrawables[0]?.mutate()?.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP)
|
||||||
view.compoundDrawables[0]?.alpha = "A9".toInt(16)
|
view.compoundDrawables[0]?.alpha = "A9".toInt(16)
|
||||||
|
view.compoundDrawables[2]?.mutate()?.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP)
|
||||||
|
view.compoundDrawables[2]?.alpha = "A9".toInt(16)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setTextFont(view: View) {
|
fun setTextFont(view: View) {
|
||||||
|
|
@ -196,6 +198,14 @@ class UIUtils(private val context: Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun setWebSearchVisibility(webSearchButton: View) {
|
||||||
|
if (sharedPreferenceManager.isWebSearchEnabled()) {
|
||||||
|
webSearchButton.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
webSearchButton.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun setSearchLayoutVisibility(searchLayout: View, replacementView: View) {
|
private fun setSearchLayoutVisibility(searchLayout: View, replacementView: View) {
|
||||||
if (!sharedPreferenceManager.isSearchEnabled() && !sharedPreferenceManager.areContactsEnabled()) {
|
if (!sharedPreferenceManager.isSearchEnabled() && !sharedPreferenceManager.areContactsEnabled()) {
|
||||||
searchLayout.visibility = View.GONE
|
searchLayout.visibility = View.GONE
|
||||||
|
|
|
||||||
11
app/src/main/res/drawable/travel_explore_24.xml
Normal file
11
app/src/main/res/drawable/travel_explore_24.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:width="24dp">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M19.3,16.9c0.4,-0.7 0.7,-1.5 0.7,-2.4c0,-2.5 -2,-4.5 -4.5,-4.5S11,12 11,14.5s2,4.5 4.5,4.5c0.9,0 1.7,-0.3 2.4,-0.7l3.2,3.2l1.4,-1.4L19.3,16.9zM15.5,17c-1.4,0 -2.5,-1.1 -2.5,-2.5s1.1,-2.5 2.5,-2.5s2.5,1.1 2.5,2.5S16.9,17 15.5,17zM12,20v2C6.48,22 2,17.52 2,12C2,6.48 6.48,2 12,2c4.84,0 8.87,3.44 9.8,8h-2.07c-0.64,-2.46 -2.4,-4.47 -4.73,-5.41V5c0,1.1 -0.9,2 -2,2h-2v2c0,0.55 -0.45,1 -1,1H8v2h2v3H9l-4.79,-4.79C4.08,10.79 4,11.38 4,12C4,16.41 7.59,20 12,20z"/>
|
||||||
|
|
||||||
|
</vector>
|
||||||
|
|
@ -25,13 +25,13 @@
|
||||||
android:id="@+id/menuTitle"
|
android:id="@+id/menuTitle"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:clickable="false"
|
||||||
|
android:gravity="start"
|
||||||
android:paddingLeft="40dp"
|
android:paddingLeft="40dp"
|
||||||
android:paddingTop="20dp"
|
android:paddingTop="20dp"
|
||||||
android:paddingRight="40dp"
|
android:paddingRight="40dp"
|
||||||
android:paddingBottom="20dp"
|
android:paddingBottom="20dp"
|
||||||
android:background="@android:color/transparent"
|
|
||||||
android:clickable="false"
|
|
||||||
android:gravity="start"
|
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textAppearance="@android:style/TextAppearance.DeviceDefault"
|
android:textAppearance="@android:style/TextAppearance.DeviceDefault"
|
||||||
android:textColor="#C1F3F3F3"
|
android:textColor="#C1F3F3F3"
|
||||||
|
|
@ -99,12 +99,27 @@
|
||||||
android:textColorHighlight="#5F33B5E5"
|
android:textColorHighlight="#5F33B5E5"
|
||||||
android:textSize="25sp"
|
android:textSize="25sp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/searchSwitcher"
|
app:layout_constraintEnd_toStartOf="@+id/internetSearch"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:layout_conversion_absoluteHeight="0dp"
|
tools:layout_conversion_absoluteHeight="0dp"
|
||||||
tools:layout_conversion_absoluteWidth="0dp" />
|
tools:layout_conversion_absoluteWidth="0dp" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/internetSearch"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:adjustViewBounds="true"
|
||||||
|
android:contentDescription="@string/switch_to_contacts"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/searchView"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/searchSwitcher"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/searchView"
|
||||||
|
app:srcCompat="@drawable/travel_explore_24"
|
||||||
|
tools:layout_conversion_absoluteHeight="0dp"
|
||||||
|
tools:layout_conversion_absoluteWidth="0dp" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/searchSwitcher"
|
android:id="@+id/searchSwitcher"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|
@ -113,10 +128,8 @@
|
||||||
android:contentDescription="@string/switch_to_contacts"
|
android:contentDescription="@string/switch_to_contacts"
|
||||||
android:padding="6dp"
|
android:padding="6dp"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
android:visibility="gone"
|
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/searchView"
|
app:layout_constraintBottom_toBottomOf="@+id/searchView"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@+id/searchView"
|
|
||||||
app:layout_constraintTop_toTopOf="@+id/searchView"
|
app:layout_constraintTop_toTopOf="@+id/searchView"
|
||||||
app:srcCompat="@drawable/apps_24px"
|
app:srcCompat="@drawable/apps_24px"
|
||||||
tools:layout_conversion_absoluteHeight="0dp"
|
tools:layout_conversion_absoluteHeight="0dp"
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,7 @@
|
||||||
<string name="app_spacing">Abstand zwischen Apps</string>
|
<string name="app_spacing">Abstand zwischen Apps</string>
|
||||||
<string name="contacts_menu">Kontaktmenü</string>
|
<string name="contacts_menu">Kontaktmenü</string>
|
||||||
<string name="permission_denied">Berechtigung verweigert</string>
|
<string name="permission_denied">Berechtigung verweigert</string>
|
||||||
|
<string name="internet_search">Web Search Button</string>
|
||||||
|
|
||||||
<string name="search_text">Suche</string>
|
<string name="search_text">Suche</string>
|
||||||
<string name="enable_search">Suche aktivieren</string>
|
<string name="enable_search">Suche aktivieren</string>
|
||||||
|
|
|
||||||
|
|
@ -99,9 +99,9 @@
|
||||||
<string name="number_of_shortcuts">Pikakuvakkeiden Määrä</string>
|
<string name="number_of_shortcuts">Pikakuvakkeiden Määrä</string>
|
||||||
<string name="horizontal_alignment">Pikakuvakkeiden Vaakasijainti</string>
|
<string name="horizontal_alignment">Pikakuvakkeiden Vaakasijainti</string>
|
||||||
<string name="vertical_alignment">Pikakuvakkeiden Pystysijainti</string>
|
<string name="vertical_alignment">Pikakuvakkeiden Pystysijainti</string>
|
||||||
<string name="shortcut_size">Pikakuvakkeiden koko</string>
|
<string name="shortcut_size">Pikakuvakkeiden Koko</string>
|
||||||
<string name="shortcut_spacing">Pikakuvakkeiden väli</string>
|
<string name="shortcut_spacing">Pikakuvakkeiden Väli</string>
|
||||||
<string name="lock_shortcuts">Lock Shortcuts</string>
|
<string name="lock_shortcuts">Lukitse Pikakuvakkeet</string>
|
||||||
|
|
||||||
<string name="gestures">Eleet</string>
|
<string name="gestures">Eleet</string>
|
||||||
<string name="swipe_left">Vasen Pyyhkäisy</string>
|
<string name="swipe_left">Vasen Pyyhkäisy</string>
|
||||||
|
|
@ -120,6 +120,7 @@
|
||||||
<string name="app_spacing">Sovelluksien Väli</string>
|
<string name="app_spacing">Sovelluksien Väli</string>
|
||||||
<string name="contacts_menu">Yhteystiedot</string>
|
<string name="contacts_menu">Yhteystiedot</string>
|
||||||
<string name="permission_denied">Tarvittavat Luvat Kielletty</string>
|
<string name="permission_denied">Tarvittavat Luvat Kielletty</string>
|
||||||
|
<string name="internet_search">Verkkohaku Nappi</string>
|
||||||
|
|
||||||
<string name="search_text">Hakupalkki</string>
|
<string name="search_text">Hakupalkki</string>
|
||||||
<string name="enable_search">Näytä Hakupalkki</string>
|
<string name="enable_search">Näytä Hakupalkki</string>
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,7 @@
|
||||||
<string name="app_spacing">App Spacing</string>
|
<string name="app_spacing">App Spacing</string>
|
||||||
<string name="contacts_menu">Contacts Menu</string>
|
<string name="contacts_menu">Contacts Menu</string>
|
||||||
<string name="permission_denied">Permission Denied</string>
|
<string name="permission_denied">Permission Denied</string>
|
||||||
|
<string name="internet_search">Web Search Button</string>
|
||||||
|
|
||||||
<string name="search_text">Search</string>
|
<string name="search_text">Search</string>
|
||||||
<string name="enable_search">Enable Search</string>
|
<string name="enable_search">Enable Search</string>
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,13 @@
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:title="@string/contacts_menu"
|
android:title="@string/contacts_menu"
|
||||||
app:key="contactsEnabled" />
|
app:key="contactsEnabled" />
|
||||||
|
<SwitchPreference
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:title="@string/internet_search"
|
||||||
|
app:dependency="searchEnabled"
|
||||||
|
app:key="webSearchEnabled" />
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue