diff --git a/app/src/main/java/de/mm20/launcher2/activity/SettingsActivity.kt b/app/src/main/java/de/mm20/launcher2/activity/SettingsActivity.kt index 001e9b72..6f349195 100644 --- a/app/src/main/java/de/mm20/launcher2/activity/SettingsActivity.kt +++ b/app/src/main/java/de/mm20/launcher2/activity/SettingsActivity.kt @@ -7,7 +7,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import de.mm20.launcher2.fragment.PreferencesMainFragment import de.mm20.launcher2.fragment.PreferencesServicesFragment -import de.mm20.launcher2.fragment.PreferencesWeatherFragment import de.mm20.launcher2.ui.legacy.activity.LauncherActivity import de.mm20.launcher2.ui.legacy.helper.ThemeHelper @@ -30,7 +29,6 @@ class SettingsActivity : AppCompatActivity() { private fun getStartFragment(): Fragment { return when (intent.extras?.getString(FRAGMENT, "")) { - FRAGMENT_WEATHER -> PreferencesWeatherFragment() FRAGMENT_SERVICES -> PreferencesServicesFragment() else -> PreferencesMainFragment() } diff --git a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesAboutFragment.kt b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesAboutFragment.kt deleted file mode 100644 index 7213dbbb..00000000 --- a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesAboutFragment.kt +++ /dev/null @@ -1,175 +0,0 @@ -package de.mm20.launcher2.fragment - -import android.annotation.SuppressLint -import android.content.Intent -import android.content.pm.PackageManager -import android.os.Bundle -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.FileProvider -import androidx.lifecycle.lifecycleScope -import androidx.preference.Preference -import androidx.preference.PreferenceCategory -import androidx.preference.PreferenceFragmentCompat -import com.afollestad.materialdialogs.MaterialDialog -import com.google.android.material.snackbar.Snackbar -import de.mm20.launcher2.R -import de.mm20.launcher2.crashreporter.CrashReporter -import de.mm20.launcher2.debug.DebugInformationDumper -import de.mm20.launcher2.ktx.tryStartActivity -import de.mm20.launcher2.licenses.AppLicense -import de.mm20.launcher2.licenses.OpenSourceLicenses -import kotlinx.coroutines.launch -import java.io.File - - -class PreferencesAboutFragment : PreferenceFragmentCompat() { - - private var easterEggCounter = 0 - - @SuppressLint("ResourceType") - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.preferences_about) - val versionPref = findPreference("version")!! - try { - val version = requireContext().packageManager.getPackageInfo( - requireActivity().application.packageName, - 0 - ).versionName - versionPref.summary = version - } catch (e: PackageManager.NameNotFoundException) { - //Should never happen - versionPref.summary = "Ich mag Bockwurst-Bananen" - } - - versionPref.setOnPreferenceClickListener { - if (easterEggCounter in arrayOf(3, 4, 7)) Toast.makeText( - context, when (easterEggCounter) { - 3 -> R.string.easter_egg_1 - 4 -> R.string.easter_egg_2 - 7 -> R.string.easter_egg_3 - else -> 0 - }, Toast.LENGTH_SHORT - ).show() - if (easterEggCounter == 8) { - easterEggCounter = 0 - requireFragmentManager().beginTransaction() - .setCustomAnimations( - R.anim.preference_fragment_child_enter, - R.anim.preference_fragment_parent_exit, - R.anim.preference_fragment_parent_enter, - R.anim.preference_fragment_child_exit - ) - .replace( - android.R.id.content, - PreferencesEasterEggFragment() - ) - .addToBackStack(null) - .commit() - } - easterEggCounter++ - false - } - - val licenses = findPreference("category_licenses") as PreferenceCategory - for (l in OpenSourceLicenses.sortedBy { it.name.lowercase() }) { - val preference = Preference(activity, null, 0, R.style.Preference_Material) - preference.title = l.name - preference.summary = l.description - preference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - parentFragmentManager.beginTransaction() - .setCustomAnimations( - R.anim.preference_fragment_child_enter, - R.anim.preference_fragment_parent_exit, - R.anim.preference_fragment_parent_enter, - R.anim.preference_fragment_child_exit - ) - .replace( - android.R.id.content, - PreferencesLicenseFragment(l) - ) - .addToBackStack(null) - .commit() - true - } - licenses.addPreference(preference) - } - findPreference("crash_reporter")?.setOnPreferenceClickListener { - startActivity(CrashReporter.getLaunchIntent()) - true - } - findPreference("export_debug")?.setOnPreferenceClickListener { - lifecycleScope.launch { - val path = DebugInformationDumper().dump(requireContext()) - Snackbar.make( - requireView(), - getString( - R.string.debug_export_information_file, - path - ), - Snackbar.LENGTH_LONG - ) - .setAction(R.string.menu_share) { - val context = requireContext() - context.tryStartActivity(Intent(Intent.ACTION_SEND).apply { - type = "text/plain" - putExtra( - Intent.EXTRA_STREAM, FileProvider.getUriForFile( - context, - context.applicationContext.packageName + ".fileprovider", - File(path) - ) - ) - }) - }.show() - } - true - } - findPreference("export_databases")?.setOnPreferenceClickListener { - MaterialDialog(requireContext()).show { - message(res = R.string.debug_export_databases_warning) - positiveButton(res = R.string.dialog_continue, click = { - lifecycleScope.launch { - val path = DebugInformationDumper().exportDatabases(requireContext()) - Toast.makeText( - activity, - getString( - R.string.debug_export_information_file, - path - ), - Toast.LENGTH_SHORT - ).show() - it.dismiss() - } - }) - negativeButton(res = android.R.string.cancel, click = { - it.cancel() - }) - } - - true - } - - findPreference("license")?.setOnPreferenceClickListener { - parentFragmentManager.beginTransaction() - .setCustomAnimations( - R.anim.preference_fragment_child_enter, - R.anim.preference_fragment_parent_exit, - R.anim.preference_fragment_parent_enter, - R.anim.preference_fragment_child_exit - ) - .replace( - android.R.id.content, - PreferencesLicenseFragment(AppLicense.get(requireContext())) - ) - .addToBackStack(null) - .commit() - true - } - } - - override fun onResume() { - super.onResume() - (activity as AppCompatActivity).supportActionBar?.setTitle(R.string.preference_screen_about) - } -} diff --git a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesBadgesFragment.kt b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesBadgesFragment.kt deleted file mode 100644 index 9b2ddb65..00000000 --- a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesBadgesFragment.kt +++ /dev/null @@ -1,39 +0,0 @@ -package de.mm20.launcher2.fragment - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import de.mm20.launcher2.R - -class PreferencesBadgesFragment : PreferenceFragmentCompat() { - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.preferences_badges) - findPreference("notification_badges")?.setOnPreferenceChangeListener { _, newValue -> - if (newValue as Boolean) { - } else { - } - true - } - findPreference("suspended_badges")?.setOnPreferenceChangeListener { _, newValue -> - if (newValue as Boolean) { - } else { - } - true - } - findPreference("cloud_badges")?.setOnPreferenceChangeListener { _, newValue -> - if (newValue as Boolean) { - } else { - } - true - } - } - - - override fun onResume() { - super.onResume() - (activity as AppCompatActivity).supportActionBar - ?.setTitle(R.string.preference_screen_badges) - } -} \ No newline at end of file diff --git a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesLicenseFragment.kt b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesLicenseFragment.kt deleted file mode 100644 index f9f914a7..00000000 --- a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesLicenseFragment.kt +++ /dev/null @@ -1,50 +0,0 @@ -package de.mm20.launcher2.fragment - -import android.annotation.SuppressLint -import android.net.Uri -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.browser.customtabs.CustomTabColorSchemeParams -import androidx.browser.customtabs.CustomTabsIntent -import androidx.fragment.app.Fragment -import com.bumptech.glide.Glide -import de.mm20.launcher2.R -import de.mm20.launcher2.licenses.OpenSourceLibrary - -class PreferencesLicenseFragment( - val library: OpenSourceLibrary -) : Fragment() { - - @SuppressLint("ResourceType") - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - val view = inflater.inflate(R.layout.fragment_license, null, false) - (activity as AppCompatActivity).supportActionBar?.title = library.name - val url = library.url - val website = view.findViewById(R.id.website) - website.setOnClickListener { - val intent = CustomTabsIntent.Builder() - .setDefaultColorSchemeParams(CustomTabColorSchemeParams - .Builder() - .setToolbarColor(-0x9f8275) - .build()) - .setShowTitle(true) - .build() - intent.launchUrl(activity as AppCompatActivity, Uri.parse(url)) - } - val description = view.findViewById(R.id.description) - description.text = library.description - val licenseTitle = view.findViewById(R.id.licenseTitle) - val licenseText = view.findViewById(R.id.licenseText) - val licenseCopyright = view.findViewById(R.id.licenseCopyright) - licenseTitle.text = getString(library.licenseName) - licenseCopyright.text = library.copyrightNote - licenseText.text = resources.openRawResource(library.licenseText).reader().readText() - return view - } -} diff --git a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesMainFragment.kt b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesMainFragment.kt index 3f2618d9..d8ba4907 100644 --- a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesMainFragment.kt +++ b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesMainFragment.kt @@ -18,14 +18,6 @@ class PreferencesMainFragment : PreferenceFragmentCompat() { setSettingsScreen(PreferencesAppearanceFragment()) true } - findPreference("screen_about")?.setOnPreferenceClickListener { - setSettingsScreen(PreferencesAboutFragment()) - true - } - findPreference("screen_weather")?.setOnPreferenceClickListener { - setSettingsScreen(PreferencesWeatherFragment()) - true - } findPreference("screen_services")?.setOnPreferenceClickListener { setSettingsScreen(PreferencesServicesFragment()) true @@ -34,10 +26,6 @@ class PreferencesMainFragment : PreferenceFragmentCompat() { setSettingsScreen(PreferencesSearchFragment()) true } - findPreference("screen_badges")?.setOnPreferenceClickListener { - setSettingsScreen(PreferencesBadgesFragment()) - true - } } private fun setSettingsScreen(fragment: Fragment) { diff --git a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesWeatherFragment.kt b/app/src/main/java/de/mm20/launcher2/fragment/PreferencesWeatherFragment.kt deleted file mode 100644 index d03b01b6..00000000 --- a/app/src/main/java/de/mm20/launcher2/fragment/PreferencesWeatherFragment.kt +++ /dev/null @@ -1,152 +0,0 @@ -package de.mm20.launcher2.fragment - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreference -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItems -import com.afollestad.materialdialogs.list.listItemsSingleChoice -import de.mm20.launcher2.R -import de.mm20.launcher2.preferences.LauncherPreferences -import de.mm20.launcher2.preferences.WeatherProviders -import de.mm20.launcher2.weather.WeatherLocation -import de.mm20.launcher2.weather.WeatherProvider -import de.mm20.launcher2.weather.WeatherViewModel -import de.mm20.launcher2.weather.brightsky.BrightskyProvider -import de.mm20.launcher2.weather.here.HereProvider -import de.mm20.launcher2.weather.metno.MetNoProvider -import de.mm20.launcher2.weather.openweathermap.OpenWeatherMapProvider -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -class PreferencesWeatherFragment : PreferenceFragmentCompat() { - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.preferences_weather) - findPreference("location")?.setOnPreferenceChangeListener { _, newValue -> - lifecycleScope.launch { - val locations = withContext(Dispatchers.IO) { - WeatherProvider.getInstance(requireContext()) - ?.lookupLocation(newValue as String) - } ?: return@launch - onLookupCompleted(locations) - } - false - } - /*findPreference("weather_provider")?.setOnPreferenceChangeListener { pref, newValue -> - val newProvider = WeatherProviders.byValue(newValue as String) - LauncherPreferences.instance.weatherProvider = newProvider - WeatherProvider.getInstance(requireContext())?.resetLastUpdate() - ViewModelProvider(this).get(WeatherViewModel::class.java).requestUpdate(requireContext()) - updateProviderPreferences() - true - }*/ - val providerPref = findPreference("weather_provider")!! - val context = requireContext() - - val providers = mutableListOf>() - OpenWeatherMapProvider(context).takeIf { it.isAvailable() }?.let { - providers.add(WeatherProviders.OPENWEATHERMAP to it.name) - } - HereProvider(context).takeIf { it.isAvailable() }?.let { - providers.add(WeatherProviders.HERE to it.name) - } - MetNoProvider(context).takeIf { it.isAvailable() }?.let { - providers.add(WeatherProviders.MET_NO to it.name) - } - BrightskyProvider(context).takeIf { it.isAvailable() }?.let { - providers.add(WeatherProviders.BRIGHT_SKY to it.name) - } - - if (providers.isEmpty()) { - providerPref.summary = context.getString( - R.string.feature_not_available, - context.getString(R.string.app_name) - ) - providerPref.isEnabled = false - } else { - providerPref.setOnPreferenceClickListener { - MaterialDialog(context).show { - title(R.string.preference_weather_provider) - listItemsSingleChoice( - items = providers.map { it.second }, - initialSelection = providers.indexOfFirst { it.first == LauncherPreferences.instance.weatherProvider } - ) { dialog, index, text -> - LauncherPreferences.instance.weatherProvider = providers[index].first - WeatherProvider.getInstance(requireContext())?.resetLastUpdate() - ViewModelProvider(this@PreferencesWeatherFragment) - .get(WeatherViewModel::class.java) - .requestUpdate(requireContext()) - updateProviderPreferences() - dialog.dismiss() - } - } - true - } - } - findPreference("auto_location")?.setOnPreferenceChangeListener { _, newValue -> - val autoLocation = newValue as Boolean - val provider = WeatherProvider.getInstance(requireContext()) - provider?.autoLocation = autoLocation - provider?.resetLastUpdate() - provider?.setLocation(null) - ViewModelProvider(this).get(WeatherViewModel::class.java) - .requestUpdate(requireContext()) - updateProviderPreferences() - true - } - updateProviderPreferences() - } - - private fun updateProviderPreferences() { - val provider = WeatherProvider.getInstance(requireContext()) - val autoLocationPref = findPreference("auto_location")!! - val locationPref = findPreference("location")!! - val unitsPref = findPreference("imperial_units")!! - val providerPref = findPreference("weather_provider")!! - - locationPref.parent?.isVisible = provider != null - unitsPref.isVisible = provider != null - - provider ?: return - - providerPref.summary = provider.name - autoLocationPref.isChecked = provider.autoLocation - locationPref.summary = - if (provider.autoLocation) provider.getLastLocation()?.name else provider.getLocation()?.name - } - - private fun onLookupCompleted(results: List) { - MaterialDialog(requireContext()) - .listItems( - items = results.map { it.name }, - waitForPositiveButton = false - ) { dialog, index, _ -> - val provider = WeatherProvider.getInstance(requireContext()) - ?: return@listItems dialog.dismiss() - provider.resetLastUpdate() - provider.setLocation(results[index]) - findPreference("location")?.summary = results[index].name - ViewModelProvider(this).get(WeatherViewModel::class.java) - .requestUpdate(requireContext()) - dialog.dismiss() - } - .negativeButton { - it.cancel() - } - .show() - } - - - override fun onResume() { - super.onResume() - - (activity as AppCompatActivity).supportActionBar?.setTitle(R.string.preference_screen_weatherwidget) - } - -} diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherPreferences.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherPreferences.kt index ecc75f6e..78df9db2 100644 --- a/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherPreferences.kt +++ b/preferences/src/main/java/de/mm20/launcher2/preferences/LauncherPreferences.kt @@ -53,40 +53,22 @@ class LauncherPreferences(val context: Application, version: Int = 3) { var dimWallpaper by BooleanPreference("dim_wallpaper", default = false) var appStartAnim by EnumPreference("app_start_anim", default = AppStartAnimation.M) - var searchShowFavorites by BooleanPreference("search_show_favorites", default = true) - var searchAutoAddFavorites by BooleanPreference("search_auto_add_favorites", default = true) - var searchCalculator by BooleanPreference("search_calculator", default = true) - var searchUnitConverter by BooleanPreference("search_unitconverter", default = true) var searchFiles by BooleanPreference("search_files", default = true) - var searchWikipedia by BooleanPreference("search_wikipedia", default = true) var searchWikipediaMobileData by BooleanPreference("search_wikipedia_mobile_data", default = true) - var searchWebsite by BooleanPreference("search_websites", default = true) - var searchWebsitesProtocol by EnumPreference("search_websites_protocol", default = WebsiteProtocols.HTTPS) - var searchWebsitesMobileData by BooleanPreference("search_websearch_mobile_data", default = true) var searchActivities by BooleanPreference("search_activities", default = true) var searchCalendars by BooleanPreference("search_calendars", default = true) var searchContacts by BooleanPreference("search_contacts", default = true) - var searchWikipediaPictures by BooleanPreference("search_wikipedia_pictures", default = false) var searchOwncloud by BooleanPreference("search_owncloud", default = false) var searchNextcloud by BooleanPreference("search_nextcloud", default = false) var searchOneDrive by BooleanPreference("search_onedrive", default = false) var searchGDrive by BooleanPreference("search_gdrive", default = false) var searchGDriveMobileData by BooleanPreference("search_gdrive_mobile_data", default = false) - var notificationBadges by BooleanPreference("notification_badges", default = true) - var cloudBadges by BooleanPreference("cloud_badges", default = true) - var suspendBadges by BooleanPreference("suspended_badges", default = true) var profileBadges by BooleanPreference("profile_badges", default = true) - var shortcutBadges by BooleanPreference("shortcut_badges", default = true) - - var calendarMaxEvents by StringPreference("calendar_max_events", default = "10") var themedIcons by BooleanPreference("themed_icons", default = false) var legacyIconBg by StringPreference("legacy_icon_bg", default = "1") - var blurCards by BooleanPreference("blur_cards", default = false) var searchStyle by EnumPreference("search_style", default = SearchStyles.NO_BG) - var imperialUnits by BooleanPreference("imperial_units", default = context.resources.getBoolean(R.bool.default_imperialUnits)) - var translucentCards by BooleanPreference("translucent_cards", default = false) var iconShape by EnumPreference("icon_shape", default = IconShape.PLATFORM_DEFAULT) var firstRunVersion by IntPreference("first_run_version", default = 0) @@ -95,16 +77,6 @@ class LauncherPreferences(val context: Application, version: Int = 3) { var cardStrokeWidth by IntPreference("card_stroke_width", default = 0) var cardRadius by IntPreference("card_radius", default = 8) - var wallpaperColor by IntPreference("wallpaper_color", default = 0x0) - var isLightWallpaper by BooleanPreference("is_light_wallpaper", default = false) - - var weatherProvider by EnumPreference("weather_provider", default = WeatherProviders.MET_NO) - - var unselectedCalendars by LongListPreference("unselected_calendars", default = emptyList()) - var calendarHideAllday by BooleanPreference("calendar_hide_allday", default = false) - - var hasRequestedNotificationPermission by BooleanPreference("requested_notification_permission", default = false) - var easterEggEnabled by BooleanPreference("easter_egg", default = false) var gridColumnCount by IntPreference("grid_column_count", default = context.resources.getInteger(R.integer.config_columnCount)) @@ -128,11 +100,6 @@ class LauncherPreferences(val context: Application, version: Int = 3) { } } -enum class WebsiteProtocols(override val value: String) : PreferenceEnum { - HTTP("0"), - HTTPS("1") -} - enum class Themes(override val value: String) : PreferenceEnum { SYSTEM("2"), LIGHT("0"), @@ -164,19 +131,6 @@ enum class IconShape(override val value: String) : PreferenceEnum { PLATFORM_DEFAULT("8") } -enum class WeatherProviders(override val value: String) : PreferenceEnum { - OPENWEATHERMAP("0"), - HERE("3"), - MET_NO("2"), - BRIGHT_SKY("4"); - - companion object { - fun byValue(value: String): WeatherProviders { - return values().first { it.value == value } - } - } -} - enum class ColorSchemes(override val value: String) : PreferenceEnum { DEFAULT("0"), BLACK("2"); diff --git a/weather/src/main/java/de/mm20/launcher2/weather/WeatherProvider.kt b/weather/src/main/java/de/mm20/launcher2/weather/WeatherProvider.kt index 8d4d48ae..f2374fc8 100644 --- a/weather/src/main/java/de/mm20/launcher2/weather/WeatherProvider.kt +++ b/weather/src/main/java/de/mm20/launcher2/weather/WeatherProvider.kt @@ -7,12 +7,6 @@ import android.location.LocationManager import androidx.core.content.edit import androidx.core.content.getSystemService import de.mm20.launcher2.ktx.checkPermission -import de.mm20.launcher2.preferences.LauncherPreferences -import de.mm20.launcher2.preferences.WeatherProviders -import de.mm20.launcher2.weather.brightsky.BrightskyProvider -import de.mm20.launcher2.weather.here.HereProvider -import de.mm20.launcher2.weather.metno.MetNoProvider -import de.mm20.launcher2.weather.openweathermap.OpenWeatherMapProvider abstract class WeatherProvider { @@ -100,15 +94,6 @@ abstract class WeatherProvider { companion object { - fun getInstance(context: Context): WeatherProvider? { - return when (LauncherPreferences.instance.weatherProvider) { - WeatherProviders.OPENWEATHERMAP -> OpenWeatherMapProvider(context) - WeatherProviders.HERE -> HereProvider(context) - WeatherProviders.BRIGHT_SKY -> BrightskyProvider(context) - else -> MetNoProvider(context) - }.takeIf { it.isAvailable() } - } - private const val LAST_UPDATE = "last_update" private const val AUTO_LOCATION = "auto_location" } diff --git a/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt b/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt index 6e92f688..0f9597ab 100644 --- a/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt +++ b/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt @@ -6,29 +6,15 @@ import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.ColorDrawable import android.net.Uri -import android.webkit.URLUtil import androidx.core.graphics.drawable.toBitmap -import androidx.core.graphics.toColorInt import androidx.palette.graphics.Palette import com.bumptech.glide.Glide import de.mm20.launcher2.graphics.TextDrawable -import de.mm20.launcher2.helper.NetworkUtils import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.ktx.sp -import de.mm20.launcher2.preferences.LauncherPreferences -import de.mm20.launcher2.preferences.WebsiteProtocols import de.mm20.launcher2.websites.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import okhttp3.HttpUrl -import okhttp3.OkHttpClient -import okhttp3.Request -import org.jsoup.Jsoup -import org.jsoup.UncheckedIOException -import java.io.IOException -import java.net.MalformedURLException -import java.net.URISyntaxException -import java.net.URL import java.util.concurrent.ExecutionException class Website(