Added single multiple clock
This commit is contained in:
parent
03d9446369
commit
b61fbd193c
@ -41,6 +41,7 @@
|
|||||||
<activity android:name=".ui.activities.tabs.MusicPlayersFilterActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
<activity android:name=".ui.activities.tabs.MusicPlayersFilterActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
||||||
<activity android:name=".ui.activities.tabs.AppNotificationsFilterActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
<activity android:name=".ui.activities.tabs.AppNotificationsFilterActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
||||||
<activity android:name=".ui.activities.tabs.MediaInfoFormatActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
<activity android:name=".ui.activities.tabs.MediaInfoFormatActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
||||||
|
<activity android:name=".ui.activities.tabs.TimeZoneSelectorActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
||||||
|
|
||||||
<receiver android:name=".ui.widgets.MainWidget">
|
<receiver android:name=".ui.widgets.MainWidget">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
@ -84,6 +84,10 @@ object Preferences : KotprefModel() {
|
|||||||
|
|
||||||
var weatherIconPack by intPref(default = Constants.WeatherIconPack.DEFAULT.rawValue)
|
var weatherIconPack by intPref(default = Constants.WeatherIconPack.DEFAULT.rawValue)
|
||||||
|
|
||||||
|
// Clock
|
||||||
|
var altTimezoneLabel by stringPref(default = "")
|
||||||
|
var altTimezoneId by stringPref(default = "")
|
||||||
|
|
||||||
// Global
|
// Global
|
||||||
var textMainSize by floatPref(key = "PREF_TEXT_MAIN_SIZE", default = 26f)
|
var textMainSize by floatPref(key = "PREF_TEXT_MAIN_SIZE", default = 26f)
|
||||||
var textSecondSize by floatPref(key = "PREF_TEXT_SECOND_SIZE", default = 18f)
|
var textSecondSize by floatPref(key = "PREF_TEXT_SECOND_SIZE", default = 18f)
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.tommasoberlose.anotherwidget.network
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.Log
|
||||||
|
import com.chibatching.kotpref.Kotpref
|
||||||
|
import com.google.gson.internal.LinkedTreeMap
|
||||||
|
import com.haroldadmin.cnradapter.NetworkResponse
|
||||||
|
import com.tommasoberlose.anotherwidget.R
|
||||||
|
import com.tommasoberlose.anotherwidget.global.Constants
|
||||||
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||||
|
import com.tommasoberlose.anotherwidget.helpers.WeatherHelper
|
||||||
|
import com.tommasoberlose.anotherwidget.network.repository.TimeZonesRepository
|
||||||
|
import com.tommasoberlose.anotherwidget.ui.fragments.MainFragment
|
||||||
|
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
||||||
|
import org.greenrobot.eventbus.EventBus
|
||||||
|
import java.lang.Exception
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class TimeZonesApi(val context: Context) {
|
||||||
|
suspend fun getTimeZone(lat: String, long: String): String? {
|
||||||
|
Kotpref.init(context)
|
||||||
|
val repository = TimeZonesRepository()
|
||||||
|
var id: String? = null
|
||||||
|
|
||||||
|
when (val response = repository.getTimeZone(lat, long)) {
|
||||||
|
is NetworkResponse.Success -> {
|
||||||
|
try {
|
||||||
|
Log.d("ciao", response.body.toString())
|
||||||
|
id = response.body["timezoneId"] as String
|
||||||
|
|
||||||
|
} catch(ex: Exception) {
|
||||||
|
ex.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
}
|
@ -71,4 +71,13 @@ object ApiServices {
|
|||||||
@Query("lon") lon: String,
|
@Query("lon") lon: String,
|
||||||
): NetworkResponse<HashMap<String, Any>, HashMap<String, Any>>
|
): NetworkResponse<HashMap<String, Any>, HashMap<String, Any>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface TimeZonesService {
|
||||||
|
@GET("timezoneJSON")
|
||||||
|
suspend fun getTimeZone(
|
||||||
|
@Query("lat") lat: String,
|
||||||
|
@Query("lng") lon: String,
|
||||||
|
@Query("username") username: String = "tommaso.berlose",
|
||||||
|
): NetworkResponse<HashMap<String, Any>, HashMap<String, Any>>
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.tommasoberlose.anotherwidget.network.repository
|
||||||
|
|
||||||
|
import com.haroldadmin.cnradapter.NetworkResponseAdapterFactory
|
||||||
|
import com.tommasoberlose.anotherwidget.network.api.ApiServices
|
||||||
|
import retrofit2.Retrofit
|
||||||
|
import retrofit2.converter.gson.GsonConverterFactory
|
||||||
|
|
||||||
|
class TimeZonesRepository {
|
||||||
|
|
||||||
|
/* YR */
|
||||||
|
private val apiService: ApiServices.TimeZonesService = getRetrofit().create(ApiServices.TimeZonesService::class.java)
|
||||||
|
suspend fun getTimeZone(lat: String, long: String) = apiService.getTimeZone(lat, long)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val BASE_URL_YR = "http://api.geonames.org/"
|
||||||
|
|
||||||
|
private fun getRetrofit(): Retrofit {
|
||||||
|
return Retrofit.Builder()
|
||||||
|
.baseUrl(BASE_URL_YR)
|
||||||
|
.addConverterFactory(GsonConverterFactory.create())
|
||||||
|
.addCallAdapterFactory(NetworkResponseAdapterFactory())
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,151 @@
|
|||||||
|
package com.tommasoberlose.anotherwidget.ui.activities.tabs
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.app.Activity
|
||||||
|
import android.location.Address
|
||||||
|
import android.location.Geocoder
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.text.method.LinkMovementMethod
|
||||||
|
import android.view.View
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import com.chibatching.kotpref.bulk
|
||||||
|
import com.karumi.dexter.Dexter
|
||||||
|
import com.karumi.dexter.MultiplePermissionsReport
|
||||||
|
import com.karumi.dexter.PermissionToken
|
||||||
|
import com.karumi.dexter.listener.PermissionRequest
|
||||||
|
import com.karumi.dexter.listener.multi.MultiplePermissionsListener
|
||||||
|
import com.tommasoberlose.anotherwidget.R
|
||||||
|
import com.tommasoberlose.anotherwidget.databinding.ActivityTimeZoneSelectorBinding
|
||||||
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||||
|
import com.tommasoberlose.anotherwidget.network.TimeZonesApi
|
||||||
|
import com.tommasoberlose.anotherwidget.network.WeatherNetworkApi
|
||||||
|
import com.tommasoberlose.anotherwidget.ui.viewmodels.tabs.TimeZoneSelectorViewModel
|
||||||
|
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
||||||
|
import com.tommasoberlose.anotherwidget.utils.toast
|
||||||
|
import kotlinx.coroutines.*
|
||||||
|
import net.idik.lib.slimadapter.SlimAdapter
|
||||||
|
|
||||||
|
class TimeZoneSelectorActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private lateinit var adapter: SlimAdapter
|
||||||
|
private lateinit var viewModel: TimeZoneSelectorViewModel
|
||||||
|
private lateinit var binding: ActivityTimeZoneSelectorBinding
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
viewModel = ViewModelProvider(this).get(TimeZoneSelectorViewModel::class.java)
|
||||||
|
binding = ActivityTimeZoneSelectorBinding.inflate(layoutInflater)
|
||||||
|
|
||||||
|
binding.geonameCredits.movementMethod = LinkMovementMethod.getInstance()
|
||||||
|
|
||||||
|
binding.listView.setHasFixedSize(true)
|
||||||
|
val mLayoutManager = LinearLayoutManager(this)
|
||||||
|
binding.listView.layoutManager = mLayoutManager
|
||||||
|
|
||||||
|
adapter = SlimAdapter.create()
|
||||||
|
adapter
|
||||||
|
.register<String>(R.layout.custom_location_item) { _, injector ->
|
||||||
|
injector
|
||||||
|
.text(R.id.text, getString(R.string.no_time_zone_label))
|
||||||
|
.clicked(R.id.text) {
|
||||||
|
Preferences.bulk {
|
||||||
|
altTimezoneId = ""
|
||||||
|
altTimezoneLabel = ""
|
||||||
|
}
|
||||||
|
MainWidget.updateWidget(this@TimeZoneSelectorActivity)
|
||||||
|
setResult(Activity.RESULT_OK)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.register<Address>(R.layout.custom_location_item) { item, injector ->
|
||||||
|
injector.text(R.id.text, item.getAddressLine(0))
|
||||||
|
injector.clicked(R.id.item) {
|
||||||
|
binding.loader.visibility = View.VISIBLE
|
||||||
|
lifecycleScope.launch(Dispatchers.IO) {
|
||||||
|
val networkApi = TimeZonesApi(this@TimeZoneSelectorActivity)
|
||||||
|
val id = networkApi.getTimeZone(item.latitude.toString(), item.longitude.toString())
|
||||||
|
|
||||||
|
if (id != null) {
|
||||||
|
Preferences.bulk {
|
||||||
|
altTimezoneId = id
|
||||||
|
altTimezoneLabel = item.locality
|
||||||
|
}
|
||||||
|
MainWidget.updateWidget(this@TimeZoneSelectorActivity)
|
||||||
|
setResult(Activity.RESULT_OK)
|
||||||
|
finish()
|
||||||
|
} else {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
binding.loader.visibility = View.INVISIBLE
|
||||||
|
toast(getString(R.string.time_zone_search_error_message))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.attachTo(binding.listView)
|
||||||
|
|
||||||
|
|
||||||
|
viewModel.addresses.observe(this, Observer {
|
||||||
|
adapter.updateData(listOf("Default") + it)
|
||||||
|
})
|
||||||
|
|
||||||
|
setupListener()
|
||||||
|
subscribeUi(binding, viewModel)
|
||||||
|
|
||||||
|
binding.location.requestFocus()
|
||||||
|
|
||||||
|
setContentView(binding.root)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var searchJob: Job? = null
|
||||||
|
|
||||||
|
private fun subscribeUi(binding: ActivityTimeZoneSelectorBinding, viewModel: TimeZoneSelectorViewModel) {
|
||||||
|
binding.viewModel = viewModel
|
||||||
|
binding.lifecycleOwner = this
|
||||||
|
|
||||||
|
viewModel.addresses.observe(this, Observer {
|
||||||
|
adapter.updateData(listOf("Default") + it)
|
||||||
|
binding.loader.visibility = View.INVISIBLE
|
||||||
|
})
|
||||||
|
|
||||||
|
viewModel.locationInput.observe(this, Observer { location ->
|
||||||
|
binding.loader.visibility = View.VISIBLE
|
||||||
|
searchJob?.cancel()
|
||||||
|
searchJob = lifecycleScope.launch(Dispatchers.IO) {
|
||||||
|
delay(200)
|
||||||
|
val list = if (location == null || location == "") {
|
||||||
|
viewModel.addresses.value!!
|
||||||
|
} else {
|
||||||
|
val coder = Geocoder(this@TimeZoneSelectorActivity)
|
||||||
|
try {
|
||||||
|
coder.getFromLocationName(location, 10) as ArrayList<Address>
|
||||||
|
} catch (ignored: Exception) {
|
||||||
|
emptyList<Address>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
viewModel.addresses.value = list
|
||||||
|
binding.loader.visibility = View.INVISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
binding.clearSearch.isVisible = location.isNotBlank()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupListener() {
|
||||||
|
binding.actionBack.setOnClickListener {
|
||||||
|
onBackPressed()
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.clearSearch.setOnClickListener {
|
||||||
|
viewModel.locationInput.value = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -249,6 +249,32 @@ class MainFragment : Fragment() {
|
|||||||
)
|
)
|
||||||
binding.widgetDetail.timeAmPm.isVisible = Preferences.showAMPMIndicator
|
binding.widgetDetail.timeAmPm.isVisible = Preferences.showAMPMIndicator
|
||||||
|
|
||||||
|
// Timezones
|
||||||
|
if (Preferences.altTimezoneId != "" && Preferences.altTimezoneLabel != "") {
|
||||||
|
// Clock
|
||||||
|
binding.widgetDetail.altTimezoneTime.timeZone = Preferences.altTimezoneId
|
||||||
|
binding.widgetDetail.altTimezoneTimeAmPm.timeZone = Preferences.altTimezoneId
|
||||||
|
binding.widgetDetail.altTimezoneLabel.text = Preferences.altTimezoneLabel
|
||||||
|
binding.widgetDetail.altTimezoneTime.setTextColor(ColorHelper.getClockFontColor(requireActivity().isDarkTheme()))
|
||||||
|
binding.widgetDetail.altTimezoneTimeAmPm.setTextColor(ColorHelper.getClockFontColor(requireActivity().isDarkTheme()))
|
||||||
|
binding.widgetDetail.altTimezoneLabel.setTextColor(ColorHelper.getClockFontColor(requireActivity().isDarkTheme()))
|
||||||
|
binding.widgetDetail.altTimezoneTime.setTextSize(
|
||||||
|
TypedValue.COMPLEX_UNIT_SP,
|
||||||
|
Preferences.clockTextSize.toPixel(requireContext()) / 3
|
||||||
|
)
|
||||||
|
binding.widgetDetail.altTimezoneTimeAmPm.setTextSize(
|
||||||
|
TypedValue.COMPLEX_UNIT_SP,
|
||||||
|
(Preferences.clockTextSize.toPixel(requireContext()) / 3) / 5 * 2
|
||||||
|
)
|
||||||
|
binding.widgetDetail.altTimezoneLabel.setTextSize(
|
||||||
|
TypedValue.COMPLEX_UNIT_SP,
|
||||||
|
(Preferences.clockTextSize.toPixel(requireContext()) / 3) / 5 * 2
|
||||||
|
)
|
||||||
|
binding.widgetDetail.timezonesContainer.isVisible = true
|
||||||
|
} else {
|
||||||
|
binding.widgetDetail.timezonesContainer.isVisible = false
|
||||||
|
}
|
||||||
|
|
||||||
// Clock bottom margin
|
// Clock bottom margin
|
||||||
binding.widgetDetail.clockBottomMarginNone.isVisible =
|
binding.widgetDetail.clockBottomMarginNone.isVisible =
|
||||||
Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.NONE.rawValue
|
Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.NONE.rawValue
|
||||||
|
@ -28,6 +28,7 @@ import com.tommasoberlose.anotherwidget.helpers.ColorHelper.toIntValue
|
|||||||
import com.tommasoberlose.anotherwidget.helpers.IntentHelper
|
import com.tommasoberlose.anotherwidget.helpers.IntentHelper
|
||||||
import com.tommasoberlose.anotherwidget.ui.activities.tabs.ChooseApplicationActivity
|
import com.tommasoberlose.anotherwidget.ui.activities.tabs.ChooseApplicationActivity
|
||||||
import com.tommasoberlose.anotherwidget.ui.activities.MainActivity
|
import com.tommasoberlose.anotherwidget.ui.activities.MainActivity
|
||||||
|
import com.tommasoberlose.anotherwidget.ui.activities.tabs.TimeZoneSelectorActivity
|
||||||
import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel
|
import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel
|
||||||
import com.tommasoberlose.anotherwidget.utils.isDarkTheme
|
import com.tommasoberlose.anotherwidget.utils.isDarkTheme
|
||||||
import com.tommasoberlose.anotherwidget.utils.isDefaultSet
|
import com.tommasoberlose.anotherwidget.utils.isDefaultSet
|
||||||
@ -100,6 +101,17 @@ class ClockFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
viewModel.altTimezoneLabel.observe(viewLifecycleOwner) {
|
||||||
|
maintainScrollPosition {
|
||||||
|
if (it != "") {
|
||||||
|
binding.altTimezoneClockLabel.text =
|
||||||
|
String.format("%s (%s)", it, Preferences.altTimezoneId)
|
||||||
|
} else {
|
||||||
|
binding.altTimezoneClockLabel.text = getString(R.string.no_time_zone_label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
viewModel.showAMPMIndicator.observe(viewLifecycleOwner) {
|
viewModel.showAMPMIndicator.observe(viewLifecycleOwner) {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
binding.ampmIndicatorLabel.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
|
binding.ampmIndicatorLabel.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
|
||||||
@ -144,6 +156,10 @@ class ClockFragment : Fragment() {
|
|||||||
}.show()
|
}.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binding.actionAltTimezoneClock.setOnClickListener {
|
||||||
|
startActivity(Intent(requireContext(), TimeZoneSelectorActivity::class.java))
|
||||||
|
}
|
||||||
|
|
||||||
binding.actionAmpmIndicatorSize.setOnClickListener {
|
binding.actionAmpmIndicatorSize.setOnClickListener {
|
||||||
binding.ampmIndicatorToggle.isChecked = !binding.ampmIndicatorToggle.isChecked
|
binding.ampmIndicatorToggle.isChecked = !binding.ampmIndicatorToggle.isChecked
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ class MainViewModel(context: Application) : AndroidViewModel(context) {
|
|||||||
// Clock Settings
|
// Clock Settings
|
||||||
val showClock = Preferences.asLiveData(Preferences::showClock)
|
val showClock = Preferences.asLiveData(Preferences::showClock)
|
||||||
val clockTextSize = Preferences.asLiveData(Preferences::clockTextSize)
|
val clockTextSize = Preferences.asLiveData(Preferences::clockTextSize)
|
||||||
|
val altTimezoneLabel = Preferences.asLiveData(Preferences::altTimezoneLabel)
|
||||||
val clockTextColor = MediatorLiveData<Boolean>().apply {
|
val clockTextColor = MediatorLiveData<Boolean>().apply {
|
||||||
addSource(Preferences.asLiveData(Preferences::clockTextColor)) { value = true }
|
addSource(Preferences.asLiveData(Preferences::clockTextColor)) { value = true }
|
||||||
addSource(Preferences.asLiveData(Preferences::clockTextAlpha)) { value = true }
|
addSource(Preferences.asLiveData(Preferences::clockTextAlpha)) { value = true }
|
||||||
@ -108,6 +109,7 @@ class MainViewModel(context: Application) : AndroidViewModel(context) {
|
|||||||
addSource(Preferences.asLiveData(Preferences::clockTextAlphaDark)) { value = true }
|
addSource(Preferences.asLiveData(Preferences::clockTextAlphaDark)) { value = true }
|
||||||
addSource(Preferences.asLiveData(Preferences::showAMPMIndicator)) { value = true }
|
addSource(Preferences.asLiveData(Preferences::showAMPMIndicator)) { value = true }
|
||||||
addSource(Preferences.asLiveData(Preferences::clockBottomMargin)) { value = true }
|
addSource(Preferences.asLiveData(Preferences::clockBottomMargin)) { value = true }
|
||||||
|
addSource(Preferences.asLiveData(Preferences::altTimezoneLabel)) { value = true }
|
||||||
}
|
}
|
||||||
val widgetPreferencesUpdate = MediatorLiveData<Boolean>().apply {
|
val widgetPreferencesUpdate = MediatorLiveData<Boolean>().apply {
|
||||||
addSource(Preferences.asLiveData(Preferences::textGlobalColor)) { value = true }
|
addSource(Preferences.asLiveData(Preferences::textGlobalColor)) { value = true }
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.tommasoberlose.anotherwidget.ui.viewmodels.tabs
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.location.Address
|
||||||
|
import androidx.lifecycle.AndroidViewModel
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||||
|
|
||||||
|
class TimeZoneSelectorViewModel(application: Application) : AndroidViewModel(application) {
|
||||||
|
|
||||||
|
val addresses: MutableLiveData<List<Address>> = MutableLiveData(emptyList())
|
||||||
|
val locationInput: MutableLiveData<String> = MutableLiveData(Preferences.altTimezoneLabel)
|
||||||
|
}
|
@ -64,6 +64,38 @@ class ClockWidget(val context: Context) {
|
|||||||
R.id.clock_bottom_margin_large,
|
R.id.clock_bottom_margin_large,
|
||||||
if (Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.rawValue) View.VISIBLE else View.GONE
|
if (Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.rawValue) View.VISIBLE else View.GONE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// Timezones
|
||||||
|
if (Preferences.altTimezoneId != "" && Preferences.altTimezoneLabel != "") {
|
||||||
|
views.setString(R.id.alt_timezone_time, "setTimeZone", Preferences.altTimezoneId)
|
||||||
|
views.setString(R.id.alt_timezone_time_am_pm, "setTimeZone", Preferences.altTimezoneId)
|
||||||
|
views.setTextViewText(R.id.alt_timezone_label, Preferences.altTimezoneLabel)
|
||||||
|
|
||||||
|
views.setTextColor(R.id.alt_timezone_time, ColorHelper.getClockFontColor(context.isDarkTheme()))
|
||||||
|
views.setTextColor(R.id.alt_timezone_time_am_pm, ColorHelper.getClockFontColor(context.isDarkTheme()))
|
||||||
|
views.setTextColor(R.id.alt_timezone_label, ColorHelper.getClockFontColor(context.isDarkTheme()))
|
||||||
|
views.setTextViewTextSize(
|
||||||
|
R.id.alt_timezone_time,
|
||||||
|
TypedValue.COMPLEX_UNIT_SP,
|
||||||
|
Preferences.clockTextSize.toPixel(context) / 3
|
||||||
|
)
|
||||||
|
views.setTextViewTextSize(
|
||||||
|
R.id.alt_timezone_time_am_pm,
|
||||||
|
TypedValue.COMPLEX_UNIT_SP,
|
||||||
|
(Preferences.clockTextSize.toPixel(context) / 3) / 5 * 2
|
||||||
|
)
|
||||||
|
views.setTextViewTextSize(
|
||||||
|
R.id.alt_timezone_label,
|
||||||
|
TypedValue.COMPLEX_UNIT_SP,
|
||||||
|
(Preferences.clockTextSize.toPixel(context) / 3) / 5 * 2
|
||||||
|
)
|
||||||
|
|
||||||
|
views.setOnClickPendingIntent(R.id.timezones_container, clockPIntent)
|
||||||
|
views.setViewVisibility(R.id.timezones_container, View.VISIBLE)
|
||||||
|
} else {
|
||||||
|
views.setViewVisibility(R.id.timezones_container, View.GONE)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (ex: Exception) {
|
} catch (ex: Exception) {
|
||||||
ex.printStackTrace()
|
ex.printStackTrace()
|
||||||
|
148
app/src/main/res/layout/activity_time_zone_selector.xml
Normal file
148
app/src/main/res/layout/activity_time_zone_selector.xml
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layout>
|
||||||
|
<data>
|
||||||
|
<variable
|
||||||
|
name="viewModel"
|
||||||
|
type="com.tommasoberlose.anotherwidget.ui.viewmodels.tabs.TimeZoneSelectorViewModel" />
|
||||||
|
</data>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:background="@color/colorPrimaryDark"
|
||||||
|
tools:context="com.tommasoberlose.anotherwidget.ui.activities.tabs.TimeZoneSelectorActivity">
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:cardElevation="2dp"
|
||||||
|
app:cardCornerRadius="0dp"
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
app:cardBackgroundColor="@color/colorPrimary">
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp">
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:padding="12dp"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:id="@+id/action_back"
|
||||||
|
app:tint="@color/colorPrimaryText"
|
||||||
|
android:src="@drawable/round_arrow_back_24" />
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:text="@string/time_zones_header"
|
||||||
|
android:gravity="center"
|
||||||
|
style="@style/AnotherWidget.Main.Title"/>
|
||||||
|
</RelativeLayout>
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:cardElevation="2dp"
|
||||||
|
app:cardCornerRadius="0dp"
|
||||||
|
app:cardBackgroundColor="@color/colorPrimary">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:layout_marginBottom="16dp">
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:cardBackgroundColor="@color/colorPrimaryDark"
|
||||||
|
app:cardCornerRadius="9dp"
|
||||||
|
app:cardElevation="0dp">
|
||||||
|
<EditText
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:background="@color/colorPrimaryDark"
|
||||||
|
android:paddingLeft="16dp"
|
||||||
|
android:paddingRight="16dp"
|
||||||
|
android:inputType="textCapWords"
|
||||||
|
android:id="@+id/location"
|
||||||
|
android:fontFamily="@font/google_sans"
|
||||||
|
android:gravity="center_vertical|start"
|
||||||
|
android:hint="@string/search"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textDirection="locale"
|
||||||
|
android:text="@={viewModel.locationInput}"
|
||||||
|
android:autofillHints="" />
|
||||||
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:padding="12dp"
|
||||||
|
android:src="@drawable/round_close"
|
||||||
|
app:tint="@color/colorPrimaryText"
|
||||||
|
android:layout_gravity="center_vertical|end"
|
||||||
|
android:id="@+id/clear_search" />
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:gravity="center_vertical">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:padding="4dp"
|
||||||
|
android:src="@drawable/outline_info_24"
|
||||||
|
app:tint="@color/colorSecondaryText"/>
|
||||||
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:duplicateParentState="true"
|
||||||
|
android:linksClickable="true"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:id="@+id/geoname_credits"
|
||||||
|
android:textColorLink="@color/colorPrimaryText"
|
||||||
|
android:text="@string/geoname_credit"
|
||||||
|
android:textColor="@color/colorSecondaryText"
|
||||||
|
android:letterSpacing="0"
|
||||||
|
android:fontFamily="@font/google_sans"
|
||||||
|
android:textAppearance="@style/AnotherWidget.Settings.Subtitle"
|
||||||
|
app:textAllCaps="false" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1">
|
||||||
|
<androidx.core.widget.ContentLoadingProgressBar
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:indeterminateTint="@color/colorAccent"
|
||||||
|
android:layout_marginTop="-7dp"
|
||||||
|
android:id="@+id/loader"
|
||||||
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal" />
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:id="@+id/list_view" />
|
||||||
|
</RelativeLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</layout>
|
@ -138,6 +138,51 @@
|
|||||||
android:text="@string/settings_subtitle_dark_theme_dark"/>
|
android:text="@string/settings_subtitle_dark_theme_dark"/>
|
||||||
</androidx.cardview.widget.CardView>
|
</androidx.cardview.widget.CardView>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/time_zones_header"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:paddingStart="20dp"
|
||||||
|
android:paddingEnd="20dp"
|
||||||
|
android:textAppearance="@style/AnotherWidget.Settings.Header" />
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="12dp"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:background="?android:attr/selectableItemBackground"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:id="@+id/action_alt_timezone_clock"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:padding="12dp"
|
||||||
|
android:src="@drawable/round_text_fields_24"
|
||||||
|
app:tint="@color/colorPrimaryText"/>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/AnotherWidget.Settings.Title"
|
||||||
|
android:text="@string/settings_alt_timezone_title"/>
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/alt_timezone_clock_label"
|
||||||
|
style="@style/AnotherWidget.Settings.Subtitle"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -43,6 +43,50 @@
|
|||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
style="@style/AnotherWidget.Widget.Title"
|
style="@style/AnotherWidget.Widget.Title"
|
||||||
android:gravity="center_vertical"/>
|
android:gravity="center_vertical"/>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/timezones_container"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginEnd="0dp"
|
||||||
|
android:layout_marginTop="18dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
<TextClock
|
||||||
|
android:id="@+id/alt_timezone_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:format12Hour="h:mm"
|
||||||
|
android:padding="0dp"
|
||||||
|
android:lines="1"
|
||||||
|
android:maxLines="1"
|
||||||
|
style="@style/AnotherWidget.Widget.Title"
|
||||||
|
android:gravity="center_vertical"/>
|
||||||
|
<TextClock
|
||||||
|
android:id="@+id/alt_timezone_time_am_pm"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:format12Hour="a"
|
||||||
|
android:format24Hour=""
|
||||||
|
android:padding="0dp"
|
||||||
|
android:lines="1"
|
||||||
|
android:maxLines="1"
|
||||||
|
style="@style/AnotherWidget.Widget.Title"
|
||||||
|
android:gravity="center_vertical"/>
|
||||||
|
</LinearLayout>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/alt_timezone_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:gravity="start"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:includeFontPadding="false"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/AnotherWidget.Widget.Subtitle" />
|
||||||
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -45,6 +45,50 @@
|
|||||||
android:lines="1"
|
android:lines="1"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
style="@style/AnotherWidget.Widget.Title"/>
|
style="@style/AnotherWidget.Widget.Title"/>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/timezones_container"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginEnd="0dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
<TextClock
|
||||||
|
android:id="@+id/alt_timezone_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:format12Hour="h:mm"
|
||||||
|
android:padding="0dp"
|
||||||
|
android:lines="1"
|
||||||
|
android:maxLines="1"
|
||||||
|
style="@style/AnotherWidget.Widget.Title"
|
||||||
|
android:gravity="center_vertical"/>
|
||||||
|
<TextClock
|
||||||
|
android:id="@+id/alt_timezone_time_am_pm"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:format12Hour="a"
|
||||||
|
android:format24Hour=""
|
||||||
|
android:padding="0dp"
|
||||||
|
android:lines="1"
|
||||||
|
android:maxLines="1"
|
||||||
|
style="@style/AnotherWidget.Widget.Title"
|
||||||
|
android:gravity="center_vertical"/>
|
||||||
|
</LinearLayout>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/alt_timezone_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:gravity="start"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:includeFontPadding="false"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/AnotherWidget.Widget.Subtitle" />
|
||||||
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -204,6 +204,11 @@
|
|||||||
<string name="settings_clock_text_color_title">Text color</string>
|
<string name="settings_clock_text_color_title">Text color</string>
|
||||||
<string name="settings_ampm_indicator_title">Show AM/PM indicator</string>
|
<string name="settings_ampm_indicator_title">Show AM/PM indicator</string>
|
||||||
<string name="clock_text_header">Clock text style</string>
|
<string name="clock_text_header">Clock text style</string>
|
||||||
|
<string name="time_zones_header">Time Zones</string>
|
||||||
|
<string name="settings_alt_timezone_title">Multiple clock</string>
|
||||||
|
<string name="no_time_zone_label">None</string>
|
||||||
|
<string name="time_zone_search_error_message">Error searching the time zone.</string>
|
||||||
|
<string name="geoname_credit">Service available thanks to <a href="http://www.geonames.org/">GeoName</a>.</string>
|
||||||
|
|
||||||
<!-- Glance -->
|
<!-- Glance -->
|
||||||
<string name="settings_show_next_alarm_title">Next clock alarm</string>
|
<string name="settings_show_next_alarm_title">Next clock alarm</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user