Skip to content

Commit b2712dd

Browse files
committed
Material Dialogs Custom Layout
1 parent e77a09d commit b2712dd

File tree

2 files changed

+208
-3
lines changed

2 files changed

+208
-3
lines changed

app/src/main/java/com/codingwithmitch/openapi/ui/main/blog/BlogFragment.kt

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,27 @@ import android.util.Log
77
import android.view.*
88
import android.view.inputmethod.EditorInfo
99
import android.widget.EditText
10+
import android.widget.RadioButton
11+
import android.widget.RadioGroup
12+
import android.widget.TextView
1013
import androidx.appcompat.app.AppCompatActivity
1114
import androidx.appcompat.widget.SearchView
1215
import androidx.lifecycle.Observer
1316
import androidx.navigation.fragment.findNavController
1417
import androidx.recyclerview.widget.LinearLayoutManager
1518
import androidx.recyclerview.widget.RecyclerView
1619
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
20+
import com.afollestad.materialdialogs.MaterialDialog
21+
import com.afollestad.materialdialogs.customview.customView
22+
import com.afollestad.materialdialogs.customview.getCustomView
1723
import com.codingwithmitch.openapi.R
1824
import com.codingwithmitch.openapi.models.BlogPost
25+
import com.codingwithmitch.openapi.persistence.BlogQueryUtils.Companion.BLOG_FILTER_DATE_UPDATED
26+
import com.codingwithmitch.openapi.persistence.BlogQueryUtils.Companion.BLOG_FILTER_USERNAME
27+
import com.codingwithmitch.openapi.persistence.BlogQueryUtils.Companion.BLOG_ORDER_ASC
1928
import com.codingwithmitch.openapi.ui.DataState
2029
import com.codingwithmitch.openapi.ui.main.blog.state.BlogViewState
21-
import com.codingwithmitch.openapi.ui.main.blog.viewmodel.setBlogPost
22-
import com.codingwithmitch.openapi.ui.main.blog.viewmodel.setQuery
23-
import com.codingwithmitch.openapi.ui.main.blog.viewmodel.setQueryExhausted
30+
import com.codingwithmitch.openapi.ui.main.blog.viewmodel.*
2431
import com.codingwithmitch.openapi.util.ErrorHandling
2532
import com.codingwithmitch.openapi.util.TopSpacingItemDecoration
2633
import handleIncomingBlogListData
@@ -48,6 +55,7 @@ class BlogFragment : BaseBlogFragment(),
4855
super.onViewCreated(view, savedInstanceState)
4956
(activity as AppCompatActivity).supportActionBar?.setDisplayShowTitleEnabled(false)
5057
setHasOptionsMenu(true)
58+
swipe_refresh.setOnRefreshListener(this)
5159

5260
initRecyclerView()
5361
subscribeObservers()
@@ -186,6 +194,17 @@ class BlogFragment : BaseBlogFragment(),
186194
initSearchView(menu)
187195
}
188196

197+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
198+
199+
when(item.itemId){
200+
R.id.action_filter_settings -> {
201+
showFilterDialog()
202+
return true
203+
}
204+
}
205+
return super.onOptionsItemSelected(item)
206+
}
207+
189208
override fun onItemSelected(position: Int, item: BlogPost) {
190209
viewModel.setBlogPost(item)
191210
findNavController().navigate(R.id.action_blogFragment_to_viewBlogFragment)
@@ -202,7 +221,67 @@ class BlogFragment : BaseBlogFragment(),
202221
swipe_refresh.isRefreshing = false
203222
}
204223

224+
fun showFilterDialog(){
225+
226+
activity?.let {
227+
val dialog = MaterialDialog(it)
228+
.noAutoDismiss()
229+
.customView(R.layout.layout_blog_filter)
230+
231+
val view = dialog.getCustomView()
232+
233+
val filter = viewModel.getFilter()
234+
val order = viewModel.getOrder()
235+
236+
if(filter.equals(BLOG_FILTER_DATE_UPDATED)){
237+
view.findViewById<RadioGroup>(R.id.filter_group).check(R.id.filter_date)
238+
}
239+
else{
240+
view.findViewById<RadioGroup>(R.id.filter_group).check(R.id.filter_author)
241+
}
242+
243+
if(order.equals(BLOG_ORDER_ASC)){
244+
view.findViewById<RadioGroup>(R.id.order_group).check(R.id.filter_asc)
245+
}
246+
else{
247+
view.findViewById<RadioGroup>(R.id.order_group).check(R.id.filter_desc)
248+
}
249+
250+
view.findViewById<TextView>(R.id.positive_button).setOnClickListener{
251+
Log.d(TAG, "FilterDialog: apply filter.")
205252

253+
val selectedFilter = dialog.getCustomView().findViewById<RadioButton>(
254+
dialog.getCustomView().findViewById<RadioGroup>(R.id.filter_group).checkedRadioButtonId
255+
)
256+
val selectedOrder= dialog.getCustomView().findViewById<RadioButton>(
257+
dialog.getCustomView().findViewById<RadioGroup>(R.id.order_group).checkedRadioButtonId
258+
)
259+
260+
var filter = BLOG_FILTER_DATE_UPDATED
261+
if(selectedFilter.text.toString().equals(getString(R.string.filter_author))){
262+
filter = BLOG_FILTER_USERNAME
263+
}
264+
265+
var order = ""
266+
if(selectedOrder.text.toString().equals(getString(R.string.filter_desc))){
267+
order = "-"
268+
}
269+
viewModel.saveFilterOptions(filter, order).let{
270+
viewModel.setBlogFilter(filter)
271+
viewModel.setBlogOrder(order)
272+
onBlogSearchOrFilter()
273+
}
274+
dialog.dismiss()
275+
}
276+
277+
view.findViewById<TextView>(R.id.negative_button).setOnClickListener {
278+
Log.d(TAG, "FilterDialog: cancelling filter.")
279+
dialog.dismiss()
280+
}
281+
282+
dialog.show()
283+
}
284+
}
206285
}
207286

