Skip to content

Commit 2b4f9b1

Browse files
committed
Home screen done
1 parent c35d0a7 commit 2b4f9b1

File tree

13 files changed

+267
-15
lines changed

13 files changed

+267
-15
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ plugins {
22
id 'com.android.application'
33
id 'kotlin-android'
44
id 'kotlin-kapt'
5+
id 'kotlin-android-extensions'
56
}
67

78
android {
@@ -74,7 +75,6 @@ dependencies {
7475
implementation "androidx.room:room-ktx:2.3.0"
7576
androidTestImplementation "androidx.room:room-testing:2.3.0"
7677

77-
7878
//Coil Image Loader
7979
implementation "io.coil-kt:coil:1.1.1"
8080
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.prateekcode.githubbrowser.adapter
2+
3+
import android.view.LayoutInflater
4+
import android.view.View
5+
import android.view.ViewGroup
6+
import androidx.recyclerview.widget.DiffUtil
7+
import androidx.recyclerview.widget.RecyclerView
8+
import com.prateekcode.githubbrowser.R
9+
import com.prateekcode.githubbrowser.db.Repotity
10+
import com.prateekcode.githubbrowser.util.RepoUtil
11+
import kotlinx.android.synthetic.main.single_repo_item.view.*
12+
13+
class RepoAdapter(private val onItemClickListener: OnItemClickListener) :
14+
RecyclerView.Adapter<RepoAdapter.RepoViewHolder>() {
15+
16+
var repoList = emptyList<Repotity>()
17+
18+
inner class RepoViewHolder(itemView: View, onItemClickListener: OnItemClickListener) :
19+
RecyclerView.ViewHolder(itemView) {
20+
21+
init {
22+
itemView.setOnClickListener {
23+
onItemClickListener.onClick(adapterPosition)
24+
}
25+
itemView.share_btn.setOnClickListener {
26+
onItemClickListener.onShareButtonClick(adapterPosition)
27+
}
28+
}
29+
30+
fun bind(repotity: Repotity) {
31+
itemView.repo_title.text = repotity.repositoryName
32+
itemView.repo_description.text = repotity.descriptionRepo
33+
}
34+
}
35+
36+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RepoAdapter.RepoViewHolder {
37+
val itemView =
38+
LayoutInflater.from(parent.context).inflate(R.layout.single_repo_item, parent, false)
39+
return RepoViewHolder(itemView, onItemClickListener)
40+
}
41+
42+
override fun onBindViewHolder(holder: RepoViewHolder, position: Int) {
43+
val repo = repoList[position]
44+
holder.bind(repo)
45+
}
46+
47+
override fun getItemCount(): Int = repoList.size
48+
49+
fun setData(repotity: List<Repotity>) {
50+
val repoDiffUtil = RepoUtil(repoList, repotity)
51+
val repoUtilResult = DiffUtil.calculateDiff(repoDiffUtil)
52+
this.repoList = repotity
53+
repoUtilResult.dispatchUpdatesTo(this)
54+
}
55+
56+
interface OnItemClickListener {
57+
fun onClick(position: Int)
58+
fun onShareButtonClick(position: Int)
59+
}
60+
61+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.prateekcode.githubbrowser.db
2+
3+
import android.content.Context
4+
import androidx.room.Database
5+
import androidx.room.Room
6+
import androidx.room.RoomDatabase
7+
8+
@Database(entities = [Repotity::class], version = 1, exportSchema = false)
9+
abstract class RepoDatabase:RoomDatabase() {
10+
11+
abstract fun repoDao(): Repodao
12+
13+
companion object{
14+
@Volatile
15+
private var INSTANCE: RepoDatabase?= null
16+
17+
fun getDatabase(context: Context): RepoDatabase =
18+
INSTANCE ?: synchronized(this) {
19+
INSTANCE
20+
?: buildDatabase(context).also { INSTANCE = it }
21+
}
22+
23+
private fun buildDatabase(context: Context) =
24+
Room.databaseBuilder(
25+
context.applicationContext,
26+
RepoDatabase::class.java, "repo_database"
27+
)
28+
.fallbackToDestructiveMigration()
29+
.allowMainThreadQueries()
30+
.build()
31+
}
32+
33+
34+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.prateekcode.githubbrowser.db
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.room.*
5+
6+
@Dao
7+
interface Repodao {
8+
9+
//For Querying All the Data
10+
@Query("SELECT * FROM RepoTable")
11+
fun getAllRepo():List<Repotity>
12+
13+
//For Inserting the single repo
14+
@Insert(onConflict = OnConflictStrategy.REPLACE)
15+
suspend fun insertRepo(repotity: Repotity)
16+
17+
//For deleting the entire db
18+
@Query("DELETE FROM RepoTable")
19+
suspend fun deleteAll()
20+
21+
//For deleting the single repo
22+
@Delete
23+
suspend fun delete(repotity: Repotity)
24+
25+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.prateekcode.githubbrowser.db
2+
3+
import androidx.room.ColumnInfo
4+
import androidx.room.Entity
5+
import androidx.room.PrimaryKey
6+
7+
@Entity(tableName = "RepoTable")
8+
data class Repotity(
9+
@PrimaryKey @ColumnInfo(name = "Repository Name")
10+
val repositoryName:String,
11+
@ColumnInfo(name = "Description")
12+
val descriptionRepo:String,
13+
@ColumnInfo(name = "HTML Url")
14+
val htmlUrl:String
15+
)

app/src/main/java/com/prateekcode/githubbrowser/fragment/AddRepoFragment.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.prateekcode.githubbrowser.fragment
22

3+
34
import android.os.Bundle
45
import android.util.Log
56
import android.view.LayoutInflater
@@ -12,6 +13,9 @@ import androidx.fragment.app.Fragment
1213
import androidx.lifecycle.ViewModelProvider
1314
import com.prateekcode.githubbrowser.R
1415
import com.prateekcode.githubbrowser.databinding.FragmentAddRepoBinding
16+
import com.prateekcode.githubbrowser.db.RepoDatabase
17+
import com.prateekcode.githubbrowser.db.Repodao
18+
import com.prateekcode.githubbrowser.db.Repotity
1519
import com.prateekcode.githubbrowser.viewmodel.ApiViewModel
1620
import com.prateekcode.githubbrowser.viewmodel.ApiViewModelFactory
1721

@@ -20,13 +24,21 @@ class AddRepoFragment : Fragment() {
2024

2125
lateinit var binding: FragmentAddRepoBinding
2226
var viewModel: ApiViewModel? =null
27+
lateinit var repodao: Repodao
28+
2329

2430
override fun onCreateView(
2531
inflater: LayoutInflater, container: ViewGroup?,
2632
savedInstanceState: Bundle?
2733
): View? {
2834
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_add_repo, container, false)
2935

36+
//Initializing the database
37+
repodao = RepoDatabase.getDatabase(context!!).repoDao()
38+
39+
40+
41+
3042
binding.addMaterialToolbar.setNavigationOnClickListener {
3143
fragmentManager!!.popBackStack()
3244
}
@@ -50,14 +62,25 @@ class AddRepoFragment : Fragment() {
5062
}
5163

5264
private fun findTheRepo(userName:String, repoName:String){
53-
val factory = ApiViewModelFactory()
65+
val factory = ApiViewModelFactory(repodao)
5466
viewModel = ViewModelProvider(this, factory).get(ApiViewModel::class.java)
5567
viewModel!!.githubRepository(userName, repoName)
5668
viewModel!!.repoResponse.observe(viewLifecycleOwner, { response ->
5769
if (response.isSuccessful) {
5870
Log.d(TAG, "Name of the user: ${response.body()!!.name}")
71+
var repoName = response.body()!!.name
72+
var descriptionOfRepo = response.body()!!.description
73+
if (descriptionOfRepo==null){
74+
descriptionOfRepo = "Not Found"
75+
}else{
76+
descriptionOfRepo
77+
}
78+
val htmlUrl = response.body()!!.html_url
5979
Log.d(TAG, "Description of the user: ${response.body()!!.description}")
6080
Log.d(TAG, "Html Url of the user: ${response.body()!!.html_url}")
81+
val repo = Repotity(repoName, descriptionOfRepo, htmlUrl)
82+
viewModel!!.insertTheRepo(repo)
83+
fragmentManager!!.popBackStack()
6184
}
6285
})
6386
}

app/src/main/java/com/prateekcode/githubbrowser/fragment/HomeFragment.kt

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,62 @@
11
package com.prateekcode.githubbrowser.fragment
22

3+
import android.content.Intent
34
import android.os.Bundle
45
import android.view.*
56
import androidx.fragment.app.Fragment
67
import android.widget.Toast
78
import androidx.databinding.DataBindingUtil
9+
import androidx.lifecycle.ViewModelProvider
10+
import androidx.recyclerview.widget.LinearLayoutManager
811
import com.prateekcode.githubbrowser.R
12+
import com.prateekcode.githubbrowser.adapter.RepoAdapter
913
import com.prateekcode.githubbrowser.databinding.FragmentHomeBinding
14+
import com.prateekcode.githubbrowser.db.RepoDatabase
15+
import com.prateekcode.githubbrowser.db.Repodao
16+
import com.prateekcode.githubbrowser.db.Repotity
17+
import com.prateekcode.githubbrowser.viewmodel.ApiViewModel
18+
import com.prateekcode.githubbrowser.viewmodel.ApiViewModelFactory
1019

1120

12-
class HomeFragment : Fragment() {
21+
class HomeFragment : Fragment(), RepoAdapter.OnItemClickListener {
1322

1423
lateinit var binding: FragmentHomeBinding
24+
private val repoAdapter: RepoAdapter by lazy { RepoAdapter(this) }
25+
var viewModel: ApiViewModel? =null
26+
lateinit var repodao: Repodao
27+
private lateinit var repoList: List<Repotity>
1528

1629
override fun onCreateView(
1730
inflater: LayoutInflater, container: ViewGroup?,
1831
savedInstanceState: Bundle?
1932
): View? {
2033
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
2134

35+
//Initializing the database
36+
repodao = RepoDatabase.getDatabase(context!!).repoDao()
37+
val factory = ApiViewModelFactory(repodao)
38+
viewModel = ViewModelProvider(this, factory).get(ApiViewModel::class.java)
39+
40+
repoList = repodao.getAllRepo()
41+
if (repoList.isEmpty()){
42+
binding.trackRepoTv.visibility = View.VISIBLE
43+
binding.addRepoButton.visibility = View.VISIBLE
44+
}else{
45+
binding.trackRepoTv.visibility = View.GONE
46+
binding.addRepoButton.visibility = View.GONE
47+
}
48+
2249
binding.addRepoButton.setOnClickListener {
2350
//Toast.makeText(context, "Hey Buddy!!!!!!", Toast.LENGTH_SHORT).show()
2451
replaceFragment(AddRepoFragment())
2552
}
2653

54+
repoAdapter.setData(repoList)
55+
val layoutManager = LinearLayoutManager(context!!)
56+
binding.repoRecyclerView.layoutManager = layoutManager
57+
binding.repoRecyclerView.adapter = repoAdapter
58+
layoutManager.stackFromEnd = true
59+
layoutManager.reverseLayout = true
2760

2861
binding.homeMaterialToolbar.setOnMenuItemClickListener {
2962
menuItem ->
@@ -40,6 +73,17 @@ class HomeFragment : Fragment() {
4073
return binding.root
4174
}
4275

76+
override fun onClick(position: Int) {
77+
replaceFragment(DetailFragment())
78+
}
79+
80+
override fun onShareButtonClick(position: Int) {
81+
val intent = Intent(Intent.ACTION_SEND)
82+
intent.type = "text/plain"
83+
intent.putExtra(Intent.EXTRA_TEXT, "Checkout this amazing repo at Github ${repoList[position].htmlUrl}")
84+
startActivity(Intent.createChooser(intent, "Choose the App"))
85+
//Toast.makeText(context, "Share this url ${repoList[position].htmlUrl}", Toast.LENGTH_SHORT).show()
86+
}
4387

4488
private fun replaceFragment(fragment: Fragment) {
4589
val transaction = activity!!.supportFragmentManager.beginTransaction()
@@ -48,4 +92,5 @@ class HomeFragment : Fragment() {
4892
transaction.commit()
4993
}
5094

95+
5196
}

app/src/main/java/com/prateekcode/githubbrowser/repository/Repository.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.prateekcode.githubbrowser.repository
22

33
import com.prateekcode.githubbrowser.api.RetrofitInstance
4+
import com.prateekcode.githubbrowser.db.Repodao
5+
import com.prateekcode.githubbrowser.db.Repotity
46
import com.prateekcode.githubbrowser.model.branch.Branch
57
import com.prateekcode.githubbrowser.model.commit.Commits
68
import com.prateekcode.githubbrowser.model.issuedir.IssueCollection
79
import com.prateekcode.githubbrowser.model.repo.Repo
810
import retrofit2.Response
911

10-
class Repository {
12+
class Repository(private val repodao: Repodao) {
1113

1214
suspend fun getRepo(
1315
ownerName: String,
@@ -39,4 +41,20 @@ class Repository {
3941
return RetrofitInstance.api.getOpenIssues(ownerName, repoName, state)
4042
}
4143

44+
suspend fun insertTheRepo(repotity: Repotity){
45+
repodao.insertRepo(repotity)
46+
}
47+
48+
suspend fun deleteTheRepo(repotity: Repotity){
49+
repodao.delete(repotity)
50+
}
51+
52+
suspend fun deleteEntireDb(){
53+
repodao.deleteAll()
54+
}
55+
56+
suspend fun getAllTheRepo(){
57+
repodao.getAllRepo()
58+
}
59+
4260
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.prateekcode.githubbrowser.util
2+
3+
import androidx.recyclerview.widget.DiffUtil
4+
import com.prateekcode.githubbrowser.db.Repotity
5+
6+
class RepoUtil(private val oldList: List<Repotity>, private val newList: List<Repotity>): DiffUtil.Callback() {
7+
override fun getOldListSize(): Int = oldList.size
8+
9+
override fun getNewListSize(): Int = newList.size
10+
11+
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
12+
return oldList[oldItemPosition] == newList[newItemPosition]
13+
}
14+
15+
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
16+
return oldList[oldItemPosition].repositoryName == newList[newItemPosition].repositoryName
17+
&& oldList[oldItemPosition].descriptionRepo == newList[newItemPosition].descriptionRepo
18+
&& oldList[oldItemPosition].htmlUrl == newList[newItemPosition].htmlUrl
19+
}
20+
}

0 commit comments

Comments
 (0)