Skip to content

Commit a83d2b6

Browse files
committed
display favorite user page
1 parent 08b95ba commit a83d2b6

12 files changed

Lines changed: 153 additions & 17 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,25 @@
1313
android:supportsRtl="true"
1414
android:theme="@style/Theme.GithubUser"
1515
tools:targetApi="31">
16+
<activity
17+
android:name=".ui.favorite.FavoriteActivity"
18+
android:exported="false" />
1619
<activity
1720
android:name=".SplashScreenActivity"
1821
android:exported="true"
1922
android:theme="@style/Theme.SplashScreenTheme">
20-
<intent-filter>
21-
<action android:name="android.intent.action.MAIN" />
23+
<intent-filter>
24+
<action android:name="android.intent.action.MAIN" />
2225

23-
<category android:name="android.intent.category.LAUNCHER" />
24-
</intent-filter>
26+
<category android:name="android.intent.category.LAUNCHER" />
27+
</intent-filter>
2528
</activity>
2629
<activity
2730
android:name=".ui.detail.DetailUserActivity"
2831
android:exported="false" />
2932
<activity
3033
android:name=".ui.main.MainActivity"
31-
android:exported="true"/>
34+
android:exported="true" />
3235
</application>
3336

3437
</manifest>

app/src/main/java/com/riyandifirman/githubuser/User.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,5 @@ package com.riyandifirman.githubuser
33
data class User(
44
val login: String,
55
val id: Int,
6-
val avatar_url: String,
7-
val html_url: String,
8-
val name: String,
9-
val company: String,
10-
val location: String,
11-
val public_repos: Int,
12-
val followers: Int,
13-
val following: Int
6+
val avatar_url: String
147
)

app/src/main/java/com/riyandifirman/githubuser/favorite/FavoriteUser.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ import androidx.room.PrimaryKey
77
data class FavoriteUser(
88
val login : String,
99
@PrimaryKey
10-
val id : Int
10+
val id : Int,
11+
val avatar_url : String
1112
) : java.io.Serializable

