diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f5a082..0e2ac4b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,6 +33,11 @@ android:screenOrientation="portrait" android:name=".issuelist.IssueListActivity_" /> + + diff --git a/app/src/main/java/br/com/luisfernandez/github/client/issuelist/IssueListActivity.kt b/app/src/main/java/br/com/luisfernandez/github/client/issuelist/IssueListActivity.kt index eab0573..0ac81b4 100644 --- a/app/src/main/java/br/com/luisfernandez/github/client/issuelist/IssueListActivity.kt +++ b/app/src/main/java/br/com/luisfernandez/github/client/issuelist/IssueListActivity.kt @@ -20,7 +20,7 @@ import org.androidannotations.annotations.Extra import org.koin.android.viewmodel.ext.android.viewModel @SuppressLint("Registered") -@EActivity(R.layout.activity_issues_list) +@EActivity(R.layout.fragment_issues_list) class IssueListActivity : AppCompatActivity(), IssueListView { @Extra diff --git a/app/src/main/java/br/com/luisfernandez/github/client/pullrequest/PullRequestListActivity.kt b/app/src/main/java/br/com/luisfernandez/github/client/pullrequest/PullRequestListActivity.kt index 5b1b519..e54874d 100644 --- a/app/src/main/java/br/com/luisfernandez/github/client/pullrequest/PullRequestListActivity.kt +++ b/app/src/main/java/br/com/luisfernandez/github/client/pullrequest/PullRequestListActivity.kt @@ -42,7 +42,7 @@ class PullRequestListActivity : AppCompatActivity(), PullRequestListView { recyclerView.layoutManager = layoutManager recyclerView.setHasFixedSize(true) -// + setupViewModel() viewModel.loadPullRequestList(owner, repoName) diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repodetails/BranchesFragment.kt b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/BranchesFragment.kt new file mode 100644 index 0000000..204ec0e --- /dev/null +++ b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/BranchesFragment.kt @@ -0,0 +1,21 @@ +package br.com.luisfernandez.github.client.repodetails + + +import android.os.Bundle +import android.support.v4.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import br.com.luisfernandez.github.client.R + +class BranchesFragment : Fragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + + return inflater.inflate(R.layout.fragment_branches, container, false) + } + + +} diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repodetails/CollaboratorsFragment.kt b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/CollaboratorsFragment.kt new file mode 100644 index 0000000..22b6fab --- /dev/null +++ b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/CollaboratorsFragment.kt @@ -0,0 +1,21 @@ +package br.com.luisfernandez.github.client.repodetails + + +import android.os.Bundle +import android.support.v4.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import br.com.luisfernandez.github.client.R + +class CollaboratorsFragment : Fragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + + return inflater.inflate(R.layout.fragment_collaborators, container, false) + } + + +} diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repodetails/CommitsFragment.kt b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/CommitsFragment.kt new file mode 100644 index 0000000..fc7122b --- /dev/null +++ b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/CommitsFragment.kt @@ -0,0 +1,21 @@ +package br.com.luisfernandez.github.client.repodetails + + +import android.os.Bundle +import android.support.v4.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import br.com.luisfernandez.github.client.R + +class CommitsFragment : Fragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + + return inflater.inflate(R.layout.fragment_commits, container, false) + } + + +} diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repodetails/IssuesListFragment.kt b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/IssuesListFragment.kt new file mode 100644 index 0000000..a0d3893 --- /dev/null +++ b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/IssuesListFragment.kt @@ -0,0 +1,124 @@ +package br.com.luisfernandez.github.client.repodetails + +import android.arch.lifecycle.Observer +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import br.com.luisfernandez.github.client.R +import br.com.luisfernandez.github.client.extensions.setGone +import br.com.luisfernandez.github.client.extensions.setVisible +import br.com.luisfernandez.github.client.http.model.GitHubErrorBody +import br.com.luisfernandez.github.client.http.model.ServerError +import br.com.luisfernandez.github.client.issuelist.IssueListAdapter +import br.com.luisfernandez.github.client.issuelist.IssueListView +import br.com.luisfernandez.github.client.issuelist.IssueListViewModel +import br.com.luisfernandez.github.client.pojo.IssueResponse +import br.com.luisfernandez.github.client.repodetails.RepoDetailsPagerAdapter.Companion.OWNER +import br.com.luisfernandez.github.client.repodetails.RepoDetailsPagerAdapter.Companion.REPONAME +import kotlinx.android.synthetic.main.fragment_issues_list.* +import kotlinx.android.synthetic.main.view_state_empty.* +import kotlinx.android.synthetic.main.view_state_error.* +import kotlinx.android.synthetic.main.view_state_loading.* +import org.koin.android.viewmodel.ext.android.viewModel + +class IssuesListFragment : Fragment(), IssueListView { + + lateinit var owner: String + lateinit var repoName: String + val viewModel by viewModel() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + val rootView = inflater.inflate(R.layout.fragment_issues_list, container, false) + + val recyclerView = rootView.findViewById(R.id.recyclerView) as RecyclerView + + recyclerView.layoutManager = LinearLayoutManager(rootView.context) + recyclerView.setHasFixedSize(true) + + setupArguments() + + setupViewModel() + + viewModel.loadIssueList(owner, repoName) + + return rootView + + } + + private fun setupArguments() { + owner = arguments!!.getString(OWNER) + repoName = arguments!!.getString(REPONAME) + } + + private fun setupViewModel() { + viewModel.issueList.observe(this, Observer { + issueList -> + showContent(issueList!!) + }) + + viewModel.serverError.observe(this, Observer { + serverError -> + handleError(serverError!!) + }) + } + + override fun handleError(serverError: ServerError) { + this.showErrorState() + + if (serverError.errorBody != null) { + textErrorMessage.text = serverError.errorBody!!.message + } else { + textErrorMessage.text = serverError.errorMessage + } + + buttonRetry.setOnClickListener { _ -> + showLoading() + viewModel.loadIssueList(owner, repoName) + } + } + + private fun showErrorState() { + layoutProgress.setGone() + layoutEmpty.setGone() + layoutError.setVisible() + recyclerView.setGone() + } + + override fun showLoading() { + layoutProgress.setVisible() + layoutEmpty.setGone() + layoutError.setGone() + recyclerView.setGone() + } + + override fun showEmpty() { + layoutProgress.setGone() + layoutEmpty.setVisible() + layoutError.setGone() + recyclerView.setGone() + } + + override fun showContent(content: List) { + if (content.isEmpty()) { + showEmpty() + } else { + layoutProgress.setGone() + layoutEmpty.setGone() + layoutError.setGone() + recyclerView.setVisible() + + recyclerView.adapter = this.getIssueListAdapter(content) + } + } + + private fun getIssueListAdapter(content: List): IssueListAdapter { + return IssueListAdapter( + content as ArrayList + ) + } +} diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repodetails/PullRequestsFragment.kt b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/PullRequestsFragment.kt new file mode 100644 index 0000000..273232f --- /dev/null +++ b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/PullRequestsFragment.kt @@ -0,0 +1,21 @@ +package br.com.luisfernandez.github.client.repodetails + + +import android.os.Bundle +import android.support.v4.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import br.com.luisfernandez.github.client.R + +class PullRequestsFragment : Fragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + + return inflater.inflate(R.layout.fragment_pull_requests, container, false) + } + + +} diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repodetails/RepoDetailsActivity.kt b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/RepoDetailsActivity.kt new file mode 100644 index 0000000..61fcfbe --- /dev/null +++ b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/RepoDetailsActivity.kt @@ -0,0 +1,45 @@ +package br.com.luisfernandez.github.client.repodetails + +import android.annotation.SuppressLint +import android.support.v7.app.AppCompatActivity +import br.com.luisfernandez.github.client.R +import kotlinx.android.synthetic.main.activity_repo_details.* +import org.androidannotations.annotations.AfterViews +import org.androidannotations.annotations.EActivity +import org.androidannotations.annotations.Extra + +@SuppressLint("Registered") +@EActivity(R.layout.activity_repo_details) +class RepoDetailsActivity : AppCompatActivity() { + + @Extra + lateinit var owner: String + + @Extra + lateinit var repoName: String + + @AfterViews + fun afterViews() { + this.configToolbar() + + val fragmentAdapter = RepoDetailsPagerAdapter(this, supportFragmentManager, owner, repoName) + viewPagerRepoDetail.adapter = fragmentAdapter + + tabLayoutRepoDetail.setupWithViewPager(viewPagerRepoDetail) + } + + private fun configToolbar() { + setSupportActionBar(toolbar) + supportActionBar?.let { + title = repoName + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowHomeEnabled(true) + supportActionBar?.setDisplayShowTitleEnabled(true) + } + } + + override fun onSupportNavigateUp(): Boolean { + onBackPressed() + return true + } +} diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repodetails/RepoDetailsPagerAdapter.kt b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/RepoDetailsPagerAdapter.kt new file mode 100644 index 0000000..b6b9314 --- /dev/null +++ b/app/src/main/java/br/com/luisfernandez/github/client/repodetails/RepoDetailsPagerAdapter.kt @@ -0,0 +1,57 @@ +package br.com.luisfernandez.github.client.repodetails + +import android.content.Context +import android.support.v4.app.Fragment +import android.support.v4.app.FragmentManager +import android.support.v4.app.FragmentPagerAdapter +import android.os.Bundle +import br.com.luisfernandez.github.client.R + +class RepoDetailsPagerAdapter(private val context: Context, fm: FragmentManager, owner: String, repoName: String): + FragmentPagerAdapter(fm) { + + companion object { + const val OWNER = "OWNER" + const val REPONAME = "REPONAME" + } + + val owner = owner + val repoName = repoName + + override fun getCount(): Int { + return 5 + } + + override fun getItem(position: Int): Fragment { + val bundle = Bundle() + bundle.putString(OWNER, owner) + bundle.putString(REPONAME, repoName) + + var fragment = when(position) { + 0 -> PullRequestsFragment() + 1 -> IssuesListFragment() + 2 -> CommitsFragment() + 3 -> CollaboratorsFragment() + 4 -> BranchesFragment() + + else -> PullRequestsFragment() + } + + fragment.arguments = bundle + + return fragment + } + + override fun getPageTitle(position: Int): CharSequence? { + return when(position){ + 0 -> context.getString(R.string.titlePullRequestsTab) + 1 -> context.getString(R.string.titleIssuesTab) + 2 -> context.getString(R.string.titleCommitsTab) + 3 -> context.getString(R.string.titleCollaboratorsTab) + 4 -> context.getString(R.string.titleBranchesTab) + + else -> context.getString(R.string.titlePullRequestsTab) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListActivity.kt b/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListActivity.kt index 7862933..9e551a1 100644 --- a/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListActivity.kt +++ b/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListActivity.kt @@ -12,9 +12,8 @@ import br.com.luisfernandez.github.client.extensions.setGone import br.com.luisfernandez.github.client.extensions.setVisible import br.com.luisfernandez.github.client.http.model.GitHubErrorBody import br.com.luisfernandez.github.client.http.model.ServerError -import br.com.luisfernandez.github.client.issuelist.IssueListActivity_ import br.com.luisfernandez.github.client.pojo.Repo -import br.com.luisfernandez.github.client.pullrequest.PullRequestListActivity_ +import br.com.luisfernandez.github.client.repodetails.RepoDetailsActivity_ import com.crashlytics.android.answers.Answers import com.crashlytics.android.answers.SearchEvent import com.miguelcatalan.materialsearchview.MaterialSearchView @@ -24,7 +23,6 @@ import kotlinx.android.synthetic.main.view_state_error.* import kotlinx.android.synthetic.main.view_state_loading.* import org.androidannotations.annotations.AfterViews import org.androidannotations.annotations.EActivity -import org.koin.android.ext.android.inject import org.koin.android.viewmodel.ext.android.viewModel @@ -120,23 +118,14 @@ class RepoListActivity : AppCompatActivity(), RepoListView { private fun getRepoListAdapter(): RepoListAdapter { return RepoListAdapter( getOnItemClickListener(), - getOnLoadMoreContentClickListener(), - getOnIssueClickListener() + getOnLoadMoreContentClickListener() ) } private fun getOnItemClickListener(): OnItemClickListener { return object : OnItemClickListener { override fun onItemClick(type: Repo) { - goToPullRequestActivity(type) - } - } - } - - private fun getOnIssueClickListener(): OnItemClickListener { - return object : OnItemClickListener { - override fun onItemClick(type: Repo) { - goToIssueListActivity(type) + goToRepoDetailsActivity(type) } } } @@ -149,16 +138,8 @@ class RepoListActivity : AppCompatActivity(), RepoListView { } } - private fun goToPullRequestActivity(type: Repo) { - PullRequestListActivity_ - .intent(this@RepoListActivity) - .owner(type.owner.login) - .repoName(type.name) - .start() - } - - private fun goToIssueListActivity(type: Repo) { - IssueListActivity_ + private fun goToRepoDetailsActivity(type: Repo) { + RepoDetailsActivity_ .intent(this@RepoListActivity) .owner(type.owner.login) .repoName(type.name) diff --git a/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListAdapter.kt b/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListAdapter.kt index c5d85fe..9572f80 100644 --- a/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListAdapter.kt +++ b/app/src/main/java/br/com/luisfernandez/github/client/repolist/RepoListAdapter.kt @@ -18,8 +18,7 @@ import kotlin.collections.ArrayList */ class RepoListAdapter( private val onItemClickListener: OnItemClickListener, - private val onRetryClickListener: OnItemClickListener, - private val onIssueClickListener: OnItemClickListener + private val onRetryClickListener: OnItemClickListener ) : RecyclerView.Adapter() { companion object { @@ -76,10 +75,6 @@ class RepoListAdapter( viewHolder.itemView.setOnClickListener { _ -> onItemClickListener.onItemClick(repo) } - - viewHolder.textIssuesCount.setOnClickListener { _ -> - onIssueClickListener.onItemClick(repo) - } } ERROR_FOOTER -> { val errorFooterHolder = viewHolder as ErrorFooterViewHolder diff --git a/app/src/main/res/layout/activity_repo_details.xml b/app/src/main/res/layout/activity_repo_details.xml new file mode 100644 index 0000000..46f8ff9 --- /dev/null +++ b/app/src/main/res/layout/activity_repo_details.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_branches.xml b/app/src/main/res/layout/fragment_branches.xml new file mode 100644 index 0000000..20a29b3 --- /dev/null +++ b/app/src/main/res/layout/fragment_branches.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_collaborators.xml b/app/src/main/res/layout/fragment_collaborators.xml new file mode 100644 index 0000000..6f5a920 --- /dev/null +++ b/app/src/main/res/layout/fragment_collaborators.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_commits.xml b/app/src/main/res/layout/fragment_commits.xml new file mode 100644 index 0000000..8be10b1 --- /dev/null +++ b/app/src/main/res/layout/fragment_commits.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_issues_list.xml b/app/src/main/res/layout/fragment_issues_list.xml similarity index 66% rename from app/src/main/res/layout/activity_issues_list.xml rename to app/src/main/res/layout/fragment_issues_list.xml index 9c199fd..796314b 100644 --- a/app/src/main/res/layout/activity_issues_list.xml +++ b/app/src/main/res/layout/fragment_issues_list.xml @@ -1,15 +1,9 @@ - - + xmlns:tools="http://schemas.android.com/tools" + android:animateLayoutChanges="true" + tools:context=".repodetails.IssuesListFragment"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2781954..5bd0e2b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,4 +8,9 @@ "Ohh no!\n%s is an invalid language\nPlease query a valid language ;)" TRY AGAIN + PullRequests + Issues + Commits + Collaborators + Branches