From 07ee020e3d8790f7988a2075dea9c34c2d0dc150 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 07:57:39 +0900 Subject: [PATCH 01/16] =?UTF-8?q?ref:=20=E3=83=87=E3=82=A3=E3=83=AC?= =?UTF-8?q?=E3=82=AF=E3=83=88=E3=83=AA=E6=A7=8B=E6=88=90=E3=82=92feature?= =?UTF-8?q?=20=E3=83=95=E3=82=A1=E3=83=BC=E3=82=B9=E3=83=88=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code_check/{ => core/entity}/RepositoryItem.kt | 2 +- .../presenter/detail}/RepositoryDetailFragment.kt | 4 +++- .../search}/RepositoryListRecyclerViewAdapter.kt | 7 +++++-- .../presenter/search}/RepositorySearchFragment.kt | 13 +++++++------ .../presenter/search}/RepositorySearchViewModel.kt | 5 +++-- .../code_check/{ => core/utils}/DialogHelper.kt | 2 +- .../github/reposiotory/NetworkRepository.kt | 2 +- app/src/main/res/navigation/nav_graph.xml | 6 +++--- 8 files changed, 24 insertions(+), 17 deletions(-) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/{ => core/entity}/RepositoryItem.kt (85%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/{ => core/presenter/detail}/RepositoryDetailFragment.kt (90%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/{ => core/presenter/search}/RepositoryListRecyclerViewAdapter.kt (92%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/{ => core/presenter/search}/RepositorySearchFragment.kt (89%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/{ => core/presenter/search}/RepositorySearchViewModel.kt (93%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/{ => core/utils}/DialogHelper.kt (87%) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryItem.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/entity/RepositoryItem.kt similarity index 85% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryItem.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/core/entity/RepositoryItem.kt index fd37b26..1136dce 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryItem.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/entity/RepositoryItem.kt @@ -1,4 +1,4 @@ -package jp.co.yumemi.android.code_check +package jp.co.yumemi.android.code_check.core.entity import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryDetailFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/detail/RepositoryDetailFragment.kt similarity index 90% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryDetailFragment.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/detail/RepositoryDetailFragment.kt index aee80a0..f15eb98 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryDetailFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/detail/RepositoryDetailFragment.kt @@ -1,13 +1,15 @@ /* * Copyright © 2021 YUMEMI Inc. All rights reserved. */ -package jp.co.yumemi.android.code_check +package jp.co.yumemi.android.code_check.core.presenter.detail import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.navigation.fragment.navArgs import coil.load +import jp.co.yumemi.android.code_check.R +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.databinding.FragmentRepositoryDetailBinding class RepositoryDetailFragment : Fragment(R.layout.fragment_repository_detail) { diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryListRecyclerViewAdapter.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositoryListRecyclerViewAdapter.kt similarity index 92% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryListRecyclerViewAdapter.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositoryListRecyclerViewAdapter.kt index ef587e4..2fbb405 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositoryListRecyclerViewAdapter.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositoryListRecyclerViewAdapter.kt @@ -1,4 +1,4 @@ -package jp.co.yumemi.android.code_check +package jp.co.yumemi.android.code_check.core.presenter.search import android.view.LayoutInflater import android.view.View @@ -7,6 +7,9 @@ import android.widget.TextView import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import jp.co.yumemi.android.code_check.R +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem + /** * DiffUtilの実装 @@ -69,4 +72,4 @@ class RepositoryListRecyclerViewAdapter( ) { holder.bind(getItem(position), itemClickListener) } -} +} \ No newline at end of file diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositorySearchFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt similarity index 89% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositorySearchFragment.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt index 7cb77e9..6220f96 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositorySearchFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt @@ -1,7 +1,4 @@ -/* - * Copyright © 2021 YUMEMI Inc. All rights reserved. - */ -package jp.co.yumemi.android.code_check +package jp.co.yumemi.android.code_check.core.presenter.search import android.os.Bundle import android.view.View @@ -11,6 +8,9 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager +import jp.co.yumemi.android.code_check.R +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem +import jp.co.yumemi.android.code_check.core.utils.DialogHelper import jp.co.yumemi.android.code_check.databinding.FragmentRepositorySearchBinding class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { @@ -52,7 +52,8 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { private fun setupRecyclerView() { val layoutManager = LinearLayoutManager(requireContext()) - val dividerItemDecoration = DividerItemDecoration(requireContext(), layoutManager.orientation) + val dividerItemDecoration = + DividerItemDecoration(requireContext(), layoutManager.orientation) binding.recyclerView.apply { this.layoutManager = layoutManager @@ -87,4 +88,4 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { super.onDestroyView() _binding = null } -} +} \ No newline at end of file diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt similarity index 93% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositorySearchViewModel.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 5f764f1..87be99f 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -1,4 +1,4 @@ -package jp.co.yumemi.android.code_check +package jp.co.yumemi.android.code_check.core.presenter.search import android.app.Application import android.util.Log @@ -6,6 +6,7 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkRepository import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkResult @@ -49,4 +50,4 @@ class RepositorySearchViewModel(application: Application) : AndroidViewModel(app } } } -} +} \ No newline at end of file diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/DialogHelper.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/utils/DialogHelper.kt similarity index 87% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/DialogHelper.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/core/utils/DialogHelper.kt index 332118f..5798c1b 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/DialogHelper.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/utils/DialogHelper.kt @@ -1,4 +1,4 @@ -package jp.co.yumemi.android.code_check +package jp.co.yumemi.android.code_check.core.utils import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/NetworkRepository.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/NetworkRepository.kt index 7014dcc..5a6f7b9 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/NetworkRepository.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/NetworkRepository.kt @@ -3,7 +3,7 @@ package jp.co.yumemi.android.code_check.features.github.reposiotory import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities -import jp.co.yumemi.android.code_check.RepositoryItem +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.api.GitHubRepositoryApi import jp.co.yumemi.android.code_check.features.github.api.GitHubRepositoryApiImpl import org.json.JSONException diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 01e13df..ea34d7b 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -7,7 +7,7 @@ + app:argType="jp.co.yumemi.android.code_check.core.entity.RepositoryItem" /> From b13dd79dd604767f05ea01e81730d2e65bae75f9 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 08:07:21 +0900 Subject: [PATCH 02/16] =?UTF-8?q?ref:=20=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E5=90=8D=E3=81=AE=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/{GitHubRepositoryApi.kt => GitHubServiceApi.kt} | 2 +- ...lderInterface.kt => GitHubServiceApiBuilderInterface.kt} | 2 +- .../{GitHubRepositoryApiImpl.kt => GitHubServiceApiImpl.kt} | 4 ++-- .../{GitHubRepositoryEntity.kt => GitHubServiceEntity.kt} | 0 .../{NetworkRepository.kt => GitHubServiceRepository.kt} | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/{GitHubRepositoryApi.kt => GitHubServiceApi.kt} (86%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/{GitHubRepositoryApiBuilderInterface.kt => GitHubServiceApiBuilderInterface.kt} (88%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/{GitHubRepositoryApiImpl.kt => GitHubServiceApiImpl.kt} (94%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/entity/{GitHubRepositoryEntity.kt => GitHubServiceEntity.kt} (100%) rename app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/{NetworkRepository.kt => GitHubServiceRepository.kt} (95%) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApi.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApi.kt similarity index 86% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApi.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApi.kt index 4066a49..8a51f27 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApi.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApi.kt @@ -2,6 +2,6 @@ package jp.co.yumemi.android.code_check.features.github.api import jp.co.yumemi.android.code_check.features.github.entity.RepositoryList -interface GitHubRepositoryApi { +interface GitHubServiceApi { suspend fun getRepository(searchWord: String): RepositoryList } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApiBuilderInterface.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApiBuilderInterface.kt similarity index 88% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApiBuilderInterface.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApiBuilderInterface.kt index a63ec4f..fcc38eb 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApiBuilderInterface.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApiBuilderInterface.kt @@ -5,7 +5,7 @@ import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Query -interface GitHubRepositoryApiBuilderInterface { +interface GitHubServiceApiBuilderInterface { @GET("/search/repositories") suspend fun getRepository( @Query("q") searchWord: String, diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApiImpl.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApiImpl.kt similarity index 94% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApiImpl.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApiImpl.kt index bf8f356..e1997e0 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubRepositoryApiImpl.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/api/GitHubServiceApiImpl.kt @@ -10,7 +10,7 @@ import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory -class GitHubRepositoryApiImpl : GitHubRepositoryApi { +class GitHubServiceApiImpl : GitHubServiceApi { companion object { val client = OkHttpClient.Builder() @@ -37,7 +37,7 @@ class GitHubRepositoryApiImpl : GitHubRepositoryApi { .client(client) .addConverterFactory(MoshiConverterFactory.create(moshi)) .build() - .create(GitHubRepositoryApiBuilderInterface::class.java) + .create(GitHubServiceApiBuilderInterface::class.java) } override suspend fun getRepository(searchWord: String): RepositoryList { diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/entity/GitHubRepositoryEntity.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/entity/GitHubServiceEntity.kt similarity index 100% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/entity/GitHubRepositoryEntity.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/entity/GitHubServiceEntity.kt diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/NetworkRepository.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt similarity index 95% rename from app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/NetworkRepository.kt rename to app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt index 5a6f7b9..319ba2e 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/NetworkRepository.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt @@ -4,8 +4,8 @@ import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities import jp.co.yumemi.android.code_check.core.entity.RepositoryItem -import jp.co.yumemi.android.code_check.features.github.api.GitHubRepositoryApi -import jp.co.yumemi.android.code_check.features.github.api.GitHubRepositoryApiImpl +import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApi +import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApiImpl import org.json.JSONException sealed class NetworkResult { @@ -15,7 +15,7 @@ sealed class NetworkResult { } class NetworkRepository( - private val gitHubRepositoryApi: GitHubRepositoryApi = GitHubRepositoryApiImpl(), + private val gitHubRepositoryApi: GitHubServiceApi = GitHubServiceApiImpl(), ) { suspend fun fetchSearchResults( inputText: String, From 0d5270247ef9f07d3c41ecd51b5dc20d3d0dab2d Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 08:43:12 +0900 Subject: [PATCH 03/16] =?UTF-8?q?ref:=20=E3=81=96=E3=81=A3=E3=81=8F?= =?UTF-8?q?=E3=82=8AUsecase=E3=81=A8Repository=E3=82=92=E5=88=86=E3=81=91?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/RepositorySearchViewModel.kt | 6 ++-- .../reposiotory/GitHubServiceRepository.kt | 25 ++--------------- .../github/usecase/GitHubServiceUsecase.kt | 28 +++++++++++++++++++ .../features/github/utils/NetworkResult.kt | 9 ++++++ 4 files changed, 42 insertions(+), 26 deletions(-) create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 87be99f..08e220f 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -8,8 +8,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException -import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkRepository -import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkResult +import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecase +import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult import kotlinx.coroutines.launch /** @@ -17,7 +17,7 @@ import kotlinx.coroutines.launch */ class RepositorySearchViewModel(application: Application) : AndroidViewModel(application) { private val appContext = application - private val networkRepository = NetworkRepository() + private val networkRepository = GitHubServiceUsecase() private val _errorMessage = MutableLiveData() val errorMessage: LiveData get() = _errorMessage diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt index 319ba2e..ed8899a 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt @@ -1,30 +1,17 @@ package jp.co.yumemi.android.code_check.features.github.reposiotory -import android.content.Context -import android.net.ConnectivityManager -import android.net.NetworkCapabilities import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApi import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApiImpl +import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult import org.json.JSONException -sealed class NetworkResult { - data class Success(val data: T) : NetworkResult() - - data class Error(val exception: NetworkException) : NetworkResult() -} - -class NetworkRepository( +class GitHubServiceRepository( private val gitHubRepositoryApi: GitHubServiceApi = GitHubServiceApiImpl(), ) { suspend fun fetchSearchResults( inputText: String, - context: Context, ): NetworkResult> { - if (!isNetworkAvailable(context)) { - return NetworkResult.Error(NetworkException("オフライン状態です")) - } - return try { val repositoryList = gitHubRepositoryApi.getRepository(inputText) val items = @@ -46,14 +33,6 @@ class NetworkRepository( NetworkResult.Error(NetworkException("ネットワークエラー", e)) } } - - private fun isNetworkAvailable(context: Context): Boolean { - val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - - val network = connectivityManager.activeNetwork ?: return false - val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false - return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - } } class NetworkException(message: String, cause: Throwable? = null) : Exception(message, cause) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt new file mode 100644 index 0000000..120b16e --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt @@ -0,0 +1,28 @@ +package jp.co.yumemi.android.code_check.features.github.usecase + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem +import jp.co.yumemi.android.code_check.features.github.reposiotory.GitHubServiceRepository +import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException +import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult + +class GitHubServiceUsecase( + private val repository: GitHubServiceRepository = GitHubServiceRepository() +) { + suspend fun fetchSearchResults(inputText: String, context: Context): NetworkResult> { + if (!isNetworkAvailable(context)) { + throw NetworkException("オフライン状態です") + } + return repository.fetchSearchResults(inputText) + } + + private fun isNetworkAvailable(context: Context): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } +} diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt new file mode 100644 index 0000000..fefd6f7 --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt @@ -0,0 +1,9 @@ +package jp.co.yumemi.android.code_check.features.github.utils + +import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException + +sealed class NetworkResult { + data class Success(val data: T) : NetworkResult() + + data class Error(val exception: NetworkException) : NetworkResult() +} \ No newline at end of file From 63c9ca5ddc05ed25f7674640034fb5bdf33da4a3 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 08:50:24 +0900 Subject: [PATCH 04/16] =?UTF-8?q?add:=20hilt=E3=81=AE=E5=B0=8E=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 13 ++++++++++--- build.gradle | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1d1e3f1..b668b5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,7 @@ plugins { id 'kotlin-parcelize' id 'androidx.navigation.safeargs.kotlin' id("org.jlleitschuh.gradle.ktlint") version "12.1.2" + id 'com.google.dagger.hilt.android' } android { @@ -28,11 +29,11 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = '17' + jvmTarget = '1.8' } buildFeatures { viewBinding true @@ -63,6 +64,8 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' + implementation "com.google.dagger:hilt-android:2.51.1" + kapt "com.google.dagger:hilt-compiler:2.51.1" // Retrofit implementation("com.squareup.retrofit2:converter-moshi:2.9.0") @@ -70,3 +73,7 @@ dependencies { implementation("com.squareup.retrofit2:retrofit:2.11.0") implementation("com.squareup.moshi:moshi-kotlin:1.14.0") } + +kapt { + correctErrorTypes true +} diff --git a/build.gradle b/build.gradle index 27c3380..2d534d6 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ buildscript { classpath 'com.android.tools.build:gradle:8.7.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.8.5" + classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 828615550b43414a3a7209bc2ffda7bc97c34320 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 10:27:30 +0900 Subject: [PATCH 05/16] =?UTF-8?q?add:=20hilt=E3=81=AE=E5=B0=8E=E5=85=A5?= =?UTF-8?q?=E3=81=97=E3=81=A6=E4=BE=9D=E5=AD=98=E6=80=A7=E3=81=AE=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E3=82=92=E8=A1=8C=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 3 +- .../code_check/CodeCheckApplication.kt | 7 ++++ .../android/code_check/CodeCheckModule.kt | 38 +++++++++++++++++++ .../yumemi/android/code_check/TopActivity.kt | 2 + .../detail/RepositoryDetailFragment.kt | 2 + .../RepositoryListRecyclerViewAdapter.kt | 3 +- .../search/RepositorySearchFragment.kt | 12 ++++-- .../search/RepositorySearchViewModel.kt | 18 ++++++--- .../reposiotory/GitHubServiceRepository.kt | 34 +---------------- .../GitHubServiceRepositoryImpl.kt | 38 +++++++++++++++++++ .../github/usecase/GitHubServiceUsecase.kt | 26 +++---------- .../usecase/GitHubServiceUsecaseImpl.kt | 34 +++++++++++++++++ .../features/github/utils/NetworkResult.kt | 2 +- build.gradle | 4 +- 15 files changed, 156 insertions(+), 71 deletions(-) create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckApplication.kt create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckModule.kt create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt diff --git a/app/build.gradle b/app/build.gradle index b668b5b..abdc496 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,8 +64,8 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' - implementation "com.google.dagger:hilt-android:2.51.1" - kapt "com.google.dagger:hilt-compiler:2.51.1" + implementation "com.google.dagger:hilt-android:2.55" + kapt "com.google.dagger:hilt-compiler:2.55" // Retrofit implementation("com.squareup.retrofit2:converter-moshi:2.9.0") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 85fb0a2..2e1287a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,8 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.AndroidEngineerCodeCheck" - android:fullBackupContent="@xml/backup_descriptor"> + android:fullBackupContent="@xml/backup_descriptor" + android:name=".CodeCheckApplication"> diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckApplication.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckApplication.kt new file mode 100644 index 0000000..39efc83 --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckApplication.kt @@ -0,0 +1,7 @@ +package jp.co.yumemi.android.code_check + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class CodeCheckApplication : Application() diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckModule.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckModule.kt new file mode 100644 index 0000000..486fcf9 --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/CodeCheckModule.kt @@ -0,0 +1,38 @@ +package jp.co.yumemi.android.code_check + +import dagger.Binds +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApi +import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApiImpl +import jp.co.yumemi.android.code_check.features.github.reposiotory.GitHubServiceRepository +import jp.co.yumemi.android.code_check.features.github.reposiotory.GitHubServiceRepositoryImpl +import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecase +import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecaseImpl +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class GitHubUsecaseModule { + @Singleton + @Binds + abstract fun provideGitHubServiceUsecase(impl: GitHubServiceUsecaseImpl): GitHubServiceUsecase +} + +@Module +@InstallIn(SingletonComponent::class) +abstract class GitHubRepositoryModule { + @Singleton + @Binds + abstract fun provideGitHubServiceRepository(impl: GitHubServiceRepositoryImpl): GitHubServiceRepository + + companion object { + @Provides + @Singleton + fun provideGitHubServiceApi(): GitHubServiceApi { + return GitHubServiceApiImpl() + } + } +} diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/TopActivity.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/TopActivity.kt index d6cc54e..926636a 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/TopActivity.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/TopActivity.kt @@ -4,5 +4,7 @@ package jp.co.yumemi.android.code_check import androidx.appcompat.app.AppCompatActivity +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class TopActivity : AppCompatActivity(R.layout.activity_top) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/detail/RepositoryDetailFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/detail/RepositoryDetailFragment.kt index f15eb98..614ee71 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/detail/RepositoryDetailFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/detail/RepositoryDetailFragment.kt @@ -8,10 +8,12 @@ import android.view.View import androidx.fragment.app.Fragment import androidx.navigation.fragment.navArgs import coil.load +import dagger.hilt.android.AndroidEntryPoint import jp.co.yumemi.android.code_check.R import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.databinding.FragmentRepositoryDetailBinding +@AndroidEntryPoint class RepositoryDetailFragment : Fragment(R.layout.fragment_repository_detail) { private val args: RepositoryDetailFragmentArgs by navArgs() diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositoryListRecyclerViewAdapter.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositoryListRecyclerViewAdapter.kt index 2fbb405..f0d1656 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositoryListRecyclerViewAdapter.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositoryListRecyclerViewAdapter.kt @@ -10,7 +10,6 @@ import androidx.recyclerview.widget.RecyclerView import jp.co.yumemi.android.code_check.R import jp.co.yumemi.android.code_check.core.entity.RepositoryItem - /** * DiffUtilの実装 */ @@ -72,4 +71,4 @@ class RepositoryListRecyclerViewAdapter( ) { holder.bind(getItem(position), itemClickListener) } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt index 6220f96..e8c89b3 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt @@ -4,19 +4,22 @@ import android.os.Bundle import android.view.View import android.view.inputmethod.EditorInfo import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager +import dagger.hilt.android.AndroidEntryPoint import jp.co.yumemi.android.code_check.R import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.core.utils.DialogHelper import jp.co.yumemi.android.code_check.databinding.FragmentRepositorySearchBinding +@AndroidEntryPoint class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { private var _binding: FragmentRepositorySearchBinding? = null private val binding get() = _binding ?: throw IllegalStateException("Binding is null") - private lateinit var viewModel: RepositorySearchViewModel + private val viewModel: RepositorySearchViewModel by viewModels() private val adapter by lazy { RepositoryListRecyclerViewAdapter( @@ -34,7 +37,8 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { ) { super.onViewCreated(view, savedInstanceState) _binding = FragmentRepositorySearchBinding.bind(view) - viewModel = ViewModelProvider(this)[RepositorySearchViewModel::class.java] +// viewModel = ViewModelProvider(this)[RepositorySearchViewModel::class.java] + observeViewModel() setupRecyclerView() @@ -65,7 +69,7 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { private fun setupSearchInput() { binding.searchInputText.setOnEditorActionListener { editText, action, _ -> if (action == EditorInfo.IME_ACTION_SEARCH) { - viewModel.searchRepositories(editText.text.toString().trim()) + viewModel.searchRepositories(editText.text.toString().trim(),requireContext()) true } else { false @@ -88,4 +92,4 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { super.onDestroyView() _binding = null } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 08e220f..337c591 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -1,23 +1,29 @@ package jp.co.yumemi.android.code_check.core.presenter.search import android.app.Application +import android.content.Context import android.util.Log import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecase +import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecaseImpl import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult import kotlinx.coroutines.launch /** * RepositorySearchFragmentで利用するリポジトリ検索用のViewModel */ -class RepositorySearchViewModel(application: Application) : AndroidViewModel(application) { - private val appContext = application - private val networkRepository = GitHubServiceUsecase() +@HiltViewModel +class RepositorySearchViewModel @Inject constructor( + private val networkRepository: GitHubServiceUsecaseImpl +) : ViewModel() { private val _errorMessage = MutableLiveData() val errorMessage: LiveData get() = _errorMessage @@ -29,14 +35,14 @@ class RepositorySearchViewModel(application: Application) : AndroidViewModel(app * GitHubのレポジトリ検索を行う * @param query 検索キーワード */ - fun searchRepositories(query: String) { + fun searchRepositories(query: String,context : Context) { if (query.isBlank()) { _errorMessage.postValue("検索キーワードを入力してください。") return } viewModelScope.launch { try { - val results = networkRepository.fetchSearchResults(query, appContext) + val results = networkRepository.fetchSearchResults(query, context) if (results is NetworkResult.Error) { _errorMessage.postValue(results.exception.message) return@launch @@ -50,4 +56,4 @@ class RepositorySearchViewModel(application: Application) : AndroidViewModel(app } } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt index ed8899a..0ccedef 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepository.kt @@ -1,38 +1,8 @@ package jp.co.yumemi.android.code_check.features.github.reposiotory import jp.co.yumemi.android.code_check.core.entity.RepositoryItem -import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApi -import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApiImpl import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult -import org.json.JSONException -class GitHubServiceRepository( - private val gitHubRepositoryApi: GitHubServiceApi = GitHubServiceApiImpl(), -) { - suspend fun fetchSearchResults( - inputText: String, - ): NetworkResult> { - return try { - val repositoryList = gitHubRepositoryApi.getRepository(inputText) - val items = - repositoryList.items.map { item -> - RepositoryItem( - name = item.name, - ownerIconUrl = item.owner.avatarUrl, - language = item.language ?: "none", - stargazersCount = item.stargazersCount, - watchersCount = item.watchersCount, - forksCount = item.forksCount, - openIssuesCount = item.openIssuesCount, - ) - } - NetworkResult.Success(items) - } catch (e: JSONException) { - NetworkResult.Error(NetworkException("JSONパースエラー", e)) - } catch (e: Exception) { - NetworkResult.Error(NetworkException("ネットワークエラー", e)) - } - } +interface GitHubServiceRepository { + suspend fun fetchSearchResults(inputText: String): NetworkResult> } - -class NetworkException(message: String, cause: Throwable? = null) : Exception(message, cause) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt new file mode 100644 index 0000000..09c358a --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt @@ -0,0 +1,38 @@ +package jp.co.yumemi.android.code_check.features.github.reposiotory + +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem +import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApi +import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult +import org.json.JSONException +import javax.inject.Inject + +class GitHubServiceRepositoryImpl + @Inject + constructor( + private val gitHubRepositoryApi: GitHubServiceApi, + ) : GitHubServiceRepository { + override suspend fun fetchSearchResults(inputText: String): NetworkResult> { + return try { + val repositoryList = gitHubRepositoryApi.getRepository(inputText) + val items = + repositoryList.items.map { item -> + RepositoryItem( + name = item.name, + ownerIconUrl = item.owner.avatarUrl, + language = item.language ?: "none", + stargazersCount = item.stargazersCount, + watchersCount = item.watchersCount, + forksCount = item.forksCount, + openIssuesCount = item.openIssuesCount, + ) + } + NetworkResult.Success(items) + } catch (e: JSONException) { + NetworkResult.Error(NetworkException("JSONパースエラー", e)) + } catch (e: Exception) { + NetworkResult.Error(NetworkException("ネットワークエラー", e)) + } + } + } + +class NetworkException(message: String, cause: Throwable? = null) : Exception(message, cause) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt index 120b16e..c6a0760 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt @@ -1,28 +1,12 @@ package jp.co.yumemi.android.code_check.features.github.usecase import android.content.Context -import android.net.ConnectivityManager -import android.net.NetworkCapabilities import jp.co.yumemi.android.code_check.core.entity.RepositoryItem -import jp.co.yumemi.android.code_check.features.github.reposiotory.GitHubServiceRepository -import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult -class GitHubServiceUsecase( - private val repository: GitHubServiceRepository = GitHubServiceRepository() -) { - suspend fun fetchSearchResults(inputText: String, context: Context): NetworkResult> { - if (!isNetworkAvailable(context)) { - throw NetworkException("オフライン状態です") - } - return repository.fetchSearchResults(inputText) - } - - private fun isNetworkAvailable(context: Context): Boolean { - val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - - val network = connectivityManager.activeNetwork ?: return false - val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false - return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - } +interface GitHubServiceUsecase { + suspend fun fetchSearchResults( + inputText: String, + context: Context, + ): NetworkResult> } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt new file mode 100644 index 0000000..5853681 --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt @@ -0,0 +1,34 @@ +package jp.co.yumemi.android.code_check.features.github.usecase + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem +import jp.co.yumemi.android.code_check.features.github.reposiotory.GitHubServiceRepository +import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException +import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult +import javax.inject.Inject + +class GitHubServiceUsecaseImpl + @Inject + constructor( + private val repository: GitHubServiceRepository, + ) : GitHubServiceUsecase { + override suspend fun fetchSearchResults( + inputText: String, + context: Context, + ): NetworkResult> { + if (!isNetworkAvailable(context)) { + throw NetworkException("オフライン状態です") + } + return repository.fetchSearchResults(inputText) + } + + private fun isNetworkAvailable(context: Context): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } + } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt index fefd6f7..04c1a31 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt @@ -6,4 +6,4 @@ sealed class NetworkResult { data class Success(val data: T) : NetworkResult() data class Error(val exception: NetworkException) : NetworkResult() -} \ No newline at end of file +} diff --git a/build.gradle b/build.gradle index 2d534d6..67879fa 100644 --- a/build.gradle +++ b/build.gradle @@ -6,9 +6,9 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:8.7.3' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.8.5" - classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51.1' + classpath 'com.google.dagger:hilt-android-gradle-plugin:2.55' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 4d6da5b4d78d9b9a62af399b6ba1cdbfaa274d45 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 10:44:17 +0900 Subject: [PATCH 06/16] =?UTF-8?q?ref:=E3=83=AA=E3=83=B3=E3=82=BF=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/RepositorySearchFragment.kt | 4 +- .../search/RepositorySearchViewModel.kt | 69 ++++++++++--------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt index e8c89b3..fd3d492 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt @@ -5,7 +5,6 @@ import android.view.View import android.view.inputmethod.EditorInfo import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager @@ -39,7 +38,6 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { _binding = FragmentRepositorySearchBinding.bind(view) // viewModel = ViewModelProvider(this)[RepositorySearchViewModel::class.java] - observeViewModel() setupRecyclerView() setupSearchInput() @@ -69,7 +67,7 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { private fun setupSearchInput() { binding.searchInputText.setOnEditorActionListener { editText, action, _ -> if (action == EditorInfo.IME_ACTION_SEARCH) { - viewModel.searchRepositories(editText.text.toString().trim(),requireContext()) + viewModel.searchRepositories(editText.text.toString().trim(), requireContext()) true } else { false diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 337c591..5ccd576 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -1,59 +1,60 @@ package jp.co.yumemi.android.code_check.core.presenter.search -import android.app.Application import android.content.Context import android.util.Log -import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException -import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecase import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecaseImpl import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult import kotlinx.coroutines.launch +import javax.inject.Inject /** * RepositorySearchFragmentで利用するリポジトリ検索用のViewModel */ @HiltViewModel -class RepositorySearchViewModel @Inject constructor( - private val networkRepository: GitHubServiceUsecaseImpl -) : ViewModel() { - - private val _errorMessage = MutableLiveData() - val errorMessage: LiveData get() = _errorMessage +class RepositorySearchViewModel + @Inject + constructor( + private val networkRepository: GitHubServiceUsecaseImpl, + ) : ViewModel() { + private val _errorMessage = MutableLiveData() + val errorMessage: LiveData get() = _errorMessage - private val _searchResults = MutableLiveData>() - val searchResults: LiveData> get() = _searchResults + private val _searchResults = MutableLiveData>() + val searchResults: LiveData> get() = _searchResults - /** - * GitHubのレポジトリ検索を行う - * @param query 検索キーワード - */ - fun searchRepositories(query: String,context : Context) { - if (query.isBlank()) { - _errorMessage.postValue("検索キーワードを入力してください。") - return - } - viewModelScope.launch { - try { - val results = networkRepository.fetchSearchResults(query, context) - if (results is NetworkResult.Error) { - _errorMessage.postValue(results.exception.message) - return@launch - } - if (results is NetworkResult.Success) { - _searchResults.postValue(results.data) + /** + * GitHubのレポジトリ検索を行う + * @param query 検索キーワード + */ + fun searchRepositories( + query: String, + context: Context, + ) { + if (query.isBlank()) { + _errorMessage.postValue("検索キーワードを入力してください。") + return + } + viewModelScope.launch { + try { + val results = networkRepository.fetchSearchResults(query, context) + if (results is NetworkResult.Error) { + _errorMessage.postValue(results.exception.message) + return@launch + } + if (results is NetworkResult.Success) { + _searchResults.postValue(results.data) + } + } catch (e: NetworkException) { + Log.e("NetworkException", e.message, e) + _errorMessage.postValue(e.message) } - } catch (e: NetworkException) { - Log.e("NetworkException", e.message, e) - _errorMessage.postValue(e.message) } } } -} From a25aefd8e2065f0f45815eb05c66e10f83704e01 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 10:45:22 +0900 Subject: [PATCH 07/16] =?UTF-8?q?update:=20readme=E3=81=AEkotlin=E3=81=AE?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91740b7..46637ed 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ ### 環境 - IDE:Android Studio Ladybug | 2024.2.1 Patch 3 -- Kotlin: 2.0.0 +- Kotlin: 2.0.21 - Java:17 - Gradle:8.9 - minSdk:23 From 1a8355c9a9f25ee9d6efad255e6155ea2d3d9ad1 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:06:48 +0900 Subject: [PATCH 08/16] =?UTF-8?q?fix:=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E8=A1=A8=E7=A4=BA=E3=81=AE=E4=BB=95=E6=96=B9=E3=82=92?= =?UTF-8?q?=E7=B4=B0=E3=81=8B=E3=81=8F=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/RepositorySearchViewModel.kt | 21 +++++++++++++++++-- .../GitHubServiceRepositoryImpl.kt | 17 ++++++++++++--- .../features/github/utils/GitHubError.kt | 13 ++++++++++++ .../features/github/utils/NetworkResult.kt | 4 +--- app/src/main/res/values/strings.xml | 5 +++++ 5 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/GitHubError.kt diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 5ccd576..7028faa 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -7,9 +7,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import jp.co.yumemi.android.code_check.R import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecaseImpl +import jp.co.yumemi.android.code_check.features.github.utils.GitHubError import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult import kotlinx.coroutines.launch import javax.inject.Inject @@ -45,7 +47,7 @@ class RepositorySearchViewModel try { val results = networkRepository.fetchSearchResults(query, context) if (results is NetworkResult.Error) { - _errorMessage.postValue(results.exception.message) + handleError(results.exception, context) return@launch } if (results is NetworkResult.Success) { @@ -53,8 +55,23 @@ class RepositorySearchViewModel } } catch (e: NetworkException) { Log.e("NetworkException", e.message, e) - _errorMessage.postValue(e.message) + handleError(GitHubError.NetworkError(e), context) } } } + + private fun handleError( + error: GitHubError, + context: Context, + ) { + val messageRes = + when (error) { + is GitHubError.NetworkError -> R.string.network_error + is GitHubError.ApiError -> R.string.api_error + is GitHubError.ParseError -> R.string.parse_error + is GitHubError.RateLimitError -> R.string.rate_limit_error + is GitHubError.AuthenticationError -> R.string.auth_error + } + _errorMessage.value = context.getString(messageRes) + } } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt index 09c358a..ecec1d2 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/reposiotory/GitHubServiceRepositoryImpl.kt @@ -2,8 +2,11 @@ package jp.co.yumemi.android.code_check.features.github.reposiotory import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.api.GitHubServiceApi +import jp.co.yumemi.android.code_check.features.github.utils.GitHubError import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult import org.json.JSONException +import retrofit2.HttpException +import java.io.IOException import javax.inject.Inject class GitHubServiceRepositoryImpl @@ -27,10 +30,18 @@ class GitHubServiceRepositoryImpl ) } NetworkResult.Success(items) + } catch (e: HttpException) { + val error = + when (e.code()) { + 429 -> GitHubError.RateLimitError + 401 -> GitHubError.AuthenticationError + else -> GitHubError.ApiError(e.code(), e.message()) + } + NetworkResult.Error(error) } catch (e: JSONException) { - NetworkResult.Error(NetworkException("JSONパースエラー", e)) - } catch (e: Exception) { - NetworkResult.Error(NetworkException("ネットワークエラー", e)) + NetworkResult.Error(GitHubError.ParseError(e)) + } catch (e: IOException) { + NetworkResult.Error(GitHubError.NetworkError(e)) } } } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/GitHubError.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/GitHubError.kt new file mode 100644 index 0000000..622fdd7 --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/GitHubError.kt @@ -0,0 +1,13 @@ +package jp.co.yumemi.android.code_check.features.github.utils + +sealed class GitHubError { + data class NetworkError(val exception: Exception) : GitHubError() + + data class ApiError(val code: Int, val message: String) : GitHubError() + + data class ParseError(val exception: Exception) : GitHubError() + + data object RateLimitError : GitHubError() + + data object AuthenticationError : GitHubError() +} diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt index 04c1a31..05d20a3 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/utils/NetworkResult.kt @@ -1,9 +1,7 @@ package jp.co.yumemi.android.code_check.features.github.utils -import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException - sealed class NetworkResult { data class Success(val data: T) : NetworkResult() - data class Error(val exception: NetworkException) : NetworkResult() + data class Error(val exception: GitHubError) : NetworkResult() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b820fba..9673950 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,4 +6,9 @@ "%1$d watchers" "%1$d forks" "%1$d open issues" + 認証エラー + ネットワークエラー + パースエラー + セッションの時間切れ + APIのエラー \ No newline at end of file From 3078e68cf18276be7dfca08d8bb7c64b85d604a9 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:19:17 +0900 Subject: [PATCH 09/16] =?UTF-8?q?fix:=20=E3=83=8D=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=83=AF=E3=83=BC=E3=82=AF=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=81=AE=E7=A7=BB=E5=8B=95?= =?UTF-8?q?=E3=82=92=E8=A1=8C=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/NetworkConnectivityService.kt | 20 +++++++++++++++++++ .../usecase/GitHubServiceUsecaseImpl.kt | 14 +++---------- 2 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt new file mode 100644 index 0000000..0ad2c94 --- /dev/null +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt @@ -0,0 +1,20 @@ +package jp.co.yumemi.android.code_check.core.api + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class NetworkConnectivityService @Inject constructor( + @ApplicationContext private val context: Context +) { + fun isNetworkAvailable(): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt index 5853681..8c4707e 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt @@ -1,9 +1,8 @@ package jp.co.yumemi.android.code_check.features.github.usecase import android.content.Context -import android.net.ConnectivityManager -import android.net.NetworkCapabilities import jp.co.yumemi.android.code_check.core.entity.RepositoryItem +import jp.co.yumemi.android.code_check.core.api.NetworkConnectivityService import jp.co.yumemi.android.code_check.features.github.reposiotory.GitHubServiceRepository import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult @@ -13,22 +12,15 @@ class GitHubServiceUsecaseImpl @Inject constructor( private val repository: GitHubServiceRepository, + private val networkConnectivityService: NetworkConnectivityService, ) : GitHubServiceUsecase { override suspend fun fetchSearchResults( inputText: String, context: Context, ): NetworkResult> { - if (!isNetworkAvailable(context)) { + if (!networkConnectivityService.isNetworkAvailable()) { throw NetworkException("オフライン状態です") } return repository.fetchSearchResults(inputText) } - - private fun isNetworkAvailable(context: Context): Boolean { - val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - - val network = connectivityManager.activeNetwork ?: return false - val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false - return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - } } From ef83d5fbf3b85a7ae4d1debbb6ff61e8234738da Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:22:30 +0900 Subject: [PATCH 10/16] =?UTF-8?q?fix:=20=E3=81=84=E3=82=89=E3=81=AA?= =?UTF-8?q?=E3=81=84context=E3=81=AE=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/presenter/search/RepositorySearchViewModel.kt | 10 ++++++++-- .../features/github/usecase/GitHubServiceUsecase.kt | 1 - .../github/usecase/GitHubServiceUsecaseImpl.kt | 1 - 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 7028faa..06cb877 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -34,6 +34,7 @@ class RepositorySearchViewModel /** * GitHubのレポジトリ検索を行う * @param query 検索キーワード + * @param context コンテキスト */ fun searchRepositories( query: String, @@ -45,7 +46,7 @@ class RepositorySearchViewModel } viewModelScope.launch { try { - val results = networkRepository.fetchSearchResults(query, context) + val results = networkRepository.fetchSearchResults(query) if (results is NetworkResult.Error) { handleError(results.exception, context) return@launch @@ -60,7 +61,12 @@ class RepositorySearchViewModel } } - private fun handleError( + /** + * エラーが発生した時に、Viewに問題を表示するためのもの + * @param GitHubError エラー情報 + * @param context コンテキスト + */ + private fun handleError( error: GitHubError, context: Context, ) { diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt index c6a0760..d218139 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt @@ -7,6 +7,5 @@ import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult interface GitHubServiceUsecase { suspend fun fetchSearchResults( inputText: String, - context: Context, ): NetworkResult> } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt index 8c4707e..34e4ae7 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt @@ -16,7 +16,6 @@ class GitHubServiceUsecaseImpl ) : GitHubServiceUsecase { override suspend fun fetchSearchResults( inputText: String, - context: Context, ): NetworkResult> { if (!networkConnectivityService.isNetworkAvailable()) { throw NetworkException("オフライン状態です") From 71552bff2272dff89755c1b152790c994ef0bfc8 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:25:47 +0900 Subject: [PATCH 11/16] =?UTF-8?q?ref:=20=E3=83=AA=E3=83=B3=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=82=92=E9=80=9A=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/NetworkConnectivityService.kt | 20 ++++++++++--------- .../search/RepositorySearchViewModel.kt | 12 +++++------ .../github/usecase/GitHubServiceUsecase.kt | 5 +---- .../usecase/GitHubServiceUsecaseImpl.kt | 7 ++----- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt index 0ad2c94..d11f4f9 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/api/NetworkConnectivityService.kt @@ -8,13 +8,15 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class NetworkConnectivityService @Inject constructor( - @ApplicationContext private val context: Context -) { - fun isNetworkAvailable(): Boolean { - val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val network = connectivityManager.activeNetwork ?: return false - val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false - return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) +class NetworkConnectivityService + @Inject + constructor( + @ApplicationContext private val context: Context, + ) { + fun isNetworkAvailable(): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } } -} \ No newline at end of file diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 06cb877..1fca658 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -61,12 +61,12 @@ class RepositorySearchViewModel } } - /** - * エラーが発生した時に、Viewに問題を表示するためのもの - * @param GitHubError エラー情報 - * @param context コンテキスト - */ - private fun handleError( + /** + * エラーが発生した時に、Viewに問題を表示するためのもの + * @param GitHubError エラー情報 + * @param context コンテキスト + */ + private fun handleError( error: GitHubError, context: Context, ) { diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt index d218139..3583218 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecase.kt @@ -1,11 +1,8 @@ package jp.co.yumemi.android.code_check.features.github.usecase -import android.content.Context import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult interface GitHubServiceUsecase { - suspend fun fetchSearchResults( - inputText: String, - ): NetworkResult> + suspend fun fetchSearchResults(inputText: String): NetworkResult> } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt index 34e4ae7..a2e4ba6 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/features/github/usecase/GitHubServiceUsecaseImpl.kt @@ -1,8 +1,7 @@ package jp.co.yumemi.android.code_check.features.github.usecase -import android.content.Context -import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.core.api.NetworkConnectivityService +import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.reposiotory.GitHubServiceRepository import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult @@ -14,9 +13,7 @@ class GitHubServiceUsecaseImpl private val repository: GitHubServiceRepository, private val networkConnectivityService: NetworkConnectivityService, ) : GitHubServiceUsecase { - override suspend fun fetchSearchResults( - inputText: String, - ): NetworkResult> { + override suspend fun fetchSearchResults(inputText: String): NetworkResult> { if (!networkConnectivityService.isNetworkAvailable()) { throw NetworkException("オフライン状態です") } From 7aa12afbf113e7aa8621a7d431269844e3fdbc95 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:36:58 +0900 Subject: [PATCH 12/16] =?UTF-8?q?fix:=20=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E8=A1=A8=E7=A4=BA=E6=96=B9=E6=B3=95=E3=82=92string?= =?UTF-8?q?=E3=81=AEID=E3=82=92=E6=B8=A1=E3=81=99=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/RepositorySearchFragment.kt | 7 +++++- .../search/RepositorySearchViewModel.kt | 22 ++++++++----------- app/src/main/res/values/strings.xml | 1 + 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt index fd3d492..0301939 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt @@ -48,7 +48,12 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { adapter.submitList(it) } viewModel.errorMessage.observe(viewLifecycleOwner) { - it?.let { DialogHelper.showErrorDialog(requireContext(), it) } + it?.let { + DialogHelper.showErrorDialog( + requireContext(), + requireContext().getString(it) + ) + } } } diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 1fca658..70338e9 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -10,7 +10,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import jp.co.yumemi.android.code_check.R import jp.co.yumemi.android.code_check.core.entity.RepositoryItem import jp.co.yumemi.android.code_check.features.github.reposiotory.NetworkException -import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecaseImpl +import jp.co.yumemi.android.code_check.features.github.usecase.GitHubServiceUsecase import jp.co.yumemi.android.code_check.features.github.utils.GitHubError import jp.co.yumemi.android.code_check.features.github.utils.NetworkResult import kotlinx.coroutines.launch @@ -23,10 +23,10 @@ import javax.inject.Inject class RepositorySearchViewModel @Inject constructor( - private val networkRepository: GitHubServiceUsecaseImpl, + private val networkRepository: GitHubServiceUsecase, ) : ViewModel() { - private val _errorMessage = MutableLiveData() - val errorMessage: LiveData get() = _errorMessage + private val _errorMessage = MutableLiveData() + val errorMessage: LiveData get() = _errorMessage private val _searchResults = MutableLiveData>() val searchResults: LiveData> get() = _searchResults @@ -41,14 +41,14 @@ class RepositorySearchViewModel context: Context, ) { if (query.isBlank()) { - _errorMessage.postValue("検索キーワードを入力してください。") + _errorMessage.postValue(R.string.form_is_empty) return } viewModelScope.launch { try { val results = networkRepository.fetchSearchResults(query) if (results is NetworkResult.Error) { - handleError(results.exception, context) + handleError(results.exception) return@launch } if (results is NetworkResult.Success) { @@ -56,7 +56,7 @@ class RepositorySearchViewModel } } catch (e: NetworkException) { Log.e("NetworkException", e.message, e) - handleError(GitHubError.NetworkError(e), context) + handleError(GitHubError.NetworkError(e)) } } } @@ -66,11 +66,8 @@ class RepositorySearchViewModel * @param GitHubError エラー情報 * @param context コンテキスト */ - private fun handleError( - error: GitHubError, - context: Context, - ) { - val messageRes = + private fun handleError(error: GitHubError) { + _errorMessage.value = when (error) { is GitHubError.NetworkError -> R.string.network_error is GitHubError.ApiError -> R.string.api_error @@ -78,6 +75,5 @@ class RepositorySearchViewModel is GitHubError.RateLimitError -> R.string.rate_limit_error is GitHubError.AuthenticationError -> R.string.auth_error } - _errorMessage.value = context.getString(messageRes) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9673950..a665d57 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,4 +11,5 @@ パースエラー セッションの時間切れ APIのエラー + フォームが空欄になっています \ No newline at end of file From 9a7f3309f622f7af30387c52c02d9c1d2419c717 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:37:38 +0900 Subject: [PATCH 13/16] =?UTF-8?q?ref:=20=E4=BD=BF=E3=82=8F=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=9FviewModel=E3=81=AE=E5=91=BC?= =?UTF-8?q?=E3=81=B3=E5=87=BA=E3=81=97=E6=96=B9=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code_check/core/presenter/search/RepositorySearchFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt index 0301939..3f7c5a8 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt @@ -36,7 +36,6 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { ) { super.onViewCreated(view, savedInstanceState) _binding = FragmentRepositorySearchBinding.bind(view) -// viewModel = ViewModelProvider(this)[RepositorySearchViewModel::class.java] observeViewModel() setupRecyclerView() From 0291ed44512ba5afe212e92bf33ee81f852947b7 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:40:05 +0900 Subject: [PATCH 14/16] =?UTF-8?q?ref:=20=E3=83=AA=E3=83=B3=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/presenter/search/RepositorySearchFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt index 3f7c5a8..47392ab 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt @@ -50,7 +50,7 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { it?.let { DialogHelper.showErrorDialog( requireContext(), - requireContext().getString(it) + requireContext().getString(it), ) } } From 77249d4564718278d975d4809864931258fd95fa Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:41:53 +0900 Subject: [PATCH 15/16] =?UTF-8?q?ref:=20=E3=81=84=E3=82=89=E3=81=AA?= =?UTF-8?q?=E3=81=84context=E3=82=92=E5=89=8A=E9=99=A4=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/presenter/search/RepositorySearchViewModel.kt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt index 70338e9..d19b58f 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchViewModel.kt @@ -1,6 +1,5 @@ package jp.co.yumemi.android.code_check.core.presenter.search -import android.content.Context import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -34,12 +33,8 @@ class RepositorySearchViewModel /** * GitHubのレポジトリ検索を行う * @param query 検索キーワード - * @param context コンテキスト */ - fun searchRepositories( - query: String, - context: Context, - ) { + fun searchRepositories(query: String) { if (query.isBlank()) { _errorMessage.postValue(R.string.form_is_empty) return @@ -63,8 +58,7 @@ class RepositorySearchViewModel /** * エラーが発生した時に、Viewに問題を表示するためのもの - * @param GitHubError エラー情報 - * @param context コンテキスト + * @param error エラー情報 */ private fun handleError(error: GitHubError) { _errorMessage.value = From 46db2fc204c66afe13a895bfa7e6d9ddc6ffbf82 Mon Sep 17 00:00:00 2001 From: harutiro Date: Mon, 20 Jan 2025 11:43:02 +0900 Subject: [PATCH 16/16] =?UTF-8?q?ref:=20=E3=81=84=E3=82=89=E3=81=AA?= =?UTF-8?q?=E3=81=84context=E3=82=92=E5=89=8A=E9=99=A4=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/presenter/search/RepositorySearchFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt index 47392ab..12a133c 100644 --- a/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt +++ b/app/src/main/kotlin/jp/co/yumemi/android/code_check/core/presenter/search/RepositorySearchFragment.kt @@ -71,7 +71,7 @@ class RepositorySearchFragment : Fragment(R.layout.fragment_repository_search) { private fun setupSearchInput() { binding.searchInputText.setOnEditorActionListener { editText, action, _ -> if (action == EditorInfo.IME_ACTION_SEARCH) { - viewModel.searchRepositories(editText.text.toString().trim(), requireContext()) + viewModel.searchRepositories(editText.text.toString().trim()) true } else { false