app/src/main/java/com/riyandifirman/githubuser/ui/detail/DetailUserActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class DetailUserActivity : AppCompatActivity() {
2424
companion object {
2525
const val EXTRA_USERNAME = "extra_username"
2626
const val EXTRA_ID = "extra_id"
27+
const val EXTRA_AVATAR = "extra_avatar"
2728
}
2829

2930
override fun onCreate(savedInstanceState: Bundle?) {
@@ -34,6 +35,7 @@ class DetailUserActivity : AppCompatActivity() {
3435
// mengambil data dari intent yang dikirimkan dari MainActivity
3536
val username = intent.getStringExtra(EXTRA_USERNAME)
3637
val id = intent.getIntExtra(EXTRA_ID, 0)
38+
val avatar = intent.getStringExtra(EXTRA_AVATAR)
3739

3840
// membuat bundle untuk mengirimkan data ke fragment
3941
val bundle = Bundle()
@@ -83,7 +85,9 @@ class DetailUserActivity : AppCompatActivity() {
8385
isCheck = !isCheck
8486
if (isCheck) {
8587
if (username != null) {
86-
viewModel.insertFavoriteUser(username, id)
88+
if (avatar != null) {
89+
viewModel.insertFavoriteUser(username, id, avatar)
90+
}
8791
}
8892
} else {
8993
viewModel.deleteFavoriteUser(id)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.riyandifirman.githubuser.ui.favorite
2+
3+
import android.content.Intent
4+
import androidx.appcompat.app.AppCompatActivity
5+
import android.os.Bundle
6+
import androidx.lifecycle.ViewModelProvider
7+
import androidx.recyclerview.widget.LinearLayoutManager
8+
import com.riyandifirman.githubuser.R
9+
import com.riyandifirman.githubuser.User
10+
import com.riyandifirman.githubuser.adapter.UserAdapter
11+
import com.riyandifirman.githubuser.databinding.ActivityFavoriteBinding
12+
import com.riyandifirman.githubuser.favorite.FavoriteUser
13+
import com.riyandifirman.githubuser.ui.detail.DetailUserActivity
14+
import com.riyandifirman.githubuser.viewmodel.FavoriteViewModel
15+
16+
class FavoriteActivity : AppCompatActivity() {
17+
18+
private lateinit var binding: ActivityFavoriteBinding
19+
private lateinit var adapter: UserAdapter
20+
private lateinit var viewModel: FavoriteViewModel
21+
22+
override fun onCreate(savedInstanceState: Bundle?) {
23+
super.onCreate(savedInstanceState)
24+
binding = ActivityFavoriteBinding.inflate(layoutInflater)
25+
setContentView(binding.root)
26+
27+
adapter = UserAdapter()
28+
adapter.notifyDataSetChanged()
29+
30+
viewModel = ViewModelProvider(this).get(FavoriteViewModel::class.java)
31+
32+
adapter.setOnItemClickCallback(object : UserAdapter.OnItemClickCallback {
33+
// fungsi untuk menangani ketika item di klik
34+
override fun onItemClicked(data: User) {
35+
// panggil DetailUserActivity dengan membawa data user
36+
val intent = Intent(this@FavoriteActivity, DetailUserActivity::class.java)
37+
intent.putExtra(DetailUserActivity.EXTRA_USERNAME, data.login)
38+
intent.putExtra(DetailUserActivity.EXTRA_ID, data.id)
39+
intent.putExtra(DetailUserActivity.EXTRA_AVATAR, data.avatar_url)
40+
startActivity(intent)
41+
}
42+
})
43+
44+
binding.apply {
45+
rvFavorite.layoutManager = LinearLayoutManager(this@FavoriteActivity)
46+
rvFavorite.setHasFixedSize(true)
47+
rvFavorite.adapter = adapter
48+
}
49+
50+
viewModel.getFavoriteUser()?.observe(this) {
51+
if (it != null) {
52+
val list = mapList(it)
53+
adapter.setData(list)
54+
}
55+
}
56+
}
57+
58+
private fun mapList(users: List<FavoriteUser>): ArrayList<User> {
59+
val listUser = ArrayList<User>()
60+
for (user in users) {
61+
val userItem = User(
62+
user.login,
63+
user.id,
64+
user.avatar_url
65+
)
66+
listUser.add(userItem)
67+
}
68+
return listUser
69+
}
70+
}

app/src/main/java/com/riyandifirman/githubuser/ui/main/MainActivity.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.content.Intent
66
import androidx.appcompat.app.AppCompatActivity
77
import android.os.Bundle
88
import android.view.Menu
9+
import android.view.MenuItem
910
import android.view.View
1011
import androidx.appcompat.widget.SearchView
1112
import androidx.lifecycle.ViewModelProvider
@@ -15,6 +16,7 @@ import com.riyandifirman.githubuser.User
1516
import com.riyandifirman.githubuser.adapter.UserAdapter
1617
import com.riyandifirman.githubuser.databinding.ActivityMainBinding
1718
import com.riyandifirman.githubuser.ui.detail.DetailUserActivity
19+
import com.riyandifirman.githubuser.ui.favorite.FavoriteActivity
1820
import com.riyandifirman.githubuser.viewmodel.MainViewModel
1921

2022
class MainActivity : AppCompatActivity() {
@@ -39,6 +41,7 @@ class MainActivity : AppCompatActivity() {
3941
val intent = Intent(this@MainActivity, DetailUserActivity::class.java)
4042
intent.putExtra(DetailUserActivity.EXTRA_USERNAME, data.login)
4143
intent.putExtra(DetailUserActivity.EXTRA_ID, data.id)
44+
intent.putExtra(DetailUserActivity.EXTRA_AVATAR, data.avatar_url)
4245
startActivity(intent)
4346
}
4447
})
@@ -109,4 +112,15 @@ class MainActivity : AppCompatActivity() {
109112
// fungsi untuk menangani ketika tombol close di klik
110113
return super.onCreateOptionsMenu(menu)
111114
}
115+
116+
// fungsi untuk menangani ketika item di option menu favorit di klik
117+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
118+
when (item.itemId) {
119+
R.id.favorite -> {
120+
val intent = Intent(this, FavoriteActivity::class.java)
121+
startActivity(intent)
122+
}
123+
}
124+
return super.onOptionsItemSelected(item)
125+
}
112126
}

app/src/main/java/com/riyandifirman/githubuser/viewmodel/DetailUserViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ class DetailUserViewModel(application: Application) : AndroidViewModel(applicati
5757
fun getDetailUser(): LiveData<DetailUserResponse> = user
5858

5959
// fungsi untuk menambahkan data user favorit ke dalam database
60-
fun insertFavoriteUser(username: String, id: Int) {
60+
fun insertFavoriteUser(username: String, id: Int, avatarUrl: String) {
6161
CoroutineScope(Dispatchers.IO).launch {
62-
var user = FavoriteUser(username, id)
62+
var user = FavoriteUser(username, id, avatarUrl)
6363
userDao?.insertFavoriteUser(user)
6464
}
6565
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.riyandifirman.githubuser.viewmodel
2+
3+
import android.app.Application
4+
import androidx.lifecycle.AndroidViewModel
5+
import androidx.lifecycle.LiveData
6+
import com.riyandifirman.githubuser.favorite.FavoriteUser
7+
import com.riyandifirman.githubuser.favorite.FavoriteUserDao
8+
import com.riyandifirman.githubuser.favorite.UserDatabase
9+
10+
class FavoriteViewModel(application: Application): AndroidViewModel(application) {
11+
private var userDao: FavoriteUserDao?
12+
private var userDatabase: UserDatabase?
13+
14+
init {
15+
userDatabase = UserDatabase.getInstance(application)
16+
userDao = userDatabase?.favoriteUserDao()
17+
}
18+
19+
// fungsi get favorite user
20+
fun getFavoriteUser(): LiveData<List<FavoriteUser>>? {
21+
return userDao?.getFavoriteUser()
22+
}
23+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="#FFFFFF"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
5+
</vector>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
tools:context=".ui.favorite.FavoriteActivity">
8+
9+
<androidx.recyclerview.widget.RecyclerView
10+
android:id="@+id/rv_favorite"
11+
android:layout_width="match_parent"
12+
android:layout_height="match_parent"
13+
android:layout_marginTop="8dp"
14+
android:layout_marginBottom="8dp"
15+
android:orientation="vertical" />
16+
17+
</LinearLayout>

0 commit comments

Comments
 (0)