From 5fa93e0ee8110a3db6dda91da48119864fddd32e Mon Sep 17 00:00:00 2001 From: Hossain Khan Date: Thu, 6 Jun 2019 18:48:45 -0400 Subject: [PATCH 1/2] [ADDED] Error handling for the resources section --- .../android/demo/data/ResourceResult.kt | 26 +++++++++++++++++++ .../ui/resource/LearningResourceActivity.kt | 13 +++++++++- .../ui/resource/LearningResourceViewModel.kt | 16 +++++++++--- app/src/main/res/values/dimens.xml | 8 +++++- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/hossainkhan/android/demo/data/ResourceResult.kt diff --git a/app/src/main/java/com/hossainkhan/android/demo/data/ResourceResult.kt b/app/src/main/java/com/hossainkhan/android/demo/data/ResourceResult.kt new file mode 100644 index 0000000..c6fd572 --- /dev/null +++ b/app/src/main/java/com/hossainkhan/android/demo/data/ResourceResult.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2019 Hossain Khan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hossainkhan.android.demo.data + + +/** + * A class to represent external resource request with data or error on fail. + */ +class ResourceResult( + val resources: List = emptyList(), + val error: Exception? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceActivity.kt b/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceActivity.kt index 5f53ba8..f29f616 100644 --- a/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceActivity.kt +++ b/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceActivity.kt @@ -21,11 +21,13 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout import androidx.databinding.DataBindingUtil import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.snackbar.Snackbar import com.hossainkhan.android.demo.R import com.hossainkhan.android.demo.data.ResourceInfo import com.hossainkhan.android.demo.databinding.ActivityLearningResourceBinding @@ -34,6 +36,9 @@ import dagger.android.AndroidInjection import timber.log.Timber import javax.inject.Inject +/** + * This activity lists external resources on [ConstraintLayout], such as tech talks on youtube. + */ class LearningResourceActivity : AppCompatActivity() { @Inject @@ -69,7 +74,13 @@ class LearningResourceActivity : AppCompatActivity() { } viewModel.data.observe(this, Observer { result -> - ideaListAdapter.submitList(result) + if (result?.error != null) { + Timber.w(result.error, "Unable to load resources.") + Snackbar.make(binding.root, R.string.message_resource_load_failed, Snackbar.LENGTH_INDEFINITE).show() + return@Observer + } else { + ideaListAdapter.submitList(result.resources) + } }) } diff --git a/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceViewModel.kt b/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceViewModel.kt index 99048ca..d937697 100644 --- a/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceViewModel.kt +++ b/app/src/main/java/com/hossainkhan/android/demo/ui/resource/LearningResourceViewModel.kt @@ -24,9 +24,10 @@ import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.Query import com.google.firebase.firestore.QuerySnapshot import com.hossainkhan.android.demo.data.ResourceInfo +import com.hossainkhan.android.demo.data.ResourceResult import timber.log.Timber -import java.lang.Exception import javax.inject.Inject +import kotlin.Exception class LearningResourceViewModel @Inject constructor( firestore: FirebaseFirestore @@ -37,8 +38,8 @@ class LearningResourceViewModel @Inject constructor( val isLoading = ObservableField(true) - private val _data = MutableLiveData>() - val data: LiveData> = _data + private val _data = MutableLiveData() + val data: LiveData = _data private val resourceData = mutableListOf() @@ -49,6 +50,12 @@ class LearningResourceViewModel @Inject constructor( .get() .addOnSuccessListener(this::updateResources) .addOnFailureListener(this::onLoadFailed) + .addOnCompleteListener { + if (it.result?.isEmpty == true) { + Timber.i("Completed with no data. This is likely due to no internet.") + onLoadFailed(Exception("No data")) + } + } } private fun updateResources(result: QuerySnapshot) { @@ -58,11 +65,12 @@ class LearningResourceViewModel @Inject constructor( resourceData.add(x) } isLoading.set(false) - _data.value = resourceData + _data.value = ResourceResult(resourceData) } private fun onLoadFailed(exception: Exception) { Timber.w(exception, "Error getting documents.") isLoading.set(false) + _data.value = ResourceResult(error = exception) } } \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 2b59119..0432c5c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -24,7 +24,13 @@ - https://developer.android.com/guide/topics/resources/providing-resources - https://developer.android.com/training/multiscreen/screensizes --> - + + + 4 + 40dp 80dp 120dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cd59157..cdd34c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,5 +26,5 @@ External Resources by %1$s at %2$s Published on %1$s - + Unable to load external resources. This is likely due to no internet connectivity. Please try re-loading this screen with network connection. From 06ad3b5074c31d1868cf33c4052159cc90e4a186 Mon Sep 17 00:00:00 2001 From: Hossain Khan Date: Thu, 6 Jun 2019 19:01:02 -0400 Subject: [PATCH 2/2] [ADDED] Github vector logo in case needed in future. --- app/src/main/res/drawable/ic_github_logo.xml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 app/src/main/res/drawable/ic_github_logo.xml diff --git a/app/src/main/res/drawable/ic_github_logo.xml b/app/src/main/res/drawable/ic_github_logo.xml new file mode 100644 index 0000000..877ff68 --- /dev/null +++ b/app/src/main/res/drawable/ic_github_logo.xml @@ -0,0 +1,4 @@ + + +