Skip to content
This repository was archived by the owner on Aug 22, 2024. It is now read-only.

Commit 93d367b

Browse files
committed
[ADDED] [#8] View model for the layout browser activity.
1 parent ccf50a9 commit 93d367b

File tree

4 files changed

+81
-8
lines changed

4 files changed

+81
-8
lines changed

app/src/main/java/com/hossainkhan/android/demo/browse/LayoutBrowseActivity.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,37 +16,48 @@
1616

1717
package com.hossainkhan.android.demo.browse
1818

19-
import android.support.v7.app.AppCompatActivity
19+
import android.arch.lifecycle.ViewModelProviders
2020
import android.os.Bundle
21+
import android.support.v7.app.AppCompatActivity
2122
import android.support.v7.widget.GridLayoutManager
2223
import android.support.v7.widget.RecyclerView
2324
import com.hossainkhan.android.demo.R
24-
import com.hossainkhan.android.demo.data.AppDataStore
2525
import com.hossainkhan.android.demo.layoutpreview.LayoutPreviewBaseActivity
2626
import com.hossainkhan.android.demo.layoutpreview.LayoutVisibilityGoneActivity
27+
import com.hossainkhan.android.demo.viewmodel.LayoutPreviewViewModelFactory
2728
import dagger.android.AndroidInjection
2829
import timber.log.Timber
2930
import javax.inject.Inject
3031

32+
/**
33+
* A list activity that shows all the available example demo layouts.
34+
*/
3135
class LayoutBrowseActivity : AppCompatActivity() {
3236
@Inject
33-
lateinit var appDataStore: AppDataStore
37+
internal lateinit var viewModelFactory: LayoutPreviewViewModelFactory
3438

3539
private lateinit var recyclerView: RecyclerView
3640
private lateinit var viewAdapter: RecyclerView.Adapter<*>
3741
private lateinit var viewManager: RecyclerView.LayoutManager
3842

43+
private lateinit var viewModel: LayoutBrowseViewModel
44+
3945
override fun onCreate(savedInstanceState: Bundle?) {
4046
AndroidInjection.inject(this)
4147
super.onCreate(savedInstanceState)
4248
setContentView(R.layout.activity_main)
4349

44-
Timber.d("Got data: ${appDataStore.isFirstTime()}")
45-
appDataStore.updateFirstTimeUser(false)
50+
viewModel = ViewModelProviders.of(this, viewModelFactory)
51+
.get(LayoutBrowseViewModel::class.java)
52+
53+
setupLayoutInfoAdapter(viewModel)
54+
}
4655

56+
private fun setupLayoutInfoAdapter(viewModel: LayoutBrowseViewModel) {
4757
viewManager = GridLayoutManager(this, resources.getInteger(R.integer.grid_column_count))
4858
viewAdapter = LayoutBrowseAdapter(
49-
data = appDataStore.layoutStore.supportedLayoutInfos,
59+
viewModel = viewModel,
60+
lifecycleOwner = this,
5061
itemSelectedListener = this::onLayoutItemSelected)
5162

5263
recyclerView = findViewById<RecyclerView>(R.id.recycler_view).apply {

app/src/main/java/com/hossainkhan/android/demo/browse/LayoutBrowseAdapter.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.hossainkhan.android.demo.browse
1818

19+
import android.arch.lifecycle.LifecycleOwner
20+
import android.arch.lifecycle.Observer
1921
import android.support.v7.widget.RecyclerView
2022
import android.view.LayoutInflater
2123
import android.view.View
@@ -26,9 +28,20 @@ import com.hossainkhan.android.demo.R
2628
import com.hossainkhan.android.demo.data.LayoutInformation
2729

2830
class LayoutBrowseAdapter(
29-
private val data: List<LayoutInformation>,
31+
viewModel: LayoutBrowseViewModel,
32+
lifecycleOwner: LifecycleOwner,
3033
private val itemSelectedListener: (Int) -> Unit) : RecyclerView.Adapter<LayoutBrowseAdapter.ViewHolder>() {
3134

35+
private var data: List<LayoutInformation> = emptyList()
36+
37+
init {
38+
viewModel.layoutInfos.observe(lifecycleOwner, Observer {
39+
data = it!!
40+
notifyDataSetChanged()
41+
})
42+
}
43+
44+
3245
// Provide a reference to the views for each data item
3346
// Complex data items may need more than one view per item, and
3447
// you provide access to all the views for a data item in a view holder.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2018 Hossain Khan
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.hossainkhan.android.demo.browse
18+
19+
import android.arch.lifecycle.LiveData
20+
import android.arch.lifecycle.MutableLiveData
21+
import android.arch.lifecycle.ViewModel
22+
import com.hossainkhan.android.demo.data.AppDataStore
23+
import com.hossainkhan.android.demo.data.LayoutInformation
24+
import timber.log.Timber
25+
26+
class LayoutBrowseViewModel(
27+
appDataStore: AppDataStore) : ViewModel() {
28+
29+
private val layoutInfoListLiveData = MutableLiveData<List<LayoutInformation>>()
30+
31+
val layoutInfos: LiveData<List<LayoutInformation>>
32+
get() = layoutInfoListLiveData
33+
34+
init {
35+
Timber.d("Got data: ${appDataStore.isFirstTime()}")
36+
appDataStore.updateFirstTimeUser(false)
37+
38+
39+
layoutInfoListLiveData.value = appDataStore.layoutStore.supportedLayoutInfos
40+
}
41+
}

app/src/main/java/com/hossainkhan/android/demo/viewmodel/LayoutPreviewViewModelFactory.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,27 @@ package com.hossainkhan.android.demo.viewmodel
1818

1919
import android.arch.lifecycle.ViewModel
2020
import android.arch.lifecycle.ViewModelProvider
21+
import com.hossainkhan.android.demo.browse.LayoutBrowseViewModel
2122
import com.hossainkhan.android.demo.data.AppDataStore
2223
import com.hossainkhan.android.demo.layoutpreview.LayoutInfoViewModel
2324
import javax.inject.Inject
2425

26+
/**
27+
* The [ViewModelProvider.Factory] that provides all the ViewModels for the activities and fragments.
28+
*/
2529
class LayoutPreviewViewModelFactory @Inject constructor(
2630
private val dataStore: AppDataStore
2731

2832
) : ViewModelProvider.Factory {
2933
@Suppress("UNCHECKED_CAST")
3034
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
3135
return when {
32-
modelClass.isAssignableFrom(LayoutInfoViewModel::class.java) ->
36+
modelClass.isAssignableFrom(LayoutInfoViewModel::class.java) -> {
3337
LayoutInfoViewModel(dataStore) as T
38+
}
39+
modelClass.isAssignableFrom(LayoutBrowseViewModel::class.java) -> {
40+
LayoutBrowseViewModel(dataStore) as T
41+
}
3442
else -> throw IllegalArgumentException("Unknown ViewModel class")
3543
}
3644
}

0 commit comments

Comments
 (0)