From 8577dabf76be73cf03b3aa1ec04dc3ce8e256e86 Mon Sep 17 00:00:00 2001 From: clfreville2 Date: Sat, 8 Apr 2023 17:46:38 +0200 Subject: [PATCH] Enhance general application style --- app/build.gradle | 3 +- .../fragment/ActivityListFragment.kt | 8 ++ .../fragment/RepositoryDetailsFragment.kt | 23 +++- .../iut/clfreville2/teaiswarm/model/Owner.kt | 4 +- .../teaiswarm/network/GiteaService.kt | 15 +++ .../teaiswarm/network/RepositoryService.kt | 2 + .../network/StubRepositoryService.kt | 2 + app/src/main/res/layout/activity_row_item.xml | 64 +++++++--- .../main/res/layout/repository_details.xml | 120 +++++++++++++++--- app/src/main/res/layout/setup_config.xml | 31 +++-- app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings.xml | 8 ++ 12 files changed, 234 insertions(+), 48 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4322554..16c1f2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { defaultConfig { applicationId "fr.uca.iut.clfreville2.teaiswarm" - minSdk 19 + minSdk 21 targetSdk 32 versionCode 1 versionName "1.0" @@ -58,6 +58,7 @@ dependencies { implementation "androidx.fragment:fragment-ktx:$fragment_version" implementation "androidx.preference:preference-ktx:$preference_version" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + implementation 'io.coil-kt:coil:2.3.0' //implementation 'androidx.core:core-ktx:+' testImplementation 'junit:junit:4.13.2' diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/ActivityListFragment.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/ActivityListFragment.kt index 9eab4b2..63491e6 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/ActivityListFragment.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/ActivityListFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.TextView import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -15,6 +16,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import coil.load import fr.uca.iut.clfreville2.teaiswarm.R import fr.uca.iut.clfreville2.teaiswarm.REPOSITORY_NAME import fr.uca.iut.clfreville2.teaiswarm.REPOSITORY_OWNER @@ -117,16 +119,22 @@ class ActivityListFragment : Fragment(R.layout.activity_list) { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { private val commitNameView: TextView private val commitAuthorView: TextView + private val commitAuthorAvatarView: ImageView + private val commitSha: TextView init { commitNameView = view.findViewById(R.id.commit_name) commitAuthorView = view.findViewById(R.id.commit_author) + commitAuthorAvatarView = view.findViewById(R.id.commit_author_avatar) + commitSha = view.findViewById(R.id.commit_sha) } fun bind(commit: CommitActivity?) { commit?.let { commitNameView.text = it.commit.message commitAuthorView.text = it.commit.author.name + commitAuthorAvatarView.load(it.author?.avatarUrl) + commitSha.text = it.sha.substring(0, 8) } } } diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryDetailsFragment.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryDetailsFragment.kt index 2401510..ca50fc3 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryDetailsFragment.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryDetailsFragment.kt @@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.tabs.TabLayout import fr.uca.iut.clfreville2.teaiswarm.* import fr.uca.iut.clfreville2.teaiswarm.model.FileType import fr.uca.iut.clfreville2.teaiswarm.model.RepositoryIdentifier @@ -21,8 +22,11 @@ const val FILE_PATH = "file_path" class RepositoryDetailsFragment : Fragment(R.layout.repository_details) { private val service = TeaIsWarm.service + private lateinit var repositoryOwner: TextView private lateinit var repositoryName: TextView private lateinit var repositoryDescription: TextView + private lateinit var repositoryStars: TextView + private lateinit var repositoryForks: TextView private lateinit var activity: Button private lateinit var versionedFiles: RecyclerView @@ -32,8 +36,11 @@ class RepositoryDetailsFragment : Fragment(R.layout.repository_details) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + repositoryOwner = view.findViewById(R.id.repository_detail_owner) repositoryName = view.findViewById(R.id.repository_detail_name) repositoryDescription = view.findViewById(R.id.repository_detail_description) + repositoryStars = view.findViewById(R.id.repo_stars) + repositoryForks = view.findViewById(R.id.repo_forks) activity = view.findViewById(R.id.repository_detail_activity) val bundle = requireArguments() @@ -41,11 +48,20 @@ class RepositoryDetailsFragment : Fragment(R.layout.repository_details) { currentRepositoryName = bundle.getString(REPOSITORY_NAME)!! currentFilePath = bundle.getString(FILE_PATH) + repositoryOwner.text = currentRepositoryOwner repositoryName.text = currentRepositoryName + val id = RepositoryIdentifier(currentRepositoryOwner, currentRepositoryName) versionedFiles = view.findViewById(R.id.versioned_files_view) lifecycleScope.launch { - val repos = service.listFileContents(RepositoryIdentifier(currentRepositoryOwner, currentRepositoryName), currentFilePath ?: "") + val repo = service.searchRepository(id) + repo?.let { + repositoryDescription.text = it.description + repositoryStars.text = it.stars.toString() + repositoryForks.text = it.forks.toString() + } + + val repos = service.listFileContents(id, currentFilePath ?: "") versionedFiles.adapter = FileListAdapter(repos) { file -> adapterOnClick(file) } @@ -54,6 +70,11 @@ class RepositoryDetailsFragment : Fragment(R.layout.repository_details) { activity.setOnClickListener { findNavController().navigate(R.id.activity_list_fragment, bundle) } + + val tabLayout = view.findViewById(R.id.tabs) + resources.getStringArray(R.array.repository_tabs).forEach { + tabLayout.addTab(tabLayout.newTab().setText(it)) + } } private fun adapterOnClick(file: VersionedFile) { diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/Owner.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/Owner.kt index 75e2c20..aa7f9f3 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/Owner.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/Owner.kt @@ -1,3 +1,5 @@ package fr.uca.iut.clfreville2.teaiswarm.model -data class Owner(val id: Int, val login: String) +import com.squareup.moshi.Json + +data class Owner(val id: Int, val login: String, @Json(name = "avatar_url") val avatarUrl: String = "") diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt index aed7890..45b2ef7 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt @@ -37,6 +37,9 @@ interface GiteaApiService { @GET("users/{owner}") suspend fun searchOwner(@Path("owner") owner: String): Owner? + @GET("repos/{owner}/{repo}") + suspend fun searchRepository(@Path("owner") owner: String, @Path("repo") repo: String): Repository? + @GET("repos/search") suspend fun searchRepositories( @Query("q") query: String, @@ -98,6 +101,18 @@ class GiteaService(private val handle: GiteaApiService) : RepositoryService { } } + override suspend fun searchRepository(repository: RepositoryIdentifiable): Repository? = withContext(Dispatchers.IO) { + try { + handle.searchRepository(repository.identifier.owner, repository.identifier.name) + } catch (ex: HttpException) { + if (ex.code() == HTTP_NOT_FOUND) { + null + } else { + throw ex + } + } + } + override suspend fun searchRepositories(settings: SearchSettings): List = withContext(Dispatchers.IO) { if (settings.page < 1) { emptyList() diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt index 324549d..c1e806e 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt @@ -15,5 +15,7 @@ interface RepositoryService { suspend fun searchOwner(owner: String): Owner? + suspend fun searchRepository(repository: RepositoryIdentifiable): Repository? + suspend fun searchRepositories(settings: SearchSettings): List } diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt index 7a78902..3b7e203 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt @@ -71,6 +71,8 @@ class StubRepositoryService : RepositoryService { override suspend fun searchOwner(owner: String): Owner = Owner(1, owner) + override suspend fun searchRepository(repository: RepositoryIdentifiable): Repository? = null + override suspend fun searchRepositories(settings: SearchSettings): List = listActiveRepositories(settings.query, settings.page) } diff --git a/app/src/main/res/layout/activity_row_item.xml b/app/src/main/res/layout/activity_row_item.xml index 27fdf53..a198d35 100644 --- a/app/src/main/res/layout/activity_row_item.xml +++ b/app/src/main/res/layout/activity_row_item.xml @@ -1,27 +1,57 @@ - + android:paddingTop="4dp" + android:orientation="vertical"> + tools:text="Initial commit" /> - - + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + + + + + + diff --git a/app/src/main/res/layout/repository_details.xml b/app/src/main/res/layout/repository_details.xml index 9fcfdeb..8bdbe18 100644 --- a/app/src/main/res/layout/repository_details.xml +++ b/app/src/main/res/layout/repository_details.xml @@ -3,29 +3,117 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical"> - + app:tabMode="scrollable" /> - + android:layout_height="wrap_content"> -