From 2e88e498757d31f92e023e1f831dde2fc86b5c38 Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Sat, 31 Oct 2020 11:21:56 +0100 Subject: [PATCH] Add error messages instead of toasts --- app/build.gradle | 32 ++++---- .../h/pixeldroid/fragments/CameraFragment.kt | 2 +- .../fragments/SearchDiscoverFragment.kt | 28 +++++-- .../fragments/feeds/AccountListFragment.kt | 6 +- .../fragments/feeds/FeedFragment.kt | 16 +++- .../fragments/feeds/NotificationsFragment.kt | 9 ++- .../feeds/postFeeds/HomeTimelineFragment.kt | 6 +- .../feeds/postFeeds/PostsFeedFragment.kt | 2 + .../feeds/postFeeds/PublicTimelineFragment.kt | 4 +- .../feeds/search/SearchAccountFragment.kt | 4 +- .../feeds/search/SearchHashtagFragment.kt | 6 +- .../feeds/search/SearchPostsFragment.kt | 7 +- app/src/main/res/drawable/red_panda.xml | 81 +++++++++++++++++++ app/src/main/res/layout/fragment_feed.xml | 65 ++++++++++++--- app/src/main/res/layout/fragment_search.xml | 59 ++++++++++++-- app/src/main/res/values-night/colors.xml | 9 +-- app/src/main/res/values/colors.xml | 1 + .../xml/fragment_search_xml_error_scene.xml | 34 ++++++++ build.gradle | 2 +- 19 files changed, 306 insertions(+), 67 deletions(-) create mode 100644 app/src/main/res/drawable/red_panda.xml create mode 100644 app/src/main/res/xml/fragment_search_xml_error_scene.xml diff --git a/app/build.gradle b/app/build.gradle index 0cc55d89..e45d469c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,15 +66,15 @@ dependencies { */ implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.core:core-ktx:1.3.2' - implementation 'androidx.preference:preference:1.1.1' - implementation 'androidx.constraintlayout:constraintlayout:2.0.1' - implementation 'androidx.navigation:navigation-fragment:2.3.0' - implementation 'androidx.navigation:navigation-ui:2.3.0' + implementation 'androidx.preference:preference-ktx:1.1.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.1' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.1' implementation "androidx.browser:browser:1.2.0" implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0' - implementation 'androidx.navigation:navigation-ui-ktx:2.3.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.1' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.1' implementation 'androidx.paging:paging-runtime-ktx:2.1.2' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0' @@ -83,14 +83,14 @@ dependencies { implementation 'androidx.gridlayout:gridlayout:1.0.0' // Use the most recent version of CameraX - def camerax_version = '1.0.0-beta08' + def camerax_version = '1.0.0-beta11' implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" // CameraX Lifecycle library implementation "androidx.camera:camera-lifecycle:$camerax_version" // CameraX View class - implementation 'androidx.camera:camera-view:1.0.0-alpha15' + implementation 'androidx.camera:camera-view:1.0.0-alpha18' def room_version = "2.2.5" implementation "androidx.room:room-runtime:$room_version" @@ -106,13 +106,13 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' //Dagger (dependency injection) - implementation 'com.google.dagger:dagger-android:2.28.3' - implementation 'com.google.dagger:dagger-android-support:2.28.3' + implementation 'com.google.dagger:dagger-android:2.29.1' + implementation 'com.google.dagger:dagger-android-support:2.29.1' // if you use the support libraries - kapt 'com.google.dagger:dagger-android-processor:2.28.3' - kapt 'com.google.dagger:dagger-compiler:2.28.3' + kapt 'com.google.dagger:dagger-android-processor:2.29.1' + kapt 'com.google.dagger:dagger-compiler:2.29.1' - implementation 'com.squareup.okhttp3:okhttp:4.8.1' + implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' @@ -160,9 +160,9 @@ dependencies { debugImplementation "androidx.fragment:fragment-testing:1.2.5" - testImplementation 'com.github.tomakehurst:wiremock-jre8:2.27.1' + testImplementation 'com.github.tomakehurst:wiremock-jre8:2.27.2' testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0" - testImplementation 'junit:junit:4.13' + testImplementation 'junit:junit:4.13.1' testImplementation "androidx.room:room-testing:$room_version" @@ -175,7 +175,7 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-intents:3.3.0' androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.2' - androidTestImplementation('com.squareup.okhttp3:mockwebserver:4.8.0') + androidTestImplementation('com.squareup.okhttp3:mockwebserver:4.9.0') } diff --git a/app/src/main/java/com/h/pixeldroid/fragments/CameraFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/CameraFragment.kt index ffcb80dd..05249f8f 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/CameraFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/CameraFragment.kt @@ -220,7 +220,7 @@ class CameraFragment : Fragment() { ) // Attach the viewfinder's surface provider to preview use case - preview?.setSurfaceProvider(viewFinder.createSurfaceProvider()) + preview?.setSurfaceProvider(viewFinder.surfaceProvider) } catch (exc: Exception) { Log.e(TAG, "Use case binding failed", exc) } diff --git a/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt index d3e0d12b..5d84cc87 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/SearchDiscoverFragment.kt @@ -9,28 +9,27 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.* +import androidx.annotation.StringRes import androidx.appcompat.widget.SearchView -import androidx.core.content.ContextCompat.getSystemService import androidx.fragment.app.Fragment import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import com.google.android.material.textview.MaterialTextView import com.h.pixeldroid.Pixeldroid import com.h.pixeldroid.PostActivity import com.h.pixeldroid.R -import com.h.pixeldroid.SearchActivity import com.h.pixeldroid.api.PixelfedAPI import com.h.pixeldroid.db.AppDatabase import com.h.pixeldroid.di.PixelfedAPIHolder import com.h.pixeldroid.objects.DiscoverPost import com.h.pixeldroid.objects.DiscoverPosts import com.h.pixeldroid.objects.Status -import com.h.pixeldroid.utils.DBUtils import com.h.pixeldroid.utils.ImageConverter +import com.mikepenz.iconics.IconicsColor import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial -import com.mikepenz.iconics.utils.padding +import com.mikepenz.iconics.utils.color +import com.mikepenz.iconics.utils.colorInt import com.mikepenz.iconics.utils.paddingDp import com.mikepenz.iconics.utils.sizeDp import kotlinx.android.synthetic.main.fragment_search.* @@ -85,6 +84,7 @@ class SearchDiscoverFragment : Fragment() { discoverText.setCompoundDrawables(IconicsDrawable(requireContext(), GoogleMaterial.Icon.gmd_explore).apply { sizeDp = 24 paddingDp = 20 + color = IconicsColor.colorRes(R.color.colorDrawing) }, null, null, null) return view @@ -107,12 +107,24 @@ class SearchDiscoverFragment : Fragment() { } } + fun showError(@StringRes errorText: Int = R.string.loading_toast, show: Boolean = true){ + if(show){ + motionLayout.transitionToEnd() + } else { + motionLayout.transitionToStart() + } + discoverRefreshLayout.isRefreshing = false + discoverProgressBar.visibility = View.GONE + } + + private fun getDiscover() { api.discover("Bearer $accessToken") .enqueue(object : Callback { override fun onFailure(call: Call, t: Throwable) { + showError() Log.e("SearchDiscoverFragment:", t.toString()) } @@ -120,8 +132,10 @@ class SearchDiscoverFragment : Fragment() { if(response.code() == 200) { val discoverPosts = response.body()!! adapter.addPosts(discoverPosts.posts) - discoverProgressBar.visibility = View.GONE - discoverRefreshLayout.isRefreshing = false + showError(show = false) + } + else { + showError() } } }) diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/AccountListFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/AccountListFragment.kt index e4cea898..858baede 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/AccountListFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/AccountListFragment.kt @@ -72,6 +72,8 @@ open class AccountListFragment : FeedFragment() { }) swipeRefreshLayout.setOnRefreshListener { + showError(show = false) + //by invalidating data, loadInitial will be called again factory.liveData.value!!.invalidate() } @@ -135,14 +137,14 @@ open class AccountListFragment : FeedFragment() { val data = response.body()!! callback.onResult(data) } else{ - Toast.makeText(context, getString(R.string.loading_toast), Toast.LENGTH_SHORT).show() + showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call>, t: Throwable) { - Toast.makeText(context, getString(R.string.feed_failed), Toast.LENGTH_SHORT).show() + showError(errorText = R.string.feed_failed) Log.e("AccountListFragment", t.toString()) } }) diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt index 17c43c22..eade4d3a 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/FeedFragment.kt @@ -1,11 +1,14 @@ -package com.h.pixeldroid.fragments.feeds + package com.h.pixeldroid.fragments.feeds import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup import android.widget.ProgressBar +import androidx.annotation.StringRes import androidx.fragment.app.Fragment import androidx.lifecycle.MutableLiveData import androidx.paging.DataSource @@ -22,6 +25,7 @@ import com.h.pixeldroid.db.AppDatabase import com.h.pixeldroid.db.UserDatabaseEntity import com.h.pixeldroid.di.PixelfedAPIHolder import com.h.pixeldroid.objects.FeedContent +import kotlinx.android.synthetic.main.fragment_feed.* import kotlinx.android.synthetic.main.fragment_feed.view.* import retrofit2.Call import javax.inject.Inject @@ -65,6 +69,16 @@ open class FeedFragment: Fragment() { return view } + fun showError(@StringRes errorText: Int = R.string.loading_toast, show: Boolean = true){ + if(show){ + errorLayout.visibility = VISIBLE + progressBar.visibility = GONE + } else { + errorLayout.visibility = GONE + progressBar.visibility = VISIBLE + } + } + open inner class FeedDataSourceFactory( private val dataSource: FeedDataSource ): DataSource.Factory() { diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/NotificationsFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/NotificationsFragment.kt index ef9e2293..505ff79a 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/NotificationsFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/NotificationsFragment.kt @@ -10,7 +10,6 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView -import android.widget.Toast import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import androidx.paging.LivePagedListBuilder @@ -86,6 +85,8 @@ class NotificationsFragment : FeedFragment() { }) swipeRefreshLayout.setOnRefreshListener { + showError(show = false) + //by invalidating data, loadInitial will be called again factory.liveData.value!!.invalidate() } @@ -125,15 +126,15 @@ class NotificationsFragment : FeedFragment() { if (response.isSuccessful && response.body() != null) { val data = response.body()!! callback.onResult(data) - } else{ - Toast.makeText(context, getString(R.string.loading_toast), Toast.LENGTH_SHORT).show() + } else { + showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call>, t: Throwable) { - Toast.makeText(context, getString(R.string.feed_failed), Toast.LENGTH_SHORT).show() + showError(errorText = R.string.feed_failed) Log.e("NotificationsFragment", t.toString()) } }) diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/HomeTimelineFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/HomeTimelineFragment.kt index 3bfa99dc..99152f88 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/HomeTimelineFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/HomeTimelineFragment.kt @@ -53,15 +53,15 @@ class HomeTimelineFragment: PostsFeedFragment() { val notifications = response.body()!! callback.onResult(notifications) DBUtils.storePosts(db, notifications, user!!) - } else{ - Toast.makeText(context, getString(R.string.loading_toast), Toast.LENGTH_SHORT).show() + } else { + showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call>, t: Throwable) { - Toast.makeText(context, getString(R.string.feed_failed), Toast.LENGTH_SHORT).show() + showError(errorText = R.string.feed_failed) Log.e("PostsFeedFragment", t.toString()) } }) diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PostsFeedFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PostsFeedFragment.kt index 19840f73..087816b1 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PostsFeedFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PostsFeedFragment.kt @@ -68,6 +68,8 @@ abstract class PostsFeedFragment : FeedFragment() { }) swipeRefreshLayout.setOnRefreshListener { + showError(show = false) + //by invalidating data, loadInitial will be called again factory.liveData.value!!.invalidate() } diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PublicTimelineFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PublicTimelineFragment.kt index 6810b55f..a78921a7 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PublicTimelineFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/postFeeds/PublicTimelineFragment.kt @@ -34,14 +34,14 @@ class PublicTimelineFragment: PostsFeedFragment() { val notifications = response.body()!! callback.onResult(notifications) } else{ - Toast.makeText(context, getString(R.string.loading_toast), Toast.LENGTH_SHORT).show() + showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call>, t: Throwable) { - Toast.makeText(context, getString(R.string.feed_failed), Toast.LENGTH_SHORT).show() + showError(errorText = R.string.feed_failed) Log.e("PublicTimelineFragment", t.toString()) } }) diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchAccountFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchAccountFragment.kt index 2aba7323..92aa2b51 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchAccountFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchAccountFragment.kt @@ -77,14 +77,14 @@ class SearchAccountFragment: AccountListFragment(){ callback.onResult(notifications as List) } else{ - Toast.makeText(context, getString(R.string.loading_toast), Toast.LENGTH_SHORT).show() + showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call, t: Throwable) { - Toast.makeText(context,getString(R.string.feed_failed), Toast.LENGTH_SHORT).show() + showError(errorText = R.string.feed_failed) Log.e("FeedFragment", t.toString()) } }) diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchHashtagFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchHashtagFragment.kt index 378ec858..8a1220eb 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchHashtagFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchHashtagFragment.kt @@ -59,6 +59,8 @@ class SearchHashtagFragment: FeedFragment(){ }) swipeRefreshLayout.setOnRefreshListener { + showError(show = false) + //by invalidating data, loadInitial will be called again factory.liveData.value!!.invalidate() } @@ -107,14 +109,14 @@ class SearchHashtagFragment: FeedFragment(){ callback.onResult(notifications as List) } else{ - Toast.makeText(context,getString(R.string.loading_toast), Toast.LENGTH_SHORT).show() + showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call, t: Throwable) { - Toast.makeText(context,getString(R.string.feed_failed), Toast.LENGTH_SHORT).show() + showError(errorText = R.string.feed_failed) Log.e("FeedFragment", t.toString()) } }) diff --git a/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchPostsFragment.kt b/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchPostsFragment.kt index 6fc44bd2..76a50c64 100644 --- a/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchPostsFragment.kt +++ b/app/src/main/java/com/h/pixeldroid/fragments/feeds/search/SearchPostsFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import androidx.lifecycle.LiveData import androidx.paging.LivePagedListBuilder import androidx.paging.PagedList +import com.h.pixeldroid.R import com.h.pixeldroid.fragments.feeds.FeedFragment import com.h.pixeldroid.fragments.feeds.postFeeds.PostsFeedFragment import com.h.pixeldroid.objects.Results @@ -68,15 +69,15 @@ class SearchPostsFragment: PostsFeedFragment(){ if (response.code() == 200) { val notifications = response.body()!!.statuses as ArrayList callback.onResult(notifications as List) - - } else{ - Log.e("FeedFragment", "got response code ${response.code()}") + } else { + showError() } swipeRefreshLayout.isRefreshing = false loadingIndicator.visibility = View.GONE } override fun onFailure(call: Call, t: Throwable) { + showError(errorText = R.string.feed_failed) Log.e("FeedFragment", t.toString()) } }) diff --git a/app/src/main/res/drawable/red_panda.xml b/app/src/main/res/drawable/red_panda.xml new file mode 100644 index 00000000..75ad75e5 --- /dev/null +++ b/app/src/main/res/drawable/red_panda.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_feed.xml b/app/src/main/res/layout/fragment_feed.xml index 4af4aaa1..7dc6c43e 100644 --- a/app/src/main/res/layout/fragment_feed.xml +++ b/app/src/main/res/layout/fragment_feed.xml @@ -1,22 +1,22 @@ - + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layoutManager="LinearLayoutManager" /> @@ -24,5 +24,52 @@ android:id="@+id/progressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" /> - \ No newline at end of file + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 2b5ddda1..d14778e8 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -40,24 +40,71 @@ - + app:layoutDescription="@xml/fragment_search_xml_error_scene" + app:layout_constraintBottom_toTopOf="@+id/discoverList" + app:layout_constraintTop_toTopOf="@+id/discoverList"> + + + + + + + + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/discoverErrorLayout" /> + + android:nestedScrollingEnabled="false" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/discoverText" /> - + diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index c2956ca8..36e7a788 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -2,15 +2,8 @@ #FFFFFF #6200EE - #6200EE - #3700B3 - #03DAC5 - #6200EE - #FFFFFF - #8A8889 - #221F20 - #FF0000 #000000 + #FFFFFF diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0b6f95e6..6c5cfbe9 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -14,4 +14,5 @@ #221F20 #FF0000 #FFFFFF + #000000 diff --git a/app/src/main/res/xml/fragment_search_xml_error_scene.xml b/app/src/main/res/xml/fragment_search_xml_error_scene.xml new file mode 100644 index 00000000..6eec7cf3 --- /dev/null +++ b/app/src/main/res/xml/fragment_search_xml_error_scene.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 94e8840f..466e1801 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.0' + ext.kotlin_version = '1.4.10' repositories { google() jcenter()