Location 수정중....

This commit is contained in:
JUNGGWAN KIM 2024-10-04 17:52:46 +09:00
parent 007be81744
commit fe210b1f7d
12 changed files with 91 additions and 25 deletions

View File

@ -53,6 +53,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.work.OneTimeWorkRequest import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager import androidx.work.WorkManager
import io.realm.kotlin.Realm
import io.realm.kotlin.ext.asFlow import io.realm.kotlin.ext.asFlow
import io.realm.kotlin.ext.query import io.realm.kotlin.ext.query
import io.realm.kotlin.notifications.InitialObject import io.realm.kotlin.notifications.InitialObject
@ -61,6 +62,7 @@ import io.realm.kotlin.notifications.ObjectChange
import io.realm.kotlin.notifications.ResultsChange import io.realm.kotlin.notifications.ResultsChange
import io.realm.kotlin.notifications.UpdatedObject import io.realm.kotlin.notifications.UpdatedObject
import io.realm.kotlin.notifications.UpdatedResults import io.realm.kotlin.notifications.UpdatedResults
import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.query.RealmResults import io.realm.kotlin.query.RealmResults
import io.realm.kotlin.query.Sort import io.realm.kotlin.query.Sort
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -93,6 +95,7 @@ import rasel.lunar.launcher.home.adapters.SmsLogsAdapter
import rasel.lunar.launcher.home.adapters.WeatherAdapter import rasel.lunar.launcher.home.adapters.WeatherAdapter
import rasel.lunar.launcher.model.CurrentPlayItem import rasel.lunar.launcher.model.CurrentPlayItem
import rasel.lunar.launcher.model.Hour import rasel.lunar.launcher.model.Hour
import rasel.lunar.launcher.model.Location
import rasel.lunar.launcher.model.NotificationItem import rasel.lunar.launcher.model.NotificationItem
import rasel.lunar.launcher.model.RssData import rasel.lunar.launcher.model.RssData
import rasel.lunar.launcher.model.RssDataInterface import rasel.lunar.launcher.model.RssDataInterface
@ -106,6 +109,8 @@ import rasel.lunar.launcher.utils.JamoUtils
import rasel.lunar.launcher.utils.SimpleFingerGestures import rasel.lunar.launcher.utils.SimpleFingerGestures
import rasel.lunar.launcher.utils.beforeDay import rasel.lunar.launcher.utils.beforeDay
import rasel.lunar.launcher.view.TableRadioGroup import rasel.lunar.launcher.view.TableRadioGroup
import rasel.lunar.launcher.workers.LocationGetter
import rasel.lunar.launcher.workers.OpenWeatherGetter
import rasel.lunar.launcher.workers.RecentCall import rasel.lunar.launcher.workers.RecentCall
import rasel.lunar.launcher.workers.RecentSms import rasel.lunar.launcher.workers.RecentSms
import rasel.lunar.launcher.workers.TelegramBotGetter import rasel.lunar.launcher.workers.TelegramBotGetter
@ -295,6 +300,18 @@ internal class LauncherHome : Fragment() {
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun queryWeather() { private fun queryWeather() {
val re = WorkersDb.getRealm().query<Hour>("lat == $0 AND lon == $1", OpenWeatherGetter.lat, OpenWeatherGetter.lon).find()
BLog.LOGE("testtestetset ${LocationGetter.latitude}")
val weatherJob2 = CoroutineScope(Dispatchers.Default).launch {
re.asFlow().collect { changes ->
BLog.LOGE("testtestetset ${changes.list}")
Handler(Looper.getMainLooper()).post {
// BLog.LOGE("testtestetset ${changes.list.first().lat}")
}
}
}
weatherJob2.start()
mWeatherResult = WorkersDb.getRealm().query<WeatherForcast>().find() mWeatherResult = WorkersDb.getRealm().query<WeatherForcast>().find()
val weatherJob = CoroutineScope(Dispatchers.Default).launch { val weatherJob = CoroutineScope(Dispatchers.Default).launch {
mWeatherResult?.asFlow()?.collect { changes -> mWeatherResult?.asFlow()?.collect { changes ->
@ -312,9 +329,13 @@ internal class LauncherHome : Fragment() {
.filter( .filter(
i.hourRealm.also { hli -> i.hourRealm.also { hli ->
BLog.LOGE("LauncherHome Saved hli size >>> ${hli.size}") BLog.LOGE("LauncherHome Saved hli size >>> ${hli.size}")
BLog.LOGE("LauncherHome Saved hli size >>> ${hli.first().lat}")
BLog.LOGE("LauncherHome Saved hli size >>> ${hli.first().lon}")
} }
).also { fli -> ).also { fli ->
BLog.LOGE("LauncherHome Saved fli size >>> ${fli.size}") BLog.LOGE("LauncherHome Saved fli size >>> ${fli.size}")
BLog.LOGE("LauncherHome Saved hli size >>> ${fli.first().lat}")
BLog.LOGE("LauncherHome Saved hli size >>> ${fli.first().lon}")
} }
) )
} else { } else {

View File

@ -2,26 +2,24 @@ package rasel.lunar.launcher.home.adapters
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.Color import android.graphics.Color
import android.support.annotation.ColorInt
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.realm.kotlin.ext.toRealmList
import rasel.lunar.launcher.R import rasel.lunar.launcher.R
import rasel.lunar.launcher.home.adapters.WeatherAdapter.ViewHolder import rasel.lunar.launcher.home.adapters.WeatherAdapter.ViewHolder
import rasel.lunar.launcher.model.Forecastday import rasel.lunar.launcher.model.Day
import rasel.lunar.launcher.model.Hour import rasel.lunar.launcher.model.Hour
import rasel.lunar.launcher.model.WeatherForcast
import rasel.lunar.launcher.utils.BLog import rasel.lunar.launcher.utils.BLog
import java.time.Instant import java.time.Instant
import java.time.ZoneId import java.time.ZoneId
import java.util.Calendar
import java.util.Date
class WeatherAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.Adapter<ViewHolder>(){ class WeatherAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.Adapter<ViewHolder>(){
var isChangedAmOrPm: Boolean = true var isChangedAmOrPm: Boolean = true
var day: Int = 0
class ViewHolder(view: View): RecyclerView.ViewHolder(view) { class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
val viewItem: View val viewItem: View
@ -54,10 +52,15 @@ class WeatherAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.Adapter
return ViewHolder(view) return ViewHolder(view)
} }
fun getToday() = Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val data = dataSet[position] as? Hour val data = dataSet[position] as? Hour
BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}") BLog.LOGE("saved weatherForcast >>> asFlow ${dataSet.size}")
// val today = Calendar.getInstance()
// today.time = Date(data?.time_epoch?.toLong()?.times(1000L) ?: 0L)
// val dayOfItem = today.get(Calendar.DAY_OF_YEAR)
data?.let { data?.let {
holder.viewItem.findViewById<TextView>(R.id.amOrPm) holder.viewItem.findViewById<TextView>(R.id.amOrPm)
.apply { .apply {
@ -75,14 +78,13 @@ class WeatherAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.Adapter
} }
holder.viewItem.findViewById<TextView>(R.id.hour) holder.viewItem.findViewById<TextView>(R.id.hour)
.apply { .apply {
this.isSelected = (System.currentTimeMillis() % 3 == 0L)
Instant.ofEpochSecond(it.time_epoch.toLong()) Instant.ofEpochSecond(it.time_epoch.toLong())
.atZone(ZoneId.systemDefault()) .atZone(ZoneId.systemDefault())
.run { .run {
if (this.hour == 0) { if (this.hour == 0) {
this@apply.setTextColor(Color.BLACK) this@apply.setTextColor(Color.BLACK)
this@apply.isSelected = true this@apply.isSelected = true
this@apply.text = when (day++) { this@apply.text = when (this.dayOfYear - getToday()) {
1 -> "내일" 1 -> "내일"
2 -> "모레" 2 -> "모레"
3 -> "글피" 3 -> "글피"
@ -94,13 +96,34 @@ class WeatherAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.Adapter
this@apply.text = "${this.hour}" this@apply.text = "${this.hour}"
} }
} }
holder.viewItem.findViewById<ImageView>(R.id.imgDress)
.run { this.setImageResource(R.drawable.ico_time) }
holder.viewItem.findViewById<TextView>(R.id.temperature)
.run {
this.text = "${it.temp_c}"
}
} }
var img: Int? = null
var textDress: String? = null
if (it.temp_c >= 23) {
img = R.drawable.dress_short_sleeves
textDress = "반팔"
} else if ((23 > it.temp_c) && (it.temp_c >= 20)) {
img = R.drawable.dress_long_sleeves
textDress = "긴팔"
} else if ((20 > it.temp_c) && (it.temp_c >= 17)) {
img = R.drawable.dress_knitwear
textDress = "니트"
} else if ((17 > it.temp_c) && (it.temp_c >= 12)) {
img = R.drawable.dress_flimsy_outer
textDress = "얇은겉옷"
} else if ((12 > it.temp_c) && (it.temp_c >= 6)) {
img = R.drawable.dress_heavy_outer
textDress = "두꺼운겉옷"
} else {
img = R.drawable.dress_padded_coat
textDress = "패딩"
}
holder.viewItem.findViewById<ImageView>(R.id.imgDress)
.setImageResource(img ?: R.drawable.dress_padded_coat)
holder.viewItem.findViewById<TextView>(R.id.textDress)
.text = textDress
holder.viewItem.findViewById<TextView>(R.id.temperature)
.text = "${it.temp_c}"
} }
} }

View File

@ -8,6 +8,9 @@ import io.realm.kotlin.types.annotations.PrimaryKey
class WeatherForcast: RealmObject { class WeatherForcast: RealmObject {
@PrimaryKey
var isOnlyKey = "isOnlyKey"
var location: Location? = null var location: Location? = null
var current: Current? = null var current: Current? = null
var forecast: Forecast? = null var forecast: Forecast? = null
@ -133,6 +136,9 @@ class Astro: RealmObject {
} }
class Hour: RealmObject { class Hour: RealmObject {
var lat = 0.0
var lon = 0.0
@PrimaryKey @PrimaryKey
var time_epoch = 0 var time_epoch = 0
var time: String? = null var time: String? = null

View File

@ -8,6 +8,7 @@ import com.google.android.gms.location.LocationServices
import com.google.android.gms.location.Priority import com.google.android.gms.location.Priority
import com.google.android.gms.tasks.CancellationTokenSource import com.google.android.gms.tasks.CancellationTokenSource
import io.realm.kotlin.UpdatePolicy import io.realm.kotlin.UpdatePolicy
import io.realm.kotlin.ext.asFlow
import io.realm.kotlin.ext.query import io.realm.kotlin.ext.query
import rasel.lunar.launcher.model.WeatherForcast import rasel.lunar.launcher.model.WeatherForcast
import rasel.lunar.launcher.utils.BLog import rasel.lunar.launcher.utils.BLog
@ -22,16 +23,17 @@ import retrofit2.http.Query
class OpenWeatherGetter(context: Context, workerParams: WorkerParameters) : BaseGetter(context, workerParams) { class OpenWeatherGetter(context: Context, workerParams: WorkerParameters) : BaseGetter(context, workerParams) {
companion object { companion object {
val TAG = "OpenWeatherGetter" val TAG = "OpenWeatherGetter"
var lon: Double? = null // 경도
var lat: Double? = null // 위도
} }
////////////////////////////////////////// //////////////////////////////////////////
// weatherapi // weatherapi
val VER_WEATHERAPI = "v1" val VER_WEATHERAPI = "v1"
val URI_WEATHERAPI = "https://api.weatherapi.com" val URI_WEATHERAPI = "https://api.weatherapi.com"
val KEY_WEATHERAPI = "8133d83d23ab4175a4160624241909" val KEY_WEATHERAPI = "8133d83d23ab4175a4160624241909"
val DAYS = 2 val DAYS = 3
////////////////////////////////////////// //////////////////////////////////////////
var lon: Double? = null // 경도
var lat: Double? = null // 위도
////////////////////////////////////////// //////////////////////////////////////////
override fun realWork(): Result { override fun realWork(): Result {
@ -48,6 +50,7 @@ class OpenWeatherGetter(context: Context, workerParams: WorkerParameters) : Base
} }
fun getWeather(latitude: Double, longitude: Double) { fun getWeather(latitude: Double, longitude: Double) {
BLog.LOGE("into getWeather")
Retrofit.Builder() Retrofit.Builder()
.baseUrl(URI_WEATHERAPI) .baseUrl(URI_WEATHERAPI)
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create())
@ -59,14 +62,22 @@ class OpenWeatherGetter(context: Context, workerParams: WorkerParameters) : Base
q = "$latitude,$longitude", q = "$latitude,$longitude",
days = DAYS.toString() days = DAYS.toString()
)?.execute()?.let { response -> )?.execute()?.let { response ->
BLog.LOGE("into getWeather afterc excute")
BLog.LOGE("weatherApi forecast response >>> $response") BLog.LOGE("weatherApi forecast response >>> $response")
response.body()?.let { weatherInfo -> response.body()?.let { weatherInfo ->
BLog.LOGE("into getWeather on body ")
weatherInfo.readyForSaving()
weatherInfo.forecast?.forecastdayRealm?.forEach {
it.hourRealm.forEach {h ->
h.lat = lat ?: 0.0
h.lon = lon ?: 0.0
}
}
// Realm에 저장 // Realm에 저장
WorkersDb.getRealm().writeBlocking { WorkersDb.getRealm().writeBlocking {
weatherInfo.readyForSaving()
copyToRealm(weatherInfo, UpdatePolicy.ALL) copyToRealm(weatherInfo, UpdatePolicy.ALL)
} }
BLog.LOGE("saved weatherForcast >>> ${WorkersDb.getRealm().query<WeatherForcast>().first().find()}") BLog.LOGE("saved weatherForcast >>> ${WorkersDb.getRealm().query<WeatherForcast>().first().find()?.forecast?.forecastdayRealm?.size}")
} }
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 B

View File

@ -10,7 +10,6 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="오후"
android:id="@+id/amOrPm" android:id="@+id/amOrPm"
android:gravity="center" android:gravity="center"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
@ -18,7 +17,6 @@
<TextView <TextView
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="16시"
android:id="@+id/hour" android:id="@+id/hour"
android:background="@drawable/date_bg" android:background="@drawable/date_bg"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
@ -29,16 +27,22 @@
android:id="@+id/imgDress" android:id="@+id/imgDress"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:contentDescription="시계 아이콘" android:contentDescription="온도별 옷차림"
app:srcCompat="@drawable/ico_time" /> app:tint="@android:color/white"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textDress"
android:fontFamily="sans-serif-light"
android:textSize="11sp"
android:gravity="center"
android:textAlignment="center"/>
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="27도"
android:id="@+id/temperature" android:id="@+id/temperature"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:textSize="14sp" android:textSize="14sp"
android:gravity="center" android:gravity="center"
android:textAlignment="center"/> android:textAlignment="center"/>
</LinearLayout> </LinearLayout>

View File

@ -21,7 +21,8 @@
android:contentDescription="시계 아이콘" android:contentDescription="시계 아이콘"
app:srcCompat="@drawable/ico_time" app:srcCompat="@drawable/ico_time"
tools:ignore="ImageContrastCheck" tools:ignore="ImageContrastCheck"
android:layout_marginLeft="20dp"/> android:layout_marginLeft="20dp"
app:tint="@android:color/white" />
<TextView <TextView
android:id="@+id/textView2" android:id="@+id/textView2"
android:layout_width="wrap_content" android:layout_width="wrap_content"