208287

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:orientation="vertical"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent"
6+
android:padding="16dp">
7+
8+
<TextView
9+
android:layout_width="match_parent"
10+
android:layout_height="wrap_content"
11+
android:id="@+id/title"
12+
android:textSize="22sp"
13+
android:textColor="#000"
14+
android:text="@string/filter_options"
15+
/>
16+
17+
<RadioGroup
18+
android:layout_width="match_parent"
19+
android:layout_height="wrap_content"
20+
android:layout_marginTop="20dp"
21+
android:orientation="vertical"
22+
android:id="@+id/filter_group"
23+
>
24+
25+
<TextView
26+
android:layout_width="wrap_content"
27+
android:layout_height="wrap_content"
28+
android:textColor="#000"
29+
android:textSize="16sp"
30+
android:text="@string/author_or_date"
31+
/>
32+
33+
<RadioButton
34+
android:layout_width="wrap_content"
35+
android:layout_height="wrap_content"
36+
android:id="@+id/filter_author"
37+
android:text="@string/filter_author"
38+
android:textSize="16sp"
39+
android:textColor="#000"
40+
android:layout_marginTop="20dp"
41+
/>
42+
43+
<RadioButton
44+
android:layout_width="wrap_content"
45+
android:layout_height="wrap_content"
46+
android:id="@+id/filter_date"
47+
android:text="@string/filter_date"
48+
android:textSize="16sp"
49+
android:textColor="#000"
50+
android:layout_marginTop="20dp"
51+
/>
52+
53+
</RadioGroup>
54+
55+
56+
<RadioGroup
57+
android:layout_width="match_parent"
58+
android:layout_height="wrap_content"
59+
android:layout_marginTop="20dp"
60+
android:orientation="vertical"
61+
android:id="@+id/order_group"
62+
>
63+
<TextView
64+
android:layout_width="wrap_content"
65+
android:layout_height="wrap_content"
66+
android:textColor="#000"
67+
android:textSize="16sp"
68+
android:text="@string/asc_desc"
69+
/>
70+
71+
72+
<RadioButton
73+
android:layout_width="wrap_content"
74+
android:layout_height="wrap_content"
75+
android:id="@+id/filter_asc"
76+
android:text="@string/filter_asc"
77+
android:textSize="16sp"
78+
android:textColor="#000"
79+
android:layout_marginTop="20dp"
80+
/>
81+
82+
<RadioButton
83+
android:layout_width="wrap_content"
84+
android:layout_height="wrap_content"
85+
android:id="@+id/filter_desc"
86+
android:text="@string/filter_desc"
87+
android:textSize="16sp"
88+
android:textColor="#000"
89+
android:layout_marginTop="20dp"
90+
/>
91+
92+
</RadioGroup>
93+
94+
<LinearLayout
95+
android:layout_width="match_parent"
96+
android:layout_height="wrap_content"
97+
android:orientation="horizontal"
98+
android:gravity="end"
99+
android:layout_marginTop="30dp"
100+
>
101+
102+
<TextView
103+
android:id="@+id/negative_button"
104+
android:layout_width="wrap_content"
105+
android:layout_height="wrap_content"
106+
android:text="Cancel"
107+
android:textSize="16sp"
108+
android:textColor="@color/colorPrimaryDark"
109+
android:layout_marginEnd="30dp"
110+
111+
/>
112+
113+
<TextView
114+
android:id="@+id/positive_button"
115+
android:layout_width="wrap_content"
116+
android:layout_height="wrap_content"
117+
android:text="Apply"
118+
android:textSize="16sp"
119+
android:textColor="@color/tealDark"
120+
/>
121+
122+
</LinearLayout>
123+
124+
125+
126+
</LinearLayout>

0 commit comments

Comments
 (0)