diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd45b12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/caches/build_file_checksums.ser +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2ce9f65 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/hoc/weatherapp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/hoc/weatherapp/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..5e98d34 --- /dev/null +++ b/app/src/androidTest/java/com/hoc/weatherapp/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.hoc.weatherapp + +import androidx.test.InstrumentationRegistry +import androidx.test.runner.AndroidJUnit4 +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getTargetContext() + assertEquals("com.hoc.weatherapp", appContext.packageName) + } +} diff --git a/app/src/debug/res/values/google_maps_api.xml b/app/src/debug/res/values/google_maps_api.xml new file mode 100644 index 0000000..aa873ff --- /dev/null +++ b/app/src/debug/res/values/google_maps_api.xml @@ -0,0 +1,3 @@ + + AIzaSyBVXCW_pu8JlQAWwEJg6RcyuywGnAXPvx4 + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2df8cb2 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/AddCityActivity.kt b/app/src/main/java/com/hoc/weatherapp/AddCityActivity.kt new file mode 100644 index 0000000..96ff4ec --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/AddCityActivity.kt @@ -0,0 +1,320 @@ +package com.hoc.weatherapp + +import android.Manifest.permission.ACCESS_COARSE_LOCATION +import android.Manifest.permission.ACCESS_FINE_LOCATION +import android.app.Activity +import android.content.Intent +import android.content.IntentSender +import android.content.pm.PackageManager.PERMISSION_GRANTED +import android.location.Geocoder +import android.location.Location +import android.os.Bundle +import android.view.MenuItem +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.google.android.gms.common.api.GoogleApiClient +import com.google.android.gms.common.api.Status +import com.google.android.gms.location.LocationRequest +import com.google.android.gms.location.LocationRequest.PRIORITY_HIGH_ACCURACY +import com.google.android.gms.location.LocationServices +import com.google.android.gms.location.LocationSettingsRequest +import com.google.android.gms.location.LocationSettingsStatusCodes +import com.google.android.gms.location.places.Place +import com.google.android.gms.location.places.ui.PlaceSelectionListener +import com.google.android.gms.location.places.ui.SupportPlaceAutocompleteFragment +import com.hoc.weatherapp.data.City +import com.hoc.weatherapp.data.Weather +import com.hoc.weatherapp.data.WeatherRepository +import com.hoc.weatherapp.utils.debug +import com.hoc.weatherapp.utils.toast +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.addTo +import io.reactivex.rxkotlin.subscribeBy +import io.reactivex.schedulers.Schedulers +import kotlinx.android.synthetic.main.activity_add_city.* +import kotlinx.android.synthetic.main.some_city_layout.* +import org.koin.android.ext.android.inject +import java.util.* + +class AddCityActivity : AppCompatActivity() { + private val fusedLocationProviderClient by lazy(LazyThreadSafetyMode.NONE) { + LocationServices.getFusedLocationProviderClient(this@AddCityActivity) + } + private val sharedPrefUtil by inject() + private val weatherRepository by inject() + + private val compositeDisposable = CompositeDisposable() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_add_city) + + setSupportActionBar(toolbar) + supportActionBar?.run { + setDisplayHomeAsUpEnabled(true) + title = "Add a city" + } + + enableGps() + + button_my_loc.setOnClickListener { + getCurrentLocation() + } + + val autocompleteFragment = + supportFragmentManager.findFragmentById(R.id.place_autocomplete_fragment) + as SupportPlaceAutocompleteFragment + autocompleteFragment.run { + setHint("Search city") + setOnPlaceSelectedListener(object : PlaceSelectionListener { + override fun onPlaceSelected(place: Place?) { + val id = place?.id + val latitude = place?.latLng?.latitude + val longitude = place?.latLng?.longitude + + if (id !== null && latitude != null && longitude != null) { + addLocationFromAutoCompleteFragment(id, latitude, longitude) + } + } + + override fun onError(status: Status?) {} + }) + } + } + + private fun addLocationFromAutoCompleteFragment(id: String, lat: Double, lng: Double) { + debug("Id1 = $id") + getCityInformation(lat, lng) + } + + private fun enableGps() { + val googleApiClient = GoogleApiClient.Builder(this) + .addApi(LocationServices.API) + .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks { + override fun onConnected(p0: Bundle?) { + } + + override fun onConnectionSuspended(p0: Int) { + } + }) + .addOnConnectionFailedListener { + + } + .build() + .apply { + connect() + } + val locationRequest = LocationRequest() + .apply { + priority = PRIORITY_HIGH_ACCURACY + interval = 30 * 1_000 + fastestInterval = 5 * 1_000 + } + val builder = LocationSettingsRequest.Builder() + .addLocationRequest(locationRequest) + .setAlwaysShow(true) + @Suppress("DEPRECATION") + LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build()) + .setResultCallback { + val status = it.status + when (status.statusCode) { + LocationSettingsStatusCodes.SUCCESS -> { + if (ContextCompat.checkSelfPermission( + this, + ACCESS_FINE_LOCATION + ) != PERMISSION_GRANTED + && ContextCompat.checkSelfPermission( + this, + ACCESS_COARSE_LOCATION + ) != PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions( + this, + arrayOf(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), + LOCATION_PERMISSION_RC1 + ) + } else { + getNearCity() + } + } + LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> { + try { + status.startResolutionForResult(this, REQUEST_CHECK_SETTINGS) + } catch (e: IntentSender.SendIntentException) { + + } + } + LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> { + } + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (resultCode) { + REQUEST_CHECK_SETTINGS -> { + when (resultCode) { + Activity.RESULT_OK -> { + if (ContextCompat.checkSelfPermission( + this, + ACCESS_FINE_LOCATION + ) != PERMISSION_GRANTED + && ContextCompat.checkSelfPermission( + this, + ACCESS_COARSE_LOCATION + ) != PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions( + this, + arrayOf(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), + LOCATION_PERMISSION_RC1 + ) + } else { + getNearCity() + } + } + Activity.RESULT_CANCELED -> { + enableGps() + } + } + } + } + } + + private fun getNearCity() { + if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) != PERMISSION_GRANTED + && ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) != PERMISSION_GRANTED + ) return + + fusedLocationProviderClient.lastLocation + .addOnSuccessListener { + when (it) { + null -> toast("Can't get location. Please enable GPS") + else -> { + Geocoder(this, Locale.getDefault()) + .getFromLocation( + it.latitude, + it.longitude, + 1 + ) + .firstOrNull() + ?.countryCode + ?.let(::getCityByCountryCode) + } + } + } + .addOnFailureListener { + + } + } + + private fun getCityByCountryCode(country: String) {} + + private fun getCurrentLocation() { + if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) != PERMISSION_GRANTED + && ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) != PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions( + this, + arrayOf(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), + LOCATION_PERMISSION_RC2 + ) + } else { + getLastLocation() + } + } + + private fun getLastLocation() { + if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) != PERMISSION_GRANTED + && ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) != PERMISSION_GRANTED + ) return + + fusedLocationProviderClient.lastLocation + .addOnSuccessListener { location: Location? -> + when { + location === null -> toast("Can't get location. Please enable GPS") + else -> getCityInformation(location.latitude, location.longitude) + } + + } + .addOnFailureListener { + toast(it.message ?: "Unknown error occurred!") + } + } + + private fun getCityInformation(latitude: Double, longitude: Double) { + City(lat = latitude, lng = longitude) + .let(weatherRepository::getCurrentWeatherByCity) + .map(Weather::city) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy( + onError = {}, + onNext = { + debug("Id2 = ${it.id}") + sharedPrefUtil.selectedCity = it + LocalBroadcastManager.getInstance(this@AddCityActivity) + .sendBroadcast( + Intent(ACTION_CHANGED_LOCATION).apply { + putExtra(SELECTED_CITY, it) + } + ) + } + ) + .addTo(compositeDisposable) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + when (requestCode) { + LOCATION_PERMISSION_RC1 -> { + if (grantResults.any { it == PERMISSION_GRANTED }) { + toast("Permission is granted") + getLastLocation() + } else { + toast("Please grant permission to get your location!") + } + } + LOCATION_PERMISSION_RC2 -> { + if (grantResults.firstOrNull() == PERMISSION_GRANTED) { + toast("Permission is granted") + getNearCity() + } else { + toast("Please grant permission to get your location!") + } + } + } + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + return when (item?.itemId) { + android.R.id.home -> { + finish() + true + } + else -> return super.onOptionsItemSelected(item) + + } + } + + override fun onDestroy() { + super.onDestroy() + compositeDisposable.clear() + } + + companion object { + private const val LOCATION_PERMISSION_RC1 = 1 + private const val LOCATION_PERMISSION_RC2 = 2 + private const val REQUEST_CHECK_SETTINGS = 3 + const val ACTION_CHANGED_LOCATION = "ACTION_CHANGED_LOCATION" + const val SELECTED_CITY = "SELECTED_CITY" + } +} diff --git a/app/src/main/java/com/hoc/weatherapp/App.kt b/app/src/main/java/com/hoc/weatherapp/App.kt new file mode 100644 index 0000000..accdbe6 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/App.kt @@ -0,0 +1,38 @@ +package com.hoc.weatherapp + +import android.app.Application +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.os.Build +import com.hoc.weatherapp.koin.dataSourceModule +import com.hoc.weatherapp.koin.retrofitModule +import com.hoc.weatherapp.koin.sharePrefUtilModule +import org.koin.android.ext.android.startKoin + +class App : Application() { + override fun onCreate() { + super.onCreate() + app = this + startKoin(this, listOf(retrofitModule, dataSourceModule, sharePrefUtilModule)) + createNotificationChannel() + } + + private fun createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = NotificationChannel( + CHANNEL_ID, + CHANNEL_NAME, + NotificationManager.IMPORTANCE_HIGH + ).apply { description = "Notification channel of weather app" } + + (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(channel) + } + } + + companion object { + lateinit var app: App + const val CHANNEL_ID = "CHANNEL_ID" + const val CHANNEL_NAME = "CHANNEL_NAME" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/CurrentWeatherFragment.kt b/app/src/main/java/com/hoc/weatherapp/CurrentWeatherFragment.kt new file mode 100644 index 0000000..9281e6f --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/CurrentWeatherFragment.kt @@ -0,0 +1,64 @@ +package com.hoc.weatherapp + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestOptions +import com.hoc.weatherapp.data.Weather +import com.hoc.weatherapp.utils.getIconDrawableFromIconString +import kotlinx.android.synthetic.main.fragment_current_weather.* +import org.koin.android.ext.android.inject +import java.text.SimpleDateFormat +import java.util.* + +class CurrentWeatherFragment : Fragment() { + private val sharedPrefUtil by inject() + private lateinit var mainActivity: MainActivity + + override fun onAttach(context: Context?) { + super.onAttach(context) + mainActivity = context as MainActivity + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = layoutInflater.inflate(R.layout.fragment_current_weather, container, false) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + swipe_refresh_layout.setOnRefreshListener { + mainActivity.getCurrentWeather(sharedPrefUtil.selectedCity) + } + } + + fun updateUi(weather: Weather) { + swipe_refresh_layout.post { + swipe_refresh_layout.isRefreshing = false + } + updateWeatherIcon(weather.icon) + text_temperature.text = "${weather.temperature} \u2103" + text_main_weather.text = weather.main + text_last_update.text = "${sdf.format(weather.dataTime)} update" + } + + private fun updateWeatherIcon(icon: String) { + Glide.with(this) + .load(getIconDrawableFromIconString(icon)) + .apply(RequestOptions.fitCenterTransform().centerCrop()) + .transition(DrawableTransitionOptions.withCrossFade()) + .into(image_icon) + } + + companion object { + @JvmField + val sdf = SimpleDateFormat("dd/MM/yy hh:mm", Locale.US) + } +} + diff --git a/app/src/main/java/com/hoc/weatherapp/LocationActivity.kt b/app/src/main/java/com/hoc/weatherapp/LocationActivity.kt new file mode 100644 index 0000000..3e0187d --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/LocationActivity.kt @@ -0,0 +1,212 @@ +package com.hoc.weatherapp + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.* +import androidx.recyclerview.widget.DividerItemDecoration.VERTICAL +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestOptions.fitCenterTransform +import com.bumptech.glide.request.RequestOptions.placeholderOf +import com.hoc.weatherapp.AddCityActivity.Companion.ACTION_CHANGED_LOCATION +import com.hoc.weatherapp.AddCityActivity.Companion.SELECTED_CITY +import com.hoc.weatherapp.data.City +import com.hoc.weatherapp.data.Weather +import com.hoc.weatherapp.data.WeatherRepository +import com.hoc.weatherapp.utils.debug +import com.hoc.weatherapp.utils.getIconDrawableFromIconString +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.addTo +import io.reactivex.rxkotlin.subscribeBy +import io.reactivex.schedulers.Schedulers +import kotlinx.android.synthetic.main.activity_location.* +import kotlinx.android.synthetic.main.city_item_layout.view.* +import org.koin.android.ext.android.inject + +class CityAdapter(selectedCityId: Long?, private val onClickListener: (City) -> Unit) : ListAdapter(diffCallback) { + var selectedCityId: Long? = selectedCityId + set(value) { + field = value + notifyDataSetChanged() + debug("Change selectedCityId => $value") + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return LayoutInflater.from(parent.context) + .inflate(R.layout.city_item_layout, parent, false) + .let(::ViewHolder) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(getItem(position)) + } + + inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { + private val textName = itemView.text_name!! + private val textWeather = itemView.text_weather + private val imageIconCityItem = itemView.image_icon_city_item + private val radioButtonSelectedCity = itemView.radio_button_selected_city + + init { + itemView.setOnClickListener(this) + } + + override fun onClick(v: View) { + (adapterPosition.takeIf { it != RecyclerView.NO_POSITION } ?: return) + .let(::getItem) + .let(Weather::city) + .let(onClickListener) + } + + fun bind(weather: Weather) { + textName.text = "${weather.city.name} - ${weather.city.country}" + textWeather.text = "${weather.main}, ${weather.temperatureMax} ~ ${weather.temperatureMin}" + radioButtonSelectedCity.isChecked = weather.city.id == selectedCityId + + + Glide.with(itemView.context) + .load(getIconDrawableFromIconString(weather.icon)) + .apply(fitCenterTransform().centerCrop()) + .transition(DrawableTransitionOptions.withCrossFade()) + .apply( + ContextCompat.getColor(itemView.context, R.color.colorPrimaryDark) + .let(::ColorDrawable) + .let(::placeholderOf) + ) + .into(imageIconCityItem) + } + } + + companion object { + @JvmField + val diffCallback = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Weather, newItem: Weather) = oldItem.city.id == newItem.city.id + override fun areContentsTheSame(oldItem: Weather, newItem: Weather) = oldItem == newItem + } + } +} + +class LocationActivity : AppCompatActivity() { + private lateinit var cityAdapter: CityAdapter + private val weatherRepository by inject() + private val compositeDisposable = CompositeDisposable() + private val broadcastReceiver = LocationActivityBroadcastReceiver() + private val sharedPrefUtil by inject() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_location) + + setSupportActionBar(toolbar) + supportActionBar?.run { + setDisplayHomeAsUpEnabled(true) + title = "City" + } + + fab.setOnClickListener { + startActivity(Intent(this, AddCityActivity::class.java)) + } + + recycler_city.run { + setHasFixedSize(true) + layoutManager = LinearLayoutManager(this@LocationActivity) + + cityAdapter = CityAdapter(sharedPrefUtil.selectedCity?.id, ::onItemCityClick) + adapter = cityAdapter + + addItemDecoration(DividerItemDecoration(this@LocationActivity, VERTICAL)) + addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + if (dy > 0) { + fab.hide() + } else { + fab.show() + } + } + }) + } + + LocalBroadcastManager.getInstance(this) + .registerReceiver( + broadcastReceiver, + IntentFilter().apply { + addAction(ACTION_CHANGED_LOCATION) + } + ) + } + + private fun onItemCityClick(city: City) { + cityAdapter.selectedCityId = city.id + sharedPrefUtil.selectedCity = city + + LocalBroadcastManager.getInstance(this@LocationActivity) + .sendBroadcast( + Intent(ACTION_CHANGED_LOCATION).apply { + putExtra(SELECTED_CITY, city) + putExtra("SELF", true) + } + ) + } + + override fun onStart() { + super.onStart() + weatherRepository.getAllWeathers() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy( + onError = {}, + onNext = cityAdapter::submitList + ) + .addTo(compositeDisposable) + } + + override fun onStop() { + super.onStop() + compositeDisposable.clear() + } + + override fun onDestroy() { + super.onDestroy() + LocalBroadcastManager.getInstance(this) + .unregisterReceiver(broadcastReceiver) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + return when (item?.itemId) { + android.R.id.home -> { + finish() + true + } + else -> return super.onOptionsItemSelected(item) + + } + } + + inner class LocationActivityBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + ACTION_CHANGED_LOCATION -> { + if (!intent.getBooleanExtra("SELF", false)) { + val city = intent.getParcelableExtra(SELECTED_CITY) + cityAdapter.selectedCityId = city?.id + sharedPrefUtil.selectedCity = city + } + } + } + } + } + +} diff --git a/app/src/main/java/com/hoc/weatherapp/MainActivity.kt b/app/src/main/java/com/hoc/weatherapp/MainActivity.kt new file mode 100644 index 0000000..80a96fb --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/MainActivity.kt @@ -0,0 +1,261 @@ +package com.hoc.weatherapp + +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.util.Log +import android.view.* +import androidx.annotation.DrawableRes +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.NotificationCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter +import androidx.lifecycle.Observer +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.work.* +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestOptions +import com.hoc.weatherapp.AddCityActivity.Companion.ACTION_CHANGED_LOCATION +import com.hoc.weatherapp.AddCityActivity.Companion.SELECTED_CITY +import com.hoc.weatherapp.App.Companion.CHANNEL_ID +import com.hoc.weatherapp.data.City +import com.hoc.weatherapp.data.Weather +import com.hoc.weatherapp.data.WeatherRepository +import com.hoc.weatherapp.utils.ZoomOutPageTransformer +import com.hoc.weatherapp.utils.blur.GlideBlurTransformation +import com.hoc.weatherapp.utils.debug +import com.hoc.weatherapp.utils.toast +import com.hoc.weatherapp.work.UpdateWeatherWorker +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.addTo +import io.reactivex.rxkotlin.subscribeBy +import io.reactivex.schedulers.Schedulers +import kotlinx.android.synthetic.main.activity_main.* +import org.koin.android.ext.android.inject +import java.util.* +import java.util.concurrent.TimeUnit + +class MainActivity : AppCompatActivity() { + private var pagerAdapter: SectionsPagerAdapter? = null + private val sharedPrefUtil by inject() + private val weatherRepository by inject() + + private val mainActivityBroadcastReceiver = MainActivityBroadcastReceiver() + private lateinit var currentWeatherFragment: CurrentWeatherFragment + + private val compositeDisposable = CompositeDisposable() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + setSupportActionBar(toolbar.apply { + setNavigationIcon(R.drawable.ic_playlist_add_white_24dp) + }) + supportActionBar?.setDisplayShowTitleEnabled(false) + + setupViewPager() + + LocalBroadcastManager.getInstance(this) + .registerReceiver( + mainActivityBroadcastReceiver, + IntentFilter().apply { + addAction(ACTION_CHANGED_LOCATION) + } + ) + + getCurrentWeather(sharedPrefUtil.selectedCity) + } + + override fun onDestroy() { + super.onDestroy() + compositeDisposable.clear() + LocalBroadcastManager.getInstance(this) + .unregisterReceiver(mainActivityBroadcastReceiver) + } + + private fun setupViewPager() { + view_pager.run { + val fragments = listOf( + CurrentWeatherFragment().also { currentWeatherFragment = it }, + PlaceHolderFragment() + ) + adapter = SectionsPagerAdapter(supportFragmentManager, fragments) + .also { pagerAdapter = it } + offscreenPageLimit = 3 + setPageTransformer(true, ZoomOutPageTransformer()) + + dots_indicator.setViewPager(view_pager) + dots_indicator.setDotsClickable(true) + + enableIndicatorAndViewPager() + } + } + + fun enableIndicatorAndViewPager() { + if (sharedPrefUtil.selectedCity !== null) { + dots_indicator.visibility = View.VISIBLE + view_pager.pagingEnable = true + } else { + dots_indicator.visibility = View.INVISIBLE + view_pager.pagingEnable = false + } + } + + private fun showNotification(weather: Weather) { + val builder = NotificationCompat.Builder(this, CHANNEL_ID) + .setSmallIcon(R.mipmap.ic_launcher_round) + .setContentTitle("${weather.city.name} - ${weather.city.country}") + .setContentText("${weather.main}...${weather.temperature} \u2103") + .setAutoCancel(false) + .setOngoing(true) + .setWhen(weather.dataTime.time) + .setPriority(NotificationCompat.PRIORITY_HIGH) + + val resultPendingIntent = PendingIntent.getActivity( + this, + 0, + Intent(applicationContext, MainActivity::class.java), + PendingIntent.FLAG_UPDATE_CURRENT + ) + builder.setContentIntent(resultPendingIntent) + val notificationManager = + getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.notify(UpdateWeatherWorker.NOTIFICATION_ID, builder.build()) + } + + private fun enqueueWorkRequest() { + val workManager = WorkManager.getInstance() + val workRequest = PeriodicWorkRequestBuilder(15, TimeUnit.MINUTES) + .setConstraints( + Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() + ) + .build() + + workManager.enqueueUniquePeriodicWork( + "UNIQ_NAME", + ExistingPeriodicWorkPolicy.REPLACE, + workRequest + ) + workManager.getStatusById(workRequest.id).observe(this, Observer { + if (it != null && it.state.isFinished) { + Log.d("MAIN_TAG", "isFinished") + } + }) + } + + class SectionsPagerAdapter(fm: FragmentManager, private val fragments: List) : + FragmentPagerAdapter(fm) { + override fun getItem(position: Int) = fragments[position] + override fun getCount() = fragments.size + } + + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.menu_main, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + return when (item?.itemId) { + android.R.id.home -> { + startActivity(Intent(this, LocationActivity::class.java)) + true + } + + R.id.action_settings -> { + true + } + else -> super.onOptionsItemSelected(item) + } + } + + private fun updateBackground(icon: String) { + debug(icon) + val random = Random() + + @DrawableRes val background = when (icon) { + "01d" -> R.drawable.sohot + "01n" -> if (random.nextBoolean()) R.drawable.beautifulnight else R.drawable.moon + "02d" -> R.drawable.sun + "02n" -> if (random.nextBoolean()) R.drawable.beautifulnight else R.drawable.moon + "03d" -> R.drawable.default_bg + "03n" -> R.drawable.default_bg + "04d" -> R.drawable.default_bg + "04n" -> R.drawable.default_bg + "09d" -> R.drawable.rainy + "09n" -> R.drawable.rainy + "10d" -> R.drawable.rainy + "10n" -> R.drawable.rainy + "11d" -> R.drawable.rainy + "11n" -> R.drawable.rainy + "13d" -> R.drawable.default_bg + "13n" -> R.drawable.default_bg + "50d" -> R.drawable.default_bg + "50n" -> R.drawable.default_bg + else -> return + } + + + Glide.with(this) + .load(background) + .transition(DrawableTransitionOptions.withCrossFade()) + .apply(RequestOptions.fitCenterTransform().centerCrop()) + .apply(RequestOptions.bitmapTransform(GlideBlurTransformation(this, 20f))) + .into(image_background) + } + + inner class MainActivityBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + ACTION_CHANGED_LOCATION -> { + getCurrentWeather(intent.getParcelableExtra(SELECTED_CITY)) + enableIndicatorAndViewPager() + } + } + } + } + + fun getCurrentWeather(city: City?) { + if (city != null) { + toast("Get current weather...") + weatherRepository.getCurrentWeatherByCity(city) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy( + onError = { toast(it.message ?: "An error occurred") }, + onNext = { + currentWeatherFragment.updateUi(it) + + updateBackground(it.icon) + toolbar_title.text = "${it.city.name} - ${it.city.country}" + + sharedPrefUtil.selectedCity = it.city + showNotification(it) + + toast("Get current weather successfully") + }, + onComplete = ::enqueueWorkRequest + ) + .addTo(compositeDisposable) + } else { + enqueueWorkRequest() + } + } +} + +class PlaceHolderFragment : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = inflater.inflate(R.layout.fragment_current_weather, container, false) +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/MapsActivity.kt b/app/src/main/java/com/hoc/weatherapp/MapsActivity.kt new file mode 100644 index 0000000..1480579 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/MapsActivity.kt @@ -0,0 +1,42 @@ +package com.hoc.weatherapp + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.MarkerOptions + +class MapsActivity : AppCompatActivity(), OnMapReadyCallback { + + private lateinit var mMap: GoogleMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_maps) + // Obtain the SupportMapFragment and get notified when the map is ready to be used. + val mapFragment = supportFragmentManager + .findFragmentById(R.id.map) as SupportMapFragment + mapFragment.getMapAsync(this) + } + + /** + * Manipulates the map once available. + * This callback is triggered when the map is ready to be used. + * This is where we can add markers or lines, add listeners or move the camera. In this case, + * we just add a marker near Sydney, Australia. + * If Google Play services is not installed on the device, the user will be prompted to install + * it inside the SupportMapFragment. This method will only be triggered once the user has + * installed Google Play services and returned to the app. + */ + override fun onMapReady(googleMap: GoogleMap) { + mMap = googleMap + + // Add a marker in Sydney and move the camera + val sydney = LatLng(-34.0, 151.0) + mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney")) + mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)) + } +} diff --git a/app/src/main/java/com/hoc/weatherapp/SharePref.kt b/app/src/main/java/com/hoc/weatherapp/SharePref.kt new file mode 100644 index 0000000..dc76e3a --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/SharePref.kt @@ -0,0 +1,116 @@ +package com.hoc.weatherapp + +import android.content.SharedPreferences +import com.hoc.weatherapp.data.City +import com.squareup.moshi.Moshi +import java.io.IOException +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +class SharedPrefUtil(sharedPreferences: SharedPreferences, private val moshi: Moshi) { + private var hasSelectedCity by sharedPreferences.delegate() + private var seletedCityJsonString by sharedPreferences.delegate() + + var selectedCity: City? + get() = when { + !hasSelectedCity -> null + else -> try { + moshi.adapter(City::class.java).fromJson(seletedCityJsonString) + } catch (e: IOException) { + null + } + } + set(value) = when (value) { + null -> hasSelectedCity = false + else -> { + val json = try { + moshi.adapter(City::class.java).toJson(value) + } catch (e: Exception) { + null + } + if (json == null) { + hasSelectedCity = false + } else { + hasSelectedCity = true + seletedCityJsonString = json + } + } + } +} + +@Suppress("UNCHECKED_CAST") +inline fun SharedPreferences.delegate( + key: String? = null, + default: T? = null +): ReadWriteProperty = when (T::class) { + Int::class -> delegate( + SharedPreferences::getInt, + SharedPreferences.Editor::putInt, + (default as? Int) ?: 0, + key + ) + Long::class -> delegate( + SharedPreferences::getLong, + SharedPreferences.Editor::putLong, + (default as? Long) ?: 0, + key + ) + Float::class -> delegate( + SharedPreferences::getFloat, + SharedPreferences.Editor::putFloat, + (default as? Float) ?: 0f, + key + ) + Double::class -> delegate( + SharedPreferences::getDouble, + SharedPreferences.Editor::putDouble, + (default as? Double) ?: 0.0, + key + ) + Boolean::class -> delegate( + SharedPreferences::getBoolean, + SharedPreferences.Editor::putBoolean, + (default as? Boolean) ?: false, + key + ) + String::class -> delegate( + SharedPreferences::getString, + SharedPreferences.Editor::putString, + (default as? String) ?: "", + key + ) + Set::class -> delegate>( + SharedPreferences::getStringSet, + SharedPreferences.Editor::putStringSet, + (default as? Set<*>)?.filterIsInstanceTo(mutableSetOf()) ?: emptySet(), + key + ) + else -> throw IllegalStateException("Not support for type ${T::class.java.name}") +} as ReadWriteProperty + +@PublishedApi +internal fun SharedPreferences.Editor.putDouble( + key: String, + value: Double +): SharedPreferences.Editor = putLong(key, value.toRawBits()) + +@PublishedApi +internal fun SharedPreferences.getDouble( + key: String, + defaultValue: Double +): Double = Double.fromBits(getLong(key, defaultValue.toRawBits())) + +fun SharedPreferences.delegate( + getter: SharedPreferences.(key: String, defaultValue: T) -> T, + setter: SharedPreferences.Editor.(key: String, value: T) -> SharedPreferences.Editor, + defaultValue: T, + key: String? = null +): ReadWriteProperty { + return object : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = + getter(key ?: property.name, defaultValue) + + override fun setValue(thisRef: Any, property: KProperty<*>, value: T) = + edit().setter(key ?: property.name, value).apply() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/AppDatabase.kt b/app/src/main/java/com/hoc/weatherapp/data/AppDatabase.kt new file mode 100644 index 0000000..12efa16 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/AppDatabase.kt @@ -0,0 +1,33 @@ +package com.hoc.weatherapp.data + +import android.content.Context +import androidx.room.* +import java.util.* + +object Converters { + @JvmStatic + @TypeConverter + fun fromTimestamp(value: Long?): Date? = value?.let(::Date) + + @JvmStatic + @TypeConverter + fun dateToTimestamp(date: Date?): Long? = date?.time +} + +@Database(entities = [Weather::class, City::class], version = 1, exportSchema = false) +@TypeConverters(value = [Converters::class]) +abstract class AppDatabase : RoomDatabase() { + abstract fun weatherDao(): WeatherDao + + companion object { + private const val DATABASE_NAME = "DATABASE_NAME" + + fun getInstance(context: Context): AppDatabase { + return Room.databaseBuilder( + context, + AppDatabase::class.java, + DATABASE_NAME + ).build() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/City.kt b/app/src/main/java/com/hoc/weatherapp/data/City.kt new file mode 100644 index 0000000..e2240bf --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/City.kt @@ -0,0 +1,17 @@ +package com.hoc.weatherapp.data + +import android.os.Parcelable +import androidx.room.Entity +import androidx.room.PrimaryKey +import kotlinx.android.parcel.Parcelize + +@Entity +@Parcelize +data class City( + @PrimaryKey + val id: Long = -1, + val name: String = "", + val country: String = "", + val lat: Double = Double.NEGATIVE_INFINITY, + val lng: Double = Double.NEGATIVE_INFINITY +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/HelperApiService.kt b/app/src/main/java/com/hoc/weatherapp/data/HelperApiService.kt new file mode 100644 index 0000000..4f2ec80 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/HelperApiService.kt @@ -0,0 +1,14 @@ +package com.hoc.weatherapp.data + +import io.reactivex.Flowable +import retrofit2.http.GET +import retrofit2.http.Query + +const val BASE_URL_HELPER = "https://drink-shop.com" + +interface HelperApiService { + @GET + fun getNearbyCityByCountryCode( + @Query("country") countryCode: String + ): Flowable> +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/LocalDataSource.kt b/app/src/main/java/com/hoc/weatherapp/data/LocalDataSource.kt new file mode 100644 index 0000000..e81bdc6 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/LocalDataSource.kt @@ -0,0 +1,22 @@ +package com.hoc.weatherapp.data + +import io.reactivex.Completable +import io.reactivex.Flowable + +class LocalDataSource( + private val weatherDao: WeatherDao +) { + fun getCurrentWeatherById(id: Long): Flowable { + return weatherDao.getCurrentWeatherById(id) + } + + fun insertOrCurrentWeather(weather: Weather): Completable { + return Completable.fromCallable { + weatherDao.upsert(weather) + } + } + + fun getAllWeathers(): Flowable> { + return weatherDao.getAllWeathers() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/Models.kt b/app/src/main/java/com/hoc/weatherapp/data/Models.kt new file mode 100644 index 0000000..69a4b1c --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/Models.kt @@ -0,0 +1,109 @@ +package com.hoc.weatherapp.data + +import com.squareup.moshi.Json + +data class NearCity( + val id: Long, + val name: String, + val country: String, + val coord: Coord +) + +class Clouds( + @Json(name = "all") + val all: Long? = null +) + +class Coord( + @Json(name = "lon") + val lon: Double? = null, + @Json(name = "lat") + val lat: Double? = null +) + +class Main( + @Json(name = "temp") + val temp: Double? = null, + @Json(name = "pressure") + val pressure: Double? = null, + @Json(name = "humidity") + val humidity: Long? = null, + @Json(name = "temp_min") + val tempMin: Double? = null, + @Json(name = "temp_max") + val tempMax: Double? = null +) + +class Sys( + @Json(name = "type") + val type: Long? = null, + @Json(name = "id") + val id: Long? = null, + @Json(name = "message") + val message: Double? = null, + @Json(name = "country") + val country: String? = null, + @Json(name = "sunrise") + val sunrise: Long? = null, + @Json(name = "sunset") + val sunset: Long? = null +) + +class WeatherModel( + @Json(name = "id") + val id: Long? = null, + @Json(name = "main") + val main: String? = null, + @Json(name = "description") + val description: String? = null, + @Json(name = "icon") + val icon: String? = null +) + +class WeatherResponse( + @Json(name = "coord") + val coord: Coord? = null, + @Json(name = "weather") + val weather: List? = null, + @Json(name = "base") + val base: String? = null, + @Json(name = "main") + val main: Main? = null, + @Json(name = "visibility") + val visibility: Long? = null, + @Json(name = "wind") + val wind: Wind? = null, + @Json(name = "clouds") + val clouds: Clouds? = null, + @Json(name = "dt") + val dt: Long? = null, + @Json(name = "sys") + val sys: Sys? = null, + @Json(name = "id") + val id: Long? = null, + @Json(name = "name") + val name: String? = null, + @Json(name = "cod") + val cod: Long? = null, + @Json(name = "rain") + val rain: Rain? = null, + @Json(name = "snow") + val snow: Snow? = null +) + +class Snow( + @Json(name = "3h") + val _3h: Long? = null +) + +class Rain( + @Json(name = "3h") + val _3h: Long? = null +) + +class Wind( + @Json(name = "speed") + val speed: Double? = null, + @Json(name = "deg") + val deg: Double? = null +) diff --git a/app/src/main/java/com/hoc/weatherapp/data/Weather.kt b/app/src/main/java/com/hoc/weatherapp/data/Weather.kt new file mode 100644 index 0000000..b8de086 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/Weather.kt @@ -0,0 +1,24 @@ +package com.hoc.weatherapp.data + +import androidx.room.Embedded +import androidx.room.Entity +import java.util.* + +@Entity(tableName = "weathers", primaryKeys = ["id"]) +data class Weather( + @Embedded val city: City, + val cloudiness: Long, + val main: String, + val description: String, + val icon: String, + val temperature: Double, + val pressure: Double, + val humidity: Long, + val temperatureMin: Double, + val temperatureMax: Double, + val winSpeed: Double, + val winDegrees: Double, + val dataTime: Date, + val rainVolumeForTheLast3Hours: Long, + val snowVolumeForTheLast3Hours: Long +) \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/WeatherApiService.kt b/app/src/main/java/com/hoc/weatherapp/data/WeatherApiService.kt new file mode 100644 index 0000000..9d18848 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/WeatherApiService.kt @@ -0,0 +1,30 @@ +package com.hoc.weatherapp.data + +import io.reactivex.Flowable +import retrofit2.http.GET +import retrofit2.http.Query + +const val BASE_URL = "http://api.openweathermap.org/data/2.5/" +const val APP_ID = "8011ab8a054c3313249763404ac18589" + +enum class TemperatureUnit { + FAHRENHEIT, + CELSIUS, + KELVIN; + + override fun toString() = when (this) { + FAHRENHEIT -> "imperial" + CELSIUS -> "metric" + KELVIN -> "" + } +} + +interface WeatherApiService { + @GET("weather") + fun getCurrentWeatherByLatLng( + @Query("lat") lat: Double, + @Query("lon") lon: Double, + @Query("units") units: TemperatureUnit = TemperatureUnit.CELSIUS, + @Query("appid") appId: String = APP_ID + ): Flowable +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/WeatherDao.kt b/app/src/main/java/com/hoc/weatherapp/data/WeatherDao.kt new file mode 100644 index 0000000..2db26ad --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/WeatherDao.kt @@ -0,0 +1,33 @@ +package com.hoc.weatherapp.data + +import android.database.sqlite.SQLiteConstraintException +import androidx.room.* +import com.hoc.weatherapp.utils.debug +import io.reactivex.Flowable + +@Dao +abstract class WeatherDao { + @Query("SELECT * FROM weathers WHERE id = :id ORDER BY dataTime DESC LIMIT 1") + abstract fun getCurrentWeatherById(id: Long): Flowable + + @Insert(onConflict = OnConflictStrategy.FAIL) + abstract fun insertCurrentWeather(weather: Weather) + + @Update + abstract fun updateCurrentWeather(weather: Weather) + + @Query("SELECT * FROM weathers ORDER BY name") + abstract fun getAllWeathers(): Flowable> + + fun upsert(weather: Weather) { + try { + insertCurrentWeather(weather) + } catch (e: SQLiteConstraintException) { + debug(e, "WeatherDao") + updateCurrentWeather(weather) + } + } + + /*@Query("SELECT COUNT(*) FROM weathers") + abstract fun getCountCity(): Flowable*/ +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/WeatherRepository.kt b/app/src/main/java/com/hoc/weatherapp/data/WeatherRepository.kt new file mode 100644 index 0000000..0c055b4 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/WeatherRepository.kt @@ -0,0 +1,12 @@ +package com.hoc.weatherapp.data + +import io.reactivex.Flowable + +interface WeatherRepository { + + fun getCurrentWeatherByCity(city: City): Flowable + + fun getAllWeathers(): Flowable> + + fun addOrUpdateWeather(weather: Weather): Flowable +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/data/WeatherRepositoryImpl.kt b/app/src/main/java/com/hoc/weatherapp/data/WeatherRepositoryImpl.kt new file mode 100644 index 0000000..1186798 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/data/WeatherRepositoryImpl.kt @@ -0,0 +1,65 @@ +package com.hoc.weatherapp.data + +import com.hoc.weatherapp.utils.debug +import io.reactivex.Flowable +import java.util.* + +fun isValidLat(lat: Double) = lat in -90.0..90.0 + +fun isValidLng(lng: Double) = lng in -180.0..180.0 + +fun isValidLatLng(lat: Double, lng: Double) = isValidLat(lat) && isValidLng(lng) + +class WeatherRepositoryImpl( + private val weatherApiService: WeatherApiService, + private val localDataSource: LocalDataSource +) : WeatherRepository { + override fun addOrUpdateWeather(weather: Weather): Flowable { + return localDataSource.insertOrCurrentWeather(weather) + .andThen(Flowable.just(weather)) + } + + override fun getAllWeathers(): Flowable> { + return localDataSource.getAllWeathers() + } + + override fun getCurrentWeatherByCity(city: City): Flowable { + return Flowable.just(isValidLatLng(city.lat, city.lng)) + .filter { it } + .flatMap { + weatherApiService.getCurrentWeatherByLatLng(city.lat, city.lng).map { + it.run { + Weather( + city = City( + id = id ?: -1, + name = name ?: "No name", + country = sys?.country ?: "No country", + lng = coord?.lon ?: Double.NEGATIVE_INFINITY, + lat = coord?.lat ?: Double.NEGATIVE_INFINITY + ), + cloudiness = clouds?.all ?: 0, + main = weather?.first()?.main ?: "No main weather", + description = weather?.first()?.description ?: "No description", + icon = weather?.first()?.icon ?: "", + temperature = main?.temp ?: 0.0, + pressure = main?.pressure ?: 0.0, + humidity = main?.humidity ?: 0, + temperatureMin = main?.tempMin ?: 0.0, + temperatureMax = main?.tempMax ?: 0.0, + winSpeed = wind?.speed ?: 0.0, + winDegrees = wind?.deg ?: 0.0, + dataTime = Date((dt ?: 0) * 1_000), + snowVolumeForTheLast3Hours = snow?._3h ?: 0L, + rainVolumeForTheLast3Hours = rain?._3h ?: 0L + ) + } + } + } + .flatMap(::addOrUpdateWeather) + .onErrorResumeNext { _: Throwable -> + localDataSource.getCurrentWeatherById(city.id) + } + .doOnNext { debug(it.toString()) } + .onBackpressureLatest() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/koin/DataSourceModule.kt b/app/src/main/java/com/hoc/weatherapp/koin/DataSourceModule.kt new file mode 100644 index 0000000..339e277 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/koin/DataSourceModule.kt @@ -0,0 +1,18 @@ +package com.hoc.weatherapp.koin + +import com.hoc.weatherapp.data.AppDatabase +import com.hoc.weatherapp.data.LocalDataSource +import com.hoc.weatherapp.data.WeatherRepository +import com.hoc.weatherapp.data.WeatherRepositoryImpl +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module.module + +val dataSourceModule = module { + single { WeatherRepositoryImpl(get(), get()) } bind WeatherRepository::class + + single { AppDatabase.getInstance(androidContext()) } + + single { get().weatherDao() } + + single { LocalDataSource(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/koin/RetrofitModule.kt b/app/src/main/java/com/hoc/weatherapp/koin/RetrofitModule.kt new file mode 100644 index 0000000..991eb5c --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/koin/RetrofitModule.kt @@ -0,0 +1,60 @@ +package com.hoc.weatherapp.koin + +import com.hoc.weatherapp.BuildConfig +import com.hoc.weatherapp.data.BASE_URL +import com.hoc.weatherapp.data.BASE_URL_HELPER +import com.hoc.weatherapp.data.HelperApiService +import com.hoc.weatherapp.data.WeatherApiService +import com.squareup.moshi.Moshi +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import org.koin.dsl.module.module +import retrofit2.Retrofit +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory +import retrofit2.converter.moshi.MoshiConverterFactory + +const val WEATHER_RETROFIT = "WEATHER_RETROFIT" +const val HELPER_RETROFIT = "HELPER_RETROFIT" + +val retrofitModule = module { + single { + OkHttpClient.Builder() + .apply { + if (BuildConfig.DEBUG) { + HttpLoggingInterceptor() + .setLevel(HttpLoggingInterceptor.Level.BODY) + .let(::addInterceptor) + } + } + .build() + } + + single { + Moshi.Builder() + .add(com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory()) + .build() + } + + single(name = WEATHER_RETROFIT) { + Retrofit.Builder() + .baseUrl(BASE_URL) + .client(get()) + .addConverterFactory(MoshiConverterFactory.create(get())) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build() + } + + + single { get(name = WEATHER_RETROFIT).create(WeatherApiService::class.java) } + + single(name = HELPER_RETROFIT) { + Retrofit.Builder() + .baseUrl(BASE_URL_HELPER) + .client(get()) + .addConverterFactory(MoshiConverterFactory.create(get())) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build() + } + + single { get(name = HELPER_RETROFIT).create(HelperApiService::class.java) } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/koin/SharePrefUtilModule.kt b/app/src/main/java/com/hoc/weatherapp/koin/SharePrefUtilModule.kt new file mode 100644 index 0000000..6235333 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/koin/SharePrefUtilModule.kt @@ -0,0 +1,12 @@ +package com.hoc.weatherapp.koin + +import android.preference.PreferenceManager +import com.hoc.weatherapp.SharedPrefUtil +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module.module + +val sharePrefUtilModule = module { + single { + SharedPrefUtil(PreferenceManager.getDefaultSharedPreferences(androidContext()), get()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/utils/BackgroundUtil.kt b/app/src/main/java/com/hoc/weatherapp/utils/BackgroundUtil.kt new file mode 100644 index 0000000..9833d71 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/utils/BackgroundUtil.kt @@ -0,0 +1,33 @@ +package com.hoc.weatherapp.utils + +import androidx.annotation.DrawableRes +import com.hoc.weatherapp.R + +@DrawableRes +fun getIconDrawableFromIconString(icon: String): Int { + return when (icon) { + "01d" -> R.drawable.clear_daytime + "01n" -> R.drawable.nt_clear_nighttime + "02d" -> R.drawable.partlycloudy_daytime + "02n" -> R.drawable.nt_partlycloudy_nighttime + "03d" -> R.drawable.cloudy_daytime + "03n" -> R.drawable.nt_cloudy_nighttime + "04d" -> R.drawable.cloudy_daytime + "04n" -> R.drawable.nt_cloudy_nighttime + "09d" -> R.drawable.chancerain_daytime + "09n" -> R.drawable.nt_chancerain_nighttime + "10d" -> R.drawable.rain_daytime + "10n" -> R.drawable.nt_rain_nighttime + "11d" -> R.drawable.tstorms_daytime + "11n" -> R.drawable.nt_tstorms_nighttime + "13d" -> R.drawable.snow_daytime + "13n" -> R.drawable.nt_snow_nighttime + "50d" -> R.drawable.fog_daytime + "50n" -> R.drawable.nt_fog_nighttime + else -> TODO() + } +} + +fun getBackground() { + TODO() +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/utils/CustomViewPager.kt b/app/src/main/java/com/hoc/weatherapp/utils/CustomViewPager.kt new file mode 100644 index 0000000..298c613 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/utils/CustomViewPager.kt @@ -0,0 +1,23 @@ +package com.hoc.weatherapp.utils + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import androidx.viewpager.widget.ViewPager + +class CustomViewPager @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : ViewPager(context, attrs) { + var pagingEnable = false + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(ev: MotionEvent?): Boolean { + return pagingEnable && super.onTouchEvent(ev) + } + + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + return pagingEnable && super.onInterceptTouchEvent(ev) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/utils/ExtensionsFun.kt b/app/src/main/java/com/hoc/weatherapp/utils/ExtensionsFun.kt new file mode 100644 index 0000000..fa30df8 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/utils/ExtensionsFun.kt @@ -0,0 +1,15 @@ +package com.hoc.weatherapp.utils + +import android.content.Context +import android.util.Log +import android.widget.Toast + +fun Context.toast(message: CharSequence): Toast = Toast.makeText( + this, + message, + Toast.LENGTH_SHORT +).also(Toast::show) + +inline fun T.debug(msg: Any?, tag: String? = null) { + Log.d(tag ?: this::class.java.simpleName, msg.toString()) +} diff --git a/app/src/main/java/com/hoc/weatherapp/utils/ZoomOutPageTransformer.kt b/app/src/main/java/com/hoc/weatherapp/utils/ZoomOutPageTransformer.kt new file mode 100644 index 0000000..c0ef0d9 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/utils/ZoomOutPageTransformer.kt @@ -0,0 +1,46 @@ +package com.hoc.weatherapp.utils + +import android.view.View +import androidx.viewpager.widget.ViewPager +import kotlin.math.absoluteValue + +class ZoomOutPageTransformer : ViewPager.PageTransformer { + override fun transformPage(view: View, position: Float) { + val pageWidth = view.width + val pageHeight = view.height + + when { + position < -1 -> // [-Infinity,-1) + // This page is way off-screen to the left. + view.alpha = 0f + position <= 1 -> { // [-1,1] + // Modify the default slide transition to shrink the page as well + val scaleFactor = maxOf(MIN_SCALE, 1 - position.absoluteValue) + val vertMargin = pageHeight * (1 - scaleFactor) / 2 + val horzMargin = pageWidth * (1 - scaleFactor) / 2 + view.run { + translationX = if (position < 0) { + horzMargin - vertMargin / 2 + } else { + -horzMargin + vertMargin / 2 + } + + // Scale the page down (between MIN_SCALE and 1) + scaleX = scaleFactor + scaleY = scaleFactor + + // Fade the page relative to its size. + alpha = MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA) + } + } + else -> // (1,+Infinity] + // This page is way off-screen to the right. + view.alpha = 0f + } + } + + companion object { + private const val MIN_SCALE = 0.85f + private const val MIN_ALPHA = 0.5f + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hoc/weatherapp/utils/blur/BlurImageUtil.kt b/app/src/main/java/com/hoc/weatherapp/utils/blur/BlurImageUtil.kt new file mode 100644 index 0000000..20b77e2 --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/utils/blur/BlurImageUtil.kt @@ -0,0 +1,44 @@ +package com.hoc.weatherapp.utils.blur + +import android.content.Context +import android.graphics.Bitmap +import android.renderscript.Allocation +import android.renderscript.Element +import android.renderscript.RenderScript +import android.renderscript.ScriptIntrinsicBlur + +object BlurImageUtil { + fun blurRenderScript(bitmap: Bitmap, radius: Float, context: Context): Bitmap { + val applicationContext = context.applicationContext + var rsContext: RenderScript? = null + + try { + val output = Bitmap.createBitmap( + bitmap.width, + bitmap.height, + Bitmap.Config.ARGB_8888 + ) + + // Create a RenderScript context. + rsContext = RenderScript.create(applicationContext, RenderScript.ContextType.NORMAL) + + // Creates a RenderScript allocation for the blurred result. + val inAlloc = Allocation.createFromBitmap(rsContext, bitmap) + val outAlloc = Allocation.createTyped(rsContext, inAlloc.type) + + // Use the ScriptIntrinsicBlur intrinsic. + ScriptIntrinsicBlur.create(rsContext, Element.U8_4(rsContext)) + .run { + setRadius(radius) + setInput(inAlloc) + forEach(outAlloc) + } + + // Copy to the output bitmap from the allocation. + outAlloc.copyTo(output) + return output + } finally { + rsContext?.finish() + } + } +} diff --git a/app/src/main/java/com/hoc/weatherapp/utils/blur/GlideBlurTransformation.kt b/app/src/main/java/com/hoc/weatherapp/utils/blur/GlideBlurTransformation.kt new file mode 100644 index 0000000..fda2e1e --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/utils/blur/GlideBlurTransformation.kt @@ -0,0 +1,27 @@ +package com.hoc.weatherapp.utils.blur + +import android.content.Context +import android.graphics.Bitmap +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation +import java.security.MessageDigest + +class GlideBlurTransformation(private val context: Context, private val radius: Float) : BitmapTransformation() { + override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap { + return BlurImageUtil.blurRenderScript(toTransform, radius, context) + } + + override fun updateDiskCacheKey(messageDigest: MessageDigest) { + messageDigest.update(("$ID$radius").toByteArray(CHARSET)) + } + + override fun equals(other: Any?): Boolean = + this === other || radius == (other as? GlideBlurTransformation)?.radius + + override fun hashCode(): Int = 31 * radius.hashCode() + ID.hashCode() + + + companion object { + private const val ID = "com.hoc.weatherapp.utils.blur.GlideBlurTransformation" + } +} diff --git a/app/src/main/java/com/hoc/weatherapp/work/UpdateWeatherWorker.kt b/app/src/main/java/com/hoc/weatherapp/work/UpdateWeatherWorker.kt new file mode 100644 index 0000000..317db0f --- /dev/null +++ b/app/src/main/java/com/hoc/weatherapp/work/UpdateWeatherWorker.kt @@ -0,0 +1,66 @@ +package com.hoc.weatherapp.work + +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import androidx.core.app.NotificationCompat +import androidx.work.Worker +import com.hoc.weatherapp.App +import com.hoc.weatherapp.MainActivity +import com.hoc.weatherapp.R +import com.hoc.weatherapp.SharedPrefUtil +import com.hoc.weatherapp.data.Weather +import com.hoc.weatherapp.data.WeatherRepository +import com.hoc.weatherapp.utils.debug +import org.koin.standalone.KoinComponent +import org.koin.standalone.inject + +class UpdateWeatherWorker : Worker(), KoinComponent { + private val weatherDataSource by inject() + private val sharePrefUtil by inject() + + override fun doWork(): Result { + val city = sharePrefUtil.selectedCity + return if (city != null) { + try { + val weather = weatherDataSource + .getCurrentWeatherByCity(city) + .blockingFirst() + debug("UpdateWeatherWorker::doWork $weather", "MAIN_TAG") + showNotification(weather) + Result.SUCCESS + } catch (e: Exception) { + Result.FAILURE + } + } else { + Result.FAILURE + } + } + + private fun showNotification(weather: Weather) { + val builder = NotificationCompat.Builder(applicationContext, App.CHANNEL_ID) + .setSmallIcon(R.mipmap.ic_launcher_round) + .setContentTitle("${weather.city.name} - ${weather.city.country}") + .setContentText("${weather.main}...${weather.temperature} \u2103") + .setAutoCancel(false) + .setOngoing(true) + .setWhen(weather.dataTime.time) + .setPriority(NotificationCompat.PRIORITY_HIGH) + + val resultPendingIntent = PendingIntent.getActivity( + applicationContext, + 0, + Intent(applicationContext, MainActivity::class.java), + PendingIntent.FLAG_UPDATE_CURRENT + ) + builder.setContentIntent(resultPendingIntent) + val notificationManager = + applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.notify(NOTIFICATION_ID, builder.build()) + } + + companion object { + const val NOTIFICATION_ID = 2 + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/beautifulnight.png b/app/src/main/res/drawable-hdpi/beautifulnight.png new file mode 100644 index 0000000..a4bd797 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/beautifulnight.png differ diff --git a/app/src/main/res/drawable-hdpi/blood.png b/app/src/main/res/drawable-hdpi/blood.png new file mode 100644 index 0000000..f68b3fc Binary files /dev/null and b/app/src/main/res/drawable-hdpi/blood.png differ diff --git a/app/src/main/res/drawable-hdpi/chanceflurries_daytime.png b/app/src/main/res/drawable-hdpi/chanceflurries_daytime.png new file mode 100644 index 0000000..209d110 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/chanceflurries_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/chancerain_daytime.png b/app/src/main/res/drawable-hdpi/chancerain_daytime.png new file mode 100644 index 0000000..35def76 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/chancerain_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/chancesleet_daytime.png b/app/src/main/res/drawable-hdpi/chancesleet_daytime.png new file mode 100644 index 0000000..3366a53 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/chancesleet_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/chancesnow_daytime.png b/app/src/main/res/drawable-hdpi/chancesnow_daytime.png new file mode 100644 index 0000000..90946e4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/chancesnow_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/chancetstorms_daytime.png b/app/src/main/res/drawable-hdpi/chancetstorms_daytime.png new file mode 100644 index 0000000..b84c874 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/chancetstorms_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/clear_daytime.png b/app/src/main/res/drawable-hdpi/clear_daytime.png new file mode 100644 index 0000000..c3dde3d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/clear_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/cloudy_daytime.png b/app/src/main/res/drawable-hdpi/cloudy_daytime.png new file mode 100644 index 0000000..e260374 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/cloudy_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/cloudy_daytime_1.png b/app/src/main/res/drawable-hdpi/cloudy_daytime_1.png new file mode 100644 index 0000000..f08b8f2 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/cloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-hdpi/flurries_daytime.png b/app/src/main/res/drawable-hdpi/flurries_daytime.png new file mode 100644 index 0000000..90946e4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/flurries_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/fog_daytime.png b/app/src/main/res/drawable-hdpi/fog_daytime.png new file mode 100644 index 0000000..9bb2530 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/fog_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/hazy_daytime.png b/app/src/main/res/drawable-hdpi/hazy_daytime.png new file mode 100644 index 0000000..9bb2530 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/hazy_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/moon.png b/app/src/main/res/drawable-hdpi/moon.png new file mode 100644 index 0000000..fe63fea Binary files /dev/null and b/app/src/main/res/drawable-hdpi/moon.png differ diff --git a/app/src/main/res/drawable-hdpi/mostlycloudy_daytime.png b/app/src/main/res/drawable-hdpi/mostlycloudy_daytime.png new file mode 100644 index 0000000..6a1d2db Binary files /dev/null and b/app/src/main/res/drawable-hdpi/mostlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/mostlysunny_daytime.png b/app/src/main/res/drawable-hdpi/mostlysunny_daytime.png new file mode 100644 index 0000000..1496c08 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/mostlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_chanceflurries_nighttime.png b/app/src/main/res/drawable-hdpi/nt_chanceflurries_nighttime.png new file mode 100644 index 0000000..90946e4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_chanceflurries_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_chancerain_nighttime.png b/app/src/main/res/drawable-hdpi/nt_chancerain_nighttime.png new file mode 100644 index 0000000..6fa4525 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_chancerain_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_chancesleet_nighttime.png b/app/src/main/res/drawable-hdpi/nt_chancesleet_nighttime.png new file mode 100644 index 0000000..56c9fd8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_chancesleet_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_chancesnow_nighttime.png b/app/src/main/res/drawable-hdpi/nt_chancesnow_nighttime.png new file mode 100644 index 0000000..90946e4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_chancesnow_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_chancetstorms_nighttime.png b/app/src/main/res/drawable-hdpi/nt_chancetstorms_nighttime.png new file mode 100644 index 0000000..f43305f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_chancetstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_clear_nighttime.png b/app/src/main/res/drawable-hdpi/nt_clear_nighttime.png new file mode 100644 index 0000000..cc1c899 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_clear_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_cloudy_nighttime.png b/app/src/main/res/drawable-hdpi/nt_cloudy_nighttime.png new file mode 100644 index 0000000..0c95913 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_cloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_cloudy_nighttime_1.png b/app/src/main/res/drawable-hdpi/nt_cloudy_nighttime_1.png new file mode 100644 index 0000000..f08b8f2 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_cloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_flurries_nighttime.png b/app/src/main/res/drawable-hdpi/nt_flurries_nighttime.png new file mode 100644 index 0000000..90946e4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_flurries_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_fog_nighttime.png b/app/src/main/res/drawable-hdpi/nt_fog_nighttime.png new file mode 100644 index 0000000..9bb2530 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_fog_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_hazy_nighttime.png b/app/src/main/res/drawable-hdpi/nt_hazy_nighttime.png new file mode 100644 index 0000000..9bb2530 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_hazy_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_mostlycloudy_nighttime.png b/app/src/main/res/drawable-hdpi/nt_mostlycloudy_nighttime.png new file mode 100644 index 0000000..ed577a6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_mostlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_mostlysunny_nighttime.png b/app/src/main/res/drawable-hdpi/nt_mostlysunny_nighttime.png new file mode 100644 index 0000000..4a4a274 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_mostlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_partlycloudy_nighttime.png b/app/src/main/res/drawable-hdpi/nt_partlycloudy_nighttime.png new file mode 100644 index 0000000..4a4a274 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_partlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_partlycloudy_nighttime_1.png b/app/src/main/res/drawable-hdpi/nt_partlycloudy_nighttime_1.png new file mode 100644 index 0000000..4a4a274 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_partlycloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_partlysunny_nighttime.png b/app/src/main/res/drawable-hdpi/nt_partlysunny_nighttime.png new file mode 100644 index 0000000..83d75f7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_partlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_rain_nighttime.png b/app/src/main/res/drawable-hdpi/nt_rain_nighttime.png new file mode 100644 index 0000000..721a762 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_rain_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_sleet_nighttime.png b/app/src/main/res/drawable-hdpi/nt_sleet_nighttime.png new file mode 100644 index 0000000..fedab9e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_sleet_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_sleet_nighttime_1.png b/app/src/main/res/drawable-hdpi/nt_sleet_nighttime_1.png new file mode 100644 index 0000000..f860ae0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_sleet_nighttime_1.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_snow_nighttime.png b/app/src/main/res/drawable-hdpi/nt_snow_nighttime.png new file mode 100644 index 0000000..90946e4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_snow_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_sunny_nighttime.png b/app/src/main/res/drawable-hdpi/nt_sunny_nighttime.png new file mode 100644 index 0000000..cc1c899 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_sunny_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/nt_tstorms_nighttime.png b/app/src/main/res/drawable-hdpi/nt_tstorms_nighttime.png new file mode 100644 index 0000000..f551d31 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/nt_tstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-hdpi/partlycloudy_daytime.png b/app/src/main/res/drawable-hdpi/partlycloudy_daytime.png new file mode 100644 index 0000000..f995b1d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/partlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/partlycloudy_daytime_1.png b/app/src/main/res/drawable-hdpi/partlycloudy_daytime_1.png new file mode 100644 index 0000000..9b0c113 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/partlycloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-hdpi/partlysunny_daytime.png b/app/src/main/res/drawable-hdpi/partlysunny_daytime.png new file mode 100644 index 0000000..1cb2605 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/partlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/rain_daytime.png b/app/src/main/res/drawable-hdpi/rain_daytime.png new file mode 100644 index 0000000..721a762 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/rain_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/rainy.png b/app/src/main/res/drawable-hdpi/rainy.png new file mode 100644 index 0000000..3b9f6cd Binary files /dev/null and b/app/src/main/res/drawable-hdpi/rainy.png differ diff --git a/app/src/main/res/drawable-hdpi/sleet_daytime.png b/app/src/main/res/drawable-hdpi/sleet_daytime.png new file mode 100644 index 0000000..b39f2a4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/sleet_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/sleet_daytime_1.png b/app/src/main/res/drawable-hdpi/sleet_daytime_1.png new file mode 100644 index 0000000..f860ae0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/sleet_daytime_1.png differ diff --git a/app/src/main/res/drawable-hdpi/snow_daytime.png b/app/src/main/res/drawable-hdpi/snow_daytime.png new file mode 100644 index 0000000..78c3264 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/snow_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/sohot.png b/app/src/main/res/drawable-hdpi/sohot.png new file mode 100644 index 0000000..3a7acd6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/sohot.png differ diff --git a/app/src/main/res/drawable-hdpi/sun.png b/app/src/main/res/drawable-hdpi/sun.png new file mode 100644 index 0000000..024aa0f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/sun.png differ diff --git a/app/src/main/res/drawable-hdpi/sunny_daytime.png b/app/src/main/res/drawable-hdpi/sunny_daytime.png new file mode 100644 index 0000000..c3dde3d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/sunny_daytime.png differ diff --git a/app/src/main/res/drawable-hdpi/tstorms_daytime.png b/app/src/main/res/drawable-hdpi/tstorms_daytime.png new file mode 100644 index 0000000..94ab45f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/tstorms_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/beautifulnight.png b/app/src/main/res/drawable-mdpi/beautifulnight.png new file mode 100644 index 0000000..b155d6b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/beautifulnight.png differ diff --git a/app/src/main/res/drawable-mdpi/blood.png b/app/src/main/res/drawable-mdpi/blood.png new file mode 100644 index 0000000..f568dd8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/blood.png differ diff --git a/app/src/main/res/drawable-mdpi/chanceflurries_daytime.png b/app/src/main/res/drawable-mdpi/chanceflurries_daytime.png new file mode 100644 index 0000000..bb0e9b8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/chanceflurries_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/chancerain_daytime.png b/app/src/main/res/drawable-mdpi/chancerain_daytime.png new file mode 100644 index 0000000..b7b7a71 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/chancerain_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/chancesleet_daytime.png b/app/src/main/res/drawable-mdpi/chancesleet_daytime.png new file mode 100644 index 0000000..e4404dd Binary files /dev/null and b/app/src/main/res/drawable-mdpi/chancesleet_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/chancesnow_daytime.png b/app/src/main/res/drawable-mdpi/chancesnow_daytime.png new file mode 100644 index 0000000..e5850bb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/chancesnow_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/chancetstorms_daytime.png b/app/src/main/res/drawable-mdpi/chancetstorms_daytime.png new file mode 100644 index 0000000..0168107 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/chancetstorms_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/clear_daytime.png b/app/src/main/res/drawable-mdpi/clear_daytime.png new file mode 100644 index 0000000..799e71d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/clear_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/cloudy_daytime.png b/app/src/main/res/drawable-mdpi/cloudy_daytime.png new file mode 100644 index 0000000..83a786b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cloudy_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/cloudy_daytime_1.png b/app/src/main/res/drawable-mdpi/cloudy_daytime_1.png new file mode 100644 index 0000000..3b5d9a9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/cloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-mdpi/flurries_daytime.png b/app/src/main/res/drawable-mdpi/flurries_daytime.png new file mode 100644 index 0000000..e5850bb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/flurries_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/fog_daytime.png b/app/src/main/res/drawable-mdpi/fog_daytime.png new file mode 100644 index 0000000..2d3cf25 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/fog_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/hazy_daytime.png b/app/src/main/res/drawable-mdpi/hazy_daytime.png new file mode 100644 index 0000000..2d3cf25 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/hazy_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/moon.png b/app/src/main/res/drawable-mdpi/moon.png new file mode 100644 index 0000000..1c59d43 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/moon.png differ diff --git a/app/src/main/res/drawable-mdpi/mostlycloudy_daytime.png b/app/src/main/res/drawable-mdpi/mostlycloudy_daytime.png new file mode 100644 index 0000000..69a7c91 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/mostlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/mostlysunny_daytime.png b/app/src/main/res/drawable-mdpi/mostlysunny_daytime.png new file mode 100644 index 0000000..e72cb42 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/mostlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_chanceflurries_nighttime.png b/app/src/main/res/drawable-mdpi/nt_chanceflurries_nighttime.png new file mode 100644 index 0000000..e5850bb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_chanceflurries_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_chancerain_nighttime.png b/app/src/main/res/drawable-mdpi/nt_chancerain_nighttime.png new file mode 100644 index 0000000..cb106bd Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_chancerain_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_chancesleet_nighttime.png b/app/src/main/res/drawable-mdpi/nt_chancesleet_nighttime.png new file mode 100644 index 0000000..9e6a421 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_chancesleet_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_chancesnow_nighttime.png b/app/src/main/res/drawable-mdpi/nt_chancesnow_nighttime.png new file mode 100644 index 0000000..e5850bb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_chancesnow_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_chancetstorms_nighttime.png b/app/src/main/res/drawable-mdpi/nt_chancetstorms_nighttime.png new file mode 100644 index 0000000..9340cbf Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_chancetstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_clear_nighttime.png b/app/src/main/res/drawable-mdpi/nt_clear_nighttime.png new file mode 100644 index 0000000..f24eb95 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_clear_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_cloudy_nighttime.png b/app/src/main/res/drawable-mdpi/nt_cloudy_nighttime.png new file mode 100644 index 0000000..61d898b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_cloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_cloudy_nighttime_1.png b/app/src/main/res/drawable-mdpi/nt_cloudy_nighttime_1.png new file mode 100644 index 0000000..3b5d9a9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_cloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_flurries_nighttime.png b/app/src/main/res/drawable-mdpi/nt_flurries_nighttime.png new file mode 100644 index 0000000..e5850bb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_flurries_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_fog_nighttime.png b/app/src/main/res/drawable-mdpi/nt_fog_nighttime.png new file mode 100644 index 0000000..2d3cf25 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_fog_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_hazy_nighttime.png b/app/src/main/res/drawable-mdpi/nt_hazy_nighttime.png new file mode 100644 index 0000000..2d3cf25 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_hazy_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_mostlycloudy_nighttime.png b/app/src/main/res/drawable-mdpi/nt_mostlycloudy_nighttime.png new file mode 100644 index 0000000..c3748fe Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_mostlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_mostlysunny_nighttime.png b/app/src/main/res/drawable-mdpi/nt_mostlysunny_nighttime.png new file mode 100644 index 0000000..8b0b2c4 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_mostlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_partlycloudy_nighttime.png b/app/src/main/res/drawable-mdpi/nt_partlycloudy_nighttime.png new file mode 100644 index 0000000..8b0b2c4 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_partlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_partlycloudy_nighttime_1.png b/app/src/main/res/drawable-mdpi/nt_partlycloudy_nighttime_1.png new file mode 100644 index 0000000..8b0b2c4 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_partlycloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_partlysunny_nighttime.png b/app/src/main/res/drawable-mdpi/nt_partlysunny_nighttime.png new file mode 100644 index 0000000..5ecf291 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_partlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_rain_nighttime.png b/app/src/main/res/drawable-mdpi/nt_rain_nighttime.png new file mode 100644 index 0000000..299fc55 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_rain_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_sleet_nighttime.png b/app/src/main/res/drawable-mdpi/nt_sleet_nighttime.png new file mode 100644 index 0000000..9d05ade Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_sleet_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_sleet_nighttime_1.png b/app/src/main/res/drawable-mdpi/nt_sleet_nighttime_1.png new file mode 100644 index 0000000..a304d09 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_sleet_nighttime_1.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_snow_nighttime.png b/app/src/main/res/drawable-mdpi/nt_snow_nighttime.png new file mode 100644 index 0000000..e5850bb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_snow_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_sunny_nighttime.png b/app/src/main/res/drawable-mdpi/nt_sunny_nighttime.png new file mode 100644 index 0000000..f24eb95 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_sunny_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/nt_tstorms_nighttime.png b/app/src/main/res/drawable-mdpi/nt_tstorms_nighttime.png new file mode 100644 index 0000000..efe1173 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/nt_tstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-mdpi/partlycloudy_daytime.png b/app/src/main/res/drawable-mdpi/partlycloudy_daytime.png new file mode 100644 index 0000000..124c779 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/partlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/partlycloudy_daytime_1.png b/app/src/main/res/drawable-mdpi/partlycloudy_daytime_1.png new file mode 100644 index 0000000..41ff963 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/partlycloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-mdpi/partlysunny_daytime.png b/app/src/main/res/drawable-mdpi/partlysunny_daytime.png new file mode 100644 index 0000000..989f9e8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/partlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/rain_daytime.png b/app/src/main/res/drawable-mdpi/rain_daytime.png new file mode 100644 index 0000000..299fc55 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/rain_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/rainy.png b/app/src/main/res/drawable-mdpi/rainy.png new file mode 100644 index 0000000..f915dd7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/rainy.png differ diff --git a/app/src/main/res/drawable-mdpi/sleet_daytime.png b/app/src/main/res/drawable-mdpi/sleet_daytime.png new file mode 100644 index 0000000..86567bc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/sleet_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/sleet_daytime_1.png b/app/src/main/res/drawable-mdpi/sleet_daytime_1.png new file mode 100644 index 0000000..a304d09 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/sleet_daytime_1.png differ diff --git a/app/src/main/res/drawable-mdpi/snow_daytime.png b/app/src/main/res/drawable-mdpi/snow_daytime.png new file mode 100644 index 0000000..af90976 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/snow_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/sohot.png b/app/src/main/res/drawable-mdpi/sohot.png new file mode 100644 index 0000000..06c3c76 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/sohot.png differ diff --git a/app/src/main/res/drawable-mdpi/sun.png b/app/src/main/res/drawable-mdpi/sun.png new file mode 100644 index 0000000..41a68c2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/sun.png differ diff --git a/app/src/main/res/drawable-mdpi/sunny_daytime.png b/app/src/main/res/drawable-mdpi/sunny_daytime.png new file mode 100644 index 0000000..799e71d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/sunny_daytime.png differ diff --git a/app/src/main/res/drawable-mdpi/tstorms_daytime.png b/app/src/main/res/drawable-mdpi/tstorms_daytime.png new file mode 100644 index 0000000..3b2a00d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/tstorms_daytime.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable-xhdpi/beautifulnight.png b/app/src/main/res/drawable-xhdpi/beautifulnight.png new file mode 100644 index 0000000..ccf864a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/beautifulnight.png differ diff --git a/app/src/main/res/drawable-xhdpi/blood.png b/app/src/main/res/drawable-xhdpi/blood.png new file mode 100644 index 0000000..74ec714 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/blood.png differ diff --git a/app/src/main/res/drawable-xhdpi/chanceflurries_daytime.png b/app/src/main/res/drawable-xhdpi/chanceflurries_daytime.png new file mode 100644 index 0000000..48d2a7d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/chanceflurries_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/chancerain_daytime.png b/app/src/main/res/drawable-xhdpi/chancerain_daytime.png new file mode 100644 index 0000000..50a151b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/chancerain_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/chancesleet_daytime.png b/app/src/main/res/drawable-xhdpi/chancesleet_daytime.png new file mode 100644 index 0000000..2330fc2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/chancesleet_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/chancesnow_daytime.png b/app/src/main/res/drawable-xhdpi/chancesnow_daytime.png new file mode 100644 index 0000000..9970dad Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/chancesnow_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/chancetstorms_daytime.png b/app/src/main/res/drawable-xhdpi/chancetstorms_daytime.png new file mode 100644 index 0000000..98de71d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/chancetstorms_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/clear_daytime.png b/app/src/main/res/drawable-xhdpi/clear_daytime.png new file mode 100644 index 0000000..0e73c06 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/clear_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/cloudy_daytime.png b/app/src/main/res/drawable-xhdpi/cloudy_daytime.png new file mode 100644 index 0000000..e218eb2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/cloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/cloudy_daytime_1.png b/app/src/main/res/drawable-xhdpi/cloudy_daytime_1.png new file mode 100644 index 0000000..00d1ce9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/cloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/flurries_daytime.png b/app/src/main/res/drawable-xhdpi/flurries_daytime.png new file mode 100644 index 0000000..9970dad Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/flurries_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/fog_daytime.png b/app/src/main/res/drawable-xhdpi/fog_daytime.png new file mode 100644 index 0000000..665def5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/fog_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/hazy_daytime.png b/app/src/main/res/drawable-xhdpi/hazy_daytime.png new file mode 100644 index 0000000..665def5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/hazy_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/moon.png b/app/src/main/res/drawable-xhdpi/moon.png new file mode 100644 index 0000000..8d87ccf Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/moon.png differ diff --git a/app/src/main/res/drawable-xhdpi/mostlycloudy_daytime.png b/app/src/main/res/drawable-xhdpi/mostlycloudy_daytime.png new file mode 100644 index 0000000..22b8493 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/mostlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/mostlysunny_daytime.png b/app/src/main/res/drawable-xhdpi/mostlysunny_daytime.png new file mode 100644 index 0000000..00ef519 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/mostlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_chanceflurries_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_chanceflurries_nighttime.png new file mode 100644 index 0000000..9970dad Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_chanceflurries_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_chancerain_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_chancerain_nighttime.png new file mode 100644 index 0000000..9043bd7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_chancerain_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_chancesleet_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_chancesleet_nighttime.png new file mode 100644 index 0000000..9e8e7be Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_chancesleet_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_chancesnow_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_chancesnow_nighttime.png new file mode 100644 index 0000000..9970dad Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_chancesnow_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_chancetstorms_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_chancetstorms_nighttime.png new file mode 100644 index 0000000..d1ba6e1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_chancetstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_clear_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_clear_nighttime.png new file mode 100644 index 0000000..9242419 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_clear_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_cloudy_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_cloudy_nighttime.png new file mode 100644 index 0000000..1a3a07e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_cloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_cloudy_nighttime_1.png b/app/src/main/res/drawable-xhdpi/nt_cloudy_nighttime_1.png new file mode 100644 index 0000000..00d1ce9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_cloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_flurries_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_flurries_nighttime.png new file mode 100644 index 0000000..9970dad Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_flurries_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_fog_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_fog_nighttime.png new file mode 100644 index 0000000..665def5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_fog_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_hazy_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_hazy_nighttime.png new file mode 100644 index 0000000..665def5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_hazy_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_mostlycloudy_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_mostlycloudy_nighttime.png new file mode 100644 index 0000000..88f5ca5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_mostlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_mostlysunny_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_mostlysunny_nighttime.png new file mode 100644 index 0000000..5d1709e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_mostlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_partlycloudy_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_partlycloudy_nighttime.png new file mode 100644 index 0000000..5d1709e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_partlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_partlycloudy_nighttime_1.png b/app/src/main/res/drawable-xhdpi/nt_partlycloudy_nighttime_1.png new file mode 100644 index 0000000..5d1709e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_partlycloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_partlysunny_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_partlysunny_nighttime.png new file mode 100644 index 0000000..3b81035 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_partlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_rain_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_rain_nighttime.png new file mode 100644 index 0000000..56f3452 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_rain_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_sleet_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_sleet_nighttime.png new file mode 100644 index 0000000..50a5ec0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_sleet_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_sleet_nighttime_1.png b/app/src/main/res/drawable-xhdpi/nt_sleet_nighttime_1.png new file mode 100644 index 0000000..1bc4991 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_sleet_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_snow_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_snow_nighttime.png new file mode 100644 index 0000000..9970dad Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_snow_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_sunny_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_sunny_nighttime.png new file mode 100644 index 0000000..9242419 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_sunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/nt_tstorms_nighttime.png b/app/src/main/res/drawable-xhdpi/nt_tstorms_nighttime.png new file mode 100644 index 0000000..d1a7884 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nt_tstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-xhdpi/partlycloudy_daytime.png b/app/src/main/res/drawable-xhdpi/partlycloudy_daytime.png new file mode 100644 index 0000000..17159c2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/partlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/partlycloudy_daytime_1.png b/app/src/main/res/drawable-xhdpi/partlycloudy_daytime_1.png new file mode 100644 index 0000000..b472e38 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/partlycloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/partlysunny_daytime.png b/app/src/main/res/drawable-xhdpi/partlysunny_daytime.png new file mode 100644 index 0000000..008e5eb Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/partlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/rain_daytime.png b/app/src/main/res/drawable-xhdpi/rain_daytime.png new file mode 100644 index 0000000..56f3452 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/rain_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/rainy.png b/app/src/main/res/drawable-xhdpi/rainy.png new file mode 100644 index 0000000..59a62b7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/rainy.png differ diff --git a/app/src/main/res/drawable-xhdpi/sleet_daytime.png b/app/src/main/res/drawable-xhdpi/sleet_daytime.png new file mode 100644 index 0000000..b5f8c6b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/sleet_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/sleet_daytime_1.png b/app/src/main/res/drawable-xhdpi/sleet_daytime_1.png new file mode 100644 index 0000000..1bc4991 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/sleet_daytime_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/snow_daytime.png b/app/src/main/res/drawable-xhdpi/snow_daytime.png new file mode 100644 index 0000000..ea4bda7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/snow_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/sohot.png b/app/src/main/res/drawable-xhdpi/sohot.png new file mode 100644 index 0000000..21e5330 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/sohot.png differ diff --git a/app/src/main/res/drawable-xhdpi/sun.png b/app/src/main/res/drawable-xhdpi/sun.png new file mode 100644 index 0000000..b6e5163 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/sun.png differ diff --git a/app/src/main/res/drawable-xhdpi/sunny_daytime.png b/app/src/main/res/drawable-xhdpi/sunny_daytime.png new file mode 100644 index 0000000..0e73c06 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/sunny_daytime.png differ diff --git a/app/src/main/res/drawable-xhdpi/tstorms_daytime.png b/app/src/main/res/drawable-xhdpi/tstorms_daytime.png new file mode 100644 index 0000000..bfb9f00 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tstorms_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/beautifulnight.png b/app/src/main/res/drawable-xxhdpi/beautifulnight.png new file mode 100644 index 0000000..51dab82 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/beautifulnight.png differ diff --git a/app/src/main/res/drawable-xxhdpi/blood.png b/app/src/main/res/drawable-xxhdpi/blood.png new file mode 100644 index 0000000..e12e9d9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/blood.png differ diff --git a/app/src/main/res/drawable-xxhdpi/chanceflurries_daytime.png b/app/src/main/res/drawable-xxhdpi/chanceflurries_daytime.png new file mode 100644 index 0000000..a8ea0ba Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/chanceflurries_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/chancerain_daytime.png b/app/src/main/res/drawable-xxhdpi/chancerain_daytime.png new file mode 100644 index 0000000..d28c8d2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/chancerain_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/chancesleet_daytime.png b/app/src/main/res/drawable-xxhdpi/chancesleet_daytime.png new file mode 100644 index 0000000..1c526cb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/chancesleet_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/chancesnow_daytime.png b/app/src/main/res/drawable-xxhdpi/chancesnow_daytime.png new file mode 100644 index 0000000..e79b078 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/chancesnow_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/chancetstorms_daytime.png b/app/src/main/res/drawable-xxhdpi/chancetstorms_daytime.png new file mode 100644 index 0000000..853e6ed Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/chancetstorms_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/clear_daytime.png b/app/src/main/res/drawable-xxhdpi/clear_daytime.png new file mode 100644 index 0000000..c84e298 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/clear_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/cloudy_daytime.png b/app/src/main/res/drawable-xxhdpi/cloudy_daytime.png new file mode 100644 index 0000000..4741975 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/cloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/cloudy_daytime_1.png b/app/src/main/res/drawable-xxhdpi/cloudy_daytime_1.png new file mode 100644 index 0000000..ad1fff1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/cloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/flurries_daytime.png b/app/src/main/res/drawable-xxhdpi/flurries_daytime.png new file mode 100644 index 0000000..e79b078 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/flurries_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/fog_daytime.png b/app/src/main/res/drawable-xxhdpi/fog_daytime.png new file mode 100644 index 0000000..cb98b7f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/fog_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/hazy_daytime.png b/app/src/main/res/drawable-xxhdpi/hazy_daytime.png new file mode 100644 index 0000000..cb98b7f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/hazy_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/moon.png b/app/src/main/res/drawable-xxhdpi/moon.png new file mode 100644 index 0000000..7a33ce3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/moon.png differ diff --git a/app/src/main/res/drawable-xxhdpi/mostlycloudy_daytime.png b/app/src/main/res/drawable-xxhdpi/mostlycloudy_daytime.png new file mode 100644 index 0000000..2851acd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/mostlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/mostlysunny_daytime.png b/app/src/main/res/drawable-xxhdpi/mostlysunny_daytime.png new file mode 100644 index 0000000..30ee371 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/mostlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_chanceflurries_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_chanceflurries_nighttime.png new file mode 100644 index 0000000..e79b078 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_chanceflurries_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_chancerain_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_chancerain_nighttime.png new file mode 100644 index 0000000..75b4f90 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_chancerain_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_chancesleet_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_chancesleet_nighttime.png new file mode 100644 index 0000000..5b032e1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_chancesleet_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_chancesnow_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_chancesnow_nighttime.png new file mode 100644 index 0000000..e79b078 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_chancesnow_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_chancetstorms_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_chancetstorms_nighttime.png new file mode 100644 index 0000000..e09070e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_chancetstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_clear_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_clear_nighttime.png new file mode 100644 index 0000000..c5bee7a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_clear_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_cloudy_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_cloudy_nighttime.png new file mode 100644 index 0000000..e3b7d11 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_cloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_cloudy_nighttime_1.png b/app/src/main/res/drawable-xxhdpi/nt_cloudy_nighttime_1.png new file mode 100644 index 0000000..ad1fff1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_cloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_flurries_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_flurries_nighttime.png new file mode 100644 index 0000000..e79b078 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_flurries_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_fog_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_fog_nighttime.png new file mode 100644 index 0000000..cb98b7f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_fog_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_hazy_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_hazy_nighttime.png new file mode 100644 index 0000000..cb98b7f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_hazy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_mostlycloudy_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_mostlycloudy_nighttime.png new file mode 100644 index 0000000..93674ee Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_mostlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_mostlysunny_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_mostlysunny_nighttime.png new file mode 100644 index 0000000..a7530cf Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_mostlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_partlycloudy_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_partlycloudy_nighttime.png new file mode 100644 index 0000000..a7530cf Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_partlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_partlycloudy_nighttime_1.png b/app/src/main/res/drawable-xxhdpi/nt_partlycloudy_nighttime_1.png new file mode 100644 index 0000000..a7530cf Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_partlycloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_partlysunny_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_partlysunny_nighttime.png new file mode 100644 index 0000000..d0e0669 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_partlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_rain_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_rain_nighttime.png new file mode 100644 index 0000000..6d9b6a9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_rain_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_sleet_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_sleet_nighttime.png new file mode 100644 index 0000000..8e8ee12 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_sleet_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_sleet_nighttime_1.png b/app/src/main/res/drawable-xxhdpi/nt_sleet_nighttime_1.png new file mode 100644 index 0000000..ccc3b0b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_sleet_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_snow_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_snow_nighttime.png new file mode 100644 index 0000000..e79b078 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_snow_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_sunny_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_sunny_nighttime.png new file mode 100644 index 0000000..c5bee7a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_sunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/nt_tstorms_nighttime.png b/app/src/main/res/drawable-xxhdpi/nt_tstorms_nighttime.png new file mode 100644 index 0000000..e66ba8c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/nt_tstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/partlycloudy_daytime.png b/app/src/main/res/drawable-xxhdpi/partlycloudy_daytime.png new file mode 100644 index 0000000..77605ab Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/partlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/partlycloudy_daytime_1.png b/app/src/main/res/drawable-xxhdpi/partlycloudy_daytime_1.png new file mode 100644 index 0000000..535b83c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/partlycloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/partlysunny_daytime.png b/app/src/main/res/drawable-xxhdpi/partlysunny_daytime.png new file mode 100644 index 0000000..6414fb3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/partlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/rain_daytime.png b/app/src/main/res/drawable-xxhdpi/rain_daytime.png new file mode 100644 index 0000000..6d9b6a9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/rain_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/rainy.png b/app/src/main/res/drawable-xxhdpi/rainy.png new file mode 100644 index 0000000..83193bf Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/rainy.png differ diff --git a/app/src/main/res/drawable-xxhdpi/sleet_daytime.png b/app/src/main/res/drawable-xxhdpi/sleet_daytime.png new file mode 100644 index 0000000..1aa8cca Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/sleet_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/sleet_daytime_1.png b/app/src/main/res/drawable-xxhdpi/sleet_daytime_1.png new file mode 100644 index 0000000..ccc3b0b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/sleet_daytime_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/snow_daytime.png b/app/src/main/res/drawable-xxhdpi/snow_daytime.png new file mode 100644 index 0000000..1011ed7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/snow_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/sohot.png b/app/src/main/res/drawable-xxhdpi/sohot.png new file mode 100644 index 0000000..253c07a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/sohot.png differ diff --git a/app/src/main/res/drawable-xxhdpi/sun.png b/app/src/main/res/drawable-xxhdpi/sun.png new file mode 100644 index 0000000..4511f42 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/sun.png differ diff --git a/app/src/main/res/drawable-xxhdpi/sunny_daytime.png b/app/src/main/res/drawable-xxhdpi/sunny_daytime.png new file mode 100644 index 0000000..c84e298 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/sunny_daytime.png differ diff --git a/app/src/main/res/drawable-xxhdpi/tstorms_daytime.png b/app/src/main/res/drawable-xxhdpi/tstorms_daytime.png new file mode 100644 index 0000000..98d32d6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/tstorms_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/beautifulnight.png b/app/src/main/res/drawable-xxxhdpi/beautifulnight.png new file mode 100644 index 0000000..342acdd Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/beautifulnight.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/blood.png b/app/src/main/res/drawable-xxxhdpi/blood.png new file mode 100644 index 0000000..e26e91c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/blood.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/chanceflurries_daytime.png b/app/src/main/res/drawable-xxxhdpi/chanceflurries_daytime.png new file mode 100644 index 0000000..ac581f7 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/chanceflurries_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/chancerain_daytime.png b/app/src/main/res/drawable-xxxhdpi/chancerain_daytime.png new file mode 100644 index 0000000..186f850 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/chancerain_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/chancesleet_daytime.png b/app/src/main/res/drawable-xxxhdpi/chancesleet_daytime.png new file mode 100644 index 0000000..ac5d7c0 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/chancesleet_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/chancesnow_daytime.png b/app/src/main/res/drawable-xxxhdpi/chancesnow_daytime.png new file mode 100644 index 0000000..69aa9ba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/chancesnow_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/chancetstorms_daytime.png b/app/src/main/res/drawable-xxxhdpi/chancetstorms_daytime.png new file mode 100644 index 0000000..8ad75d3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/chancetstorms_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/clear_daytime.png b/app/src/main/res/drawable-xxxhdpi/clear_daytime.png new file mode 100644 index 0000000..7733d4b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/clear_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/cloudy_daytime.png b/app/src/main/res/drawable-xxxhdpi/cloudy_daytime.png new file mode 100644 index 0000000..2e078c9 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/cloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/cloudy_daytime_1.png b/app/src/main/res/drawable-xxxhdpi/cloudy_daytime_1.png new file mode 100644 index 0000000..0639e86 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/cloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/flurries_daytime.png b/app/src/main/res/drawable-xxxhdpi/flurries_daytime.png new file mode 100644 index 0000000..69aa9ba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/flurries_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/fog_daytime.png b/app/src/main/res/drawable-xxxhdpi/fog_daytime.png new file mode 100644 index 0000000..e05be74 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/fog_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/hazy_daytime.png b/app/src/main/res/drawable-xxxhdpi/hazy_daytime.png new file mode 100644 index 0000000..e05be74 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/hazy_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/moon.png b/app/src/main/res/drawable-xxxhdpi/moon.png new file mode 100644 index 0000000..63a2047 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/moon.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/mostlycloudy_daytime.png b/app/src/main/res/drawable-xxxhdpi/mostlycloudy_daytime.png new file mode 100644 index 0000000..e92076a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/mostlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/mostlysunny_daytime.png b/app/src/main/res/drawable-xxxhdpi/mostlysunny_daytime.png new file mode 100644 index 0000000..eee1f56 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/mostlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_chanceflurries_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_chanceflurries_nighttime.png new file mode 100644 index 0000000..69aa9ba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_chanceflurries_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_chancerain_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_chancerain_nighttime.png new file mode 100644 index 0000000..d750e61 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_chancerain_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_chancesleet_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_chancesleet_nighttime.png new file mode 100644 index 0000000..018ebef Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_chancesleet_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_chancesnow_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_chancesnow_nighttime.png new file mode 100644 index 0000000..69aa9ba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_chancesnow_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_chancetstorms_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_chancetstorms_nighttime.png new file mode 100644 index 0000000..52c14b0 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_chancetstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_clear_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_clear_nighttime.png new file mode 100644 index 0000000..ede9708 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_clear_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_cloudy_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_cloudy_nighttime.png new file mode 100644 index 0000000..64e2a62 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_cloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_cloudy_nighttime_1.png b/app/src/main/res/drawable-xxxhdpi/nt_cloudy_nighttime_1.png new file mode 100644 index 0000000..0639e86 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_cloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_flurries_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_flurries_nighttime.png new file mode 100644 index 0000000..69aa9ba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_flurries_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_fog_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_fog_nighttime.png new file mode 100644 index 0000000..e05be74 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_fog_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_hazy_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_hazy_nighttime.png new file mode 100644 index 0000000..e05be74 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_hazy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_mostlycloudy_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_mostlycloudy_nighttime.png new file mode 100644 index 0000000..fe46a34 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_mostlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_mostlysunny_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_mostlysunny_nighttime.png new file mode 100644 index 0000000..09db2b3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_mostlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_partlycloudy_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_partlycloudy_nighttime.png new file mode 100644 index 0000000..09db2b3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_partlycloudy_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_partlycloudy_nighttime_1.png b/app/src/main/res/drawable-xxxhdpi/nt_partlycloudy_nighttime_1.png new file mode 100644 index 0000000..09db2b3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_partlycloudy_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_partlysunny_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_partlysunny_nighttime.png new file mode 100644 index 0000000..51e6aca Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_partlysunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_rain_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_rain_nighttime.png new file mode 100644 index 0000000..c6601a4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_rain_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_sleet_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_sleet_nighttime.png new file mode 100644 index 0000000..3f2bac4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_sleet_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_sleet_nighttime_1.png b/app/src/main/res/drawable-xxxhdpi/nt_sleet_nighttime_1.png new file mode 100644 index 0000000..4c1bb33 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_sleet_nighttime_1.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_snow_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_snow_nighttime.png new file mode 100644 index 0000000..69aa9ba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_snow_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_sunny_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_sunny_nighttime.png new file mode 100644 index 0000000..ede9708 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_sunny_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/nt_tstorms_nighttime.png b/app/src/main/res/drawable-xxxhdpi/nt_tstorms_nighttime.png new file mode 100644 index 0000000..51b4f79 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/nt_tstorms_nighttime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/partlycloudy_daytime.png b/app/src/main/res/drawable-xxxhdpi/partlycloudy_daytime.png new file mode 100644 index 0000000..884431c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/partlycloudy_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/partlycloudy_daytime_1.png b/app/src/main/res/drawable-xxxhdpi/partlycloudy_daytime_1.png new file mode 100644 index 0000000..d2ebf0c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/partlycloudy_daytime_1.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/partlysunny_daytime.png b/app/src/main/res/drawable-xxxhdpi/partlysunny_daytime.png new file mode 100644 index 0000000..86a98d2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/partlysunny_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/rain_daytime.png b/app/src/main/res/drawable-xxxhdpi/rain_daytime.png new file mode 100644 index 0000000..c6601a4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/rain_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/rainy.png b/app/src/main/res/drawable-xxxhdpi/rainy.png new file mode 100644 index 0000000..0166678 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/rainy.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/sleet_daytime.png b/app/src/main/res/drawable-xxxhdpi/sleet_daytime.png new file mode 100644 index 0000000..c7baf94 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/sleet_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/sleet_daytime_1.png b/app/src/main/res/drawable-xxxhdpi/sleet_daytime_1.png new file mode 100644 index 0000000..4c1bb33 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/sleet_daytime_1.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/snow_daytime.png b/app/src/main/res/drawable-xxxhdpi/snow_daytime.png new file mode 100644 index 0000000..6ffa4fd Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/snow_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/sohot.png b/app/src/main/res/drawable-xxxhdpi/sohot.png new file mode 100644 index 0000000..6ecde20 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/sohot.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/sun.png b/app/src/main/res/drawable-xxxhdpi/sun.png new file mode 100644 index 0000000..2c9f2f0 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/sun.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/sunny_daytime.png b/app/src/main/res/drawable-xxxhdpi/sunny_daytime.png new file mode 100644 index 0000000..7733d4b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/sunny_daytime.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/tstorms_daytime.png b/app/src/main/res/drawable-xxxhdpi/tstorms_daytime.png new file mode 100644 index 0000000..ce8c23c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/tstorms_daytime.png differ diff --git a/app/src/main/res/drawable/default_bg.xml b/app/src/main/res/drawable/default_bg.xml new file mode 100644 index 0000000..5ce998d --- /dev/null +++ b/app/src/main/res/drawable/default_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add_white_24dp.xml new file mode 100644 index 0000000..42f6048 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_location_on_white_24dp.xml b/app/src/main/res/drawable/ic_location_on_white_24dp.xml new file mode 100644 index 0000000..9455792 --- /dev/null +++ b/app/src/main/res/drawable/ic_location_on_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_navigate_next_white_24dp.xml b/app/src/main/res/drawable/ic_navigate_next_white_24dp.xml new file mode 100644 index 0000000..8998514 --- /dev/null +++ b/app/src/main/res/drawable/ic_navigate_next_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml b/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml new file mode 100644 index 0000000..19aced2 --- /dev/null +++ b/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_white_24dp.xml b/app/src/main/res/drawable/ic_settings_white_24dp.xml new file mode 100644 index 0000000..c3d4807 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/font/noto_sans.xml b/app/src/main/res/font/noto_sans.xml new file mode 100644 index 0000000..50d1747 --- /dev/null +++ b/app/src/main/res/font/noto_sans.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/font/nunito_sans.xml b/app/src/main/res/font/nunito_sans.xml new file mode 100644 index 0000000..acbd419 --- /dev/null +++ b/app/src/main/res/font/nunito_sans.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/layout/activity_add_city.xml b/app/src/main/res/layout/activity_add_city.xml new file mode 100644 index 0000000..cf793f1 --- /dev/null +++ b/app/src/main/res/layout/activity_add_city.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_location.xml b/app/src/main/res/layout/activity_location.xml new file mode 100644 index 0000000..53d8ea2 --- /dev/null +++ b/app/src/main/res/layout/activity_location.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..fa4335e --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_maps.xml b/app/src/main/res/layout/activity_maps.xml new file mode 100644 index 0000000..4d0590c --- /dev/null +++ b/app/src/main/res/layout/activity_maps.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/city_item_layout.xml b/app/src/main/res/layout/city_item_layout.xml new file mode 100644 index 0000000..b3f40c8 --- /dev/null +++ b/app/src/main/res/layout/city_item_layout.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_current_weather.xml b/app/src/main/res/layout/fragment_current_weather.xml new file mode 100644 index 0000000..b2b2b8e --- /dev/null +++ b/app/src/main/res/layout/fragment_current_weather.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/some_city_layout.xml b/app/src/main/res/layout/some_city_layout.xml new file mode 100644 index 0000000..6bf3e2a --- /dev/null +++ b/app/src/main/res/layout/some_city_layout.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..2e93eb8 --- /dev/null +++ b/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..898f3ed Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..dffca36 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..64ba76f Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..dae5e08 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e5ed465 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..14ed0af Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b0907ca Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..d8ae031 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..2c18de9 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..beed3cd Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 0000000..63fc816 --- /dev/null +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ + + + 64dp + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..79d94cb --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #00bfa5 + #019984 + #e57373 + + #78ffffff + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..cef3abc --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + 16dp + 16dp + 16dp + 8dp + diff --git a/app/src/main/res/values/font_certs.xml b/app/src/main/res/values/font_certs.xml new file mode 100644 index 0000000..d2226ac --- /dev/null +++ b/app/src/main/res/values/font_certs.xml @@ -0,0 +1,17 @@ + + + + @array/com_google_android_gms_fonts_certs_dev + @array/com_google_android_gms_fonts_certs_prod + + + + MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs= + + + + + MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK + + + diff --git a/app/src/main/res/values/preloaded_fonts.xml b/app/src/main/res/values/preloaded_fonts.xml new file mode 100644 index 0000000..d082456 --- /dev/null +++ b/app/src/main/res/values/preloaded_fonts.xml @@ -0,0 +1,7 @@ + + + + @font/noto_sans + @font/nunito_sans + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..0219ee0 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + Weather App + Settings + Hello World from section: %1$d + Map + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..e55bbdb --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,24 @@ + + + + + + + +