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.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.TimeZoneSelectorActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" />
|
||||
|
||||
<receiver android:name=".ui.widgets.MainWidget">
|
||||
<intent-filter>
|
||||
|
@ -84,6 +84,10 @@ object Preferences : KotprefModel() {
|
||||
|
||||
var weatherIconPack by intPref(default = Constants.WeatherIconPack.DEFAULT.rawValue)
|
||||
|
||||
// Clock
|
||||
var altTimezoneLabel by stringPref(default = "")
|
||||
var altTimezoneId by stringPref(default = "")
|
||||
|
||||
// Global
|
||||
var textMainSize by floatPref(key = "PREF_TEXT_MAIN_SIZE", default = 26f)
|
||||
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,
|
||||
): 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
|
||||
|
||||
// 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
|
||||
binding.widgetDetail.clockBottomMarginNone.isVisible =
|
||||
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.ui.activities.tabs.ChooseApplicationActivity
|
||||
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.utils.isDarkTheme
|
||||
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) {
|
||||
maintainScrollPosition {
|
||||
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()
|
||||
}
|
||||
|
||||
binding.actionAltTimezoneClock.setOnClickListener {
|
||||
startActivity(Intent(requireContext(), TimeZoneSelectorActivity::class.java))
|
||||
}
|
||||
|
||||
binding.actionAmpmIndicatorSize.setOnClickListener {
|
||||
binding.ampmIndicatorToggle.isChecked = !binding.ampmIndicatorToggle.isChecked
|
||||
}
|
||||
|
@ -65,6 +65,7 @@ class MainViewModel(context: Application) : AndroidViewModel(context) {
|
||||
// Clock Settings
|
||||
val showClock = Preferences.asLiveData(Preferences::showClock)
|
||||
val clockTextSize = Preferences.asLiveData(Preferences::clockTextSize)
|
||||
val altTimezoneLabel = Preferences.asLiveData(Preferences::altTimezoneLabel)
|
||||
val clockTextColor = MediatorLiveData<Boolean>().apply {
|
||||
addSource(Preferences.asLiveData(Preferences::clockTextColor)) { 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::showAMPMIndicator)) { value = true }
|
||||
addSource(Preferences.asLiveData(Preferences::clockBottomMargin)) { value = true }
|
||||
addSource(Preferences.asLiveData(Preferences::altTimezoneLabel)) { value = true }
|
||||
}
|
||||
val widgetPreferencesUpdate = MediatorLiveData<Boolean>().apply {
|
||||
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,
|
||||
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) {
|
||||
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"/>
|
||||
</androidx.cardview.widget.CardView>
|
||||
</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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -43,6 +43,50 @@
|
||||
android:maxLines="1"
|
||||
style="@style/AnotherWidget.Widget.Title"
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
|
@ -45,6 +45,50 @@
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
|
@ -204,6 +204,11 @@
|
||||
<string name="settings_clock_text_color_title">Text color</string>
|
||||
<string name="settings_ampm_indicator_title">Show AM/PM indicator</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 -->
|
||||
<string name="settings_show_next_alarm_title">Next clock alarm</string>
|
||||
|
Loading…
x
Reference in New Issue
Block a user