Skip to content
This repository was archived by the owner on Feb 17, 2020. It is now read-only.

Commit 177fd15

Browse files
authored
Merge pull request #558 from squanchy-dev/favourites_to_constraint_layout
Convert Favourites to Constraint layout
2 parents 2fe770a + 78f3279 commit 177fd15

5 files changed

Lines changed: 123 additions & 111 deletions

File tree

app/src/main/java/net/squanchy/favorites/FavoritesPageView.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package net.squanchy.favorites
22

33
import android.content.Context
4-
import android.support.design.widget.CoordinatorLayout
4+
import android.support.constraint.ConstraintLayout
55
import android.util.AttributeSet
66
import android.view.MenuItem
77
import androidx.view.isVisible
@@ -10,6 +10,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
1010
import io.reactivex.disposables.CompositeDisposable
1111
import io.reactivex.functions.BiFunction
1212
import io.reactivex.schedulers.Schedulers
13+
import kotlinx.android.synthetic.main.merge_no_favorites_view.view.*
1314
import kotlinx.android.synthetic.main.view_page_favorites.view.*
1415
import net.squanchy.R
1516
import net.squanchy.analytics.Analytics
@@ -26,7 +27,7 @@ class FavoritesPageView @JvmOverloads constructor(
2627
context: Context?,
2728
attrs: AttributeSet? = null,
2829
defStyleAttr: Int = 0
29-
) : CoordinatorLayout(context, attrs, defStyleAttr), Loadable {
30+
) : ConstraintLayout(context, attrs, defStyleAttr), Loadable {
3031

3132
private lateinit var favoritesService: FavoritesService
3233
private lateinit var navigator: Navigator
@@ -35,10 +36,12 @@ class FavoritesPageView @JvmOverloads constructor(
3536
private val disposable = CompositeDisposable()
3637

3738
init {
38-
with(favoritesComponent(context.unwrapToActivityContext())) {
39-
favoritesService = favoritesService()
40-
navigator = navigator()
41-
analytics = analytics()
39+
if (!isInEditMode) {
40+
with(favoritesComponent(context.unwrapToActivityContext())) {
41+
favoritesService = favoritesService()
42+
navigator = navigator()
43+
analytics = analytics()
44+
}
4245
}
4346
}
4447

@@ -98,8 +101,9 @@ class FavoritesPageView @JvmOverloads constructor(
98101
private fun showFavorites(favorites: List<FavoritesItem>) {
99102
favoritesListView.updateWith(favorites, ::navigateToEventDetails)
100103
favoritesListView.isVisible = true
101-
emptyViewSignedIn.isVisible = false
104+
progressBar.isVisible = false
102105
emptyViewSignedOut.isVisible = false
106+
emptyViewSignedIn.isVisible = false
103107
}
104108

105109
private fun navigateToEventDetails(event: Event) {
@@ -108,17 +112,17 @@ class FavoritesPageView @JvmOverloads constructor(
108112
}
109113

110114
private fun promptToSign() {
111-
emptyViewSignedOut.isVisible = true
112115
favoritesListView.isVisible = false
113116
progressBar.isVisible = false
117+
emptyViewSignedOut.isVisible = true
114118
emptyViewSignedIn.isVisible = false
115119
}
116120

117121
private fun promptToFavorite() {
118-
emptyViewSignedIn.isVisible = true
119122
favoritesListView.isVisible = false
120123
progressBar.isVisible = false
121124
emptyViewSignedOut.isVisible = false
125+
emptyViewSignedIn.isVisible = true
122126
}
123127

124128
private fun showSignIn() {

app/src/main/java/net/squanchy/favorites/view/FavoritesSignedInEmptyLayout.kt

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,22 @@ import android.content.Context
44
import android.os.Build
55
import android.support.annotation.DrawableRes
66
import android.support.annotation.RequiresApi
7+
import android.support.constraint.ConstraintLayout
78
import android.support.design.widget.Snackbar
8-
import android.text.Html
99
import android.util.AttributeSet
1010
import android.view.View
11-
import android.widget.LinearLayout
1211
import kotlinx.android.synthetic.main.merge_no_favorites_view.view.*
1312
import net.squanchy.R
13+
import net.squanchy.support.text.parseHtml
1414

1515
class FavoritesSignedInEmptyLayout @JvmOverloads constructor(
1616
context: Context?,
1717
attrs: AttributeSet? = null,
18-
defStyleAttr: Int = 0,
19-
defStyleRes: Int = 0
20-
) : LinearLayout(context, attrs, defStyleAttr, defStyleRes), FavoritesSignedInEmptyLayoutView {
18+
defStyleAttr: Int = 0
19+
) : ConstraintLayout(context, attrs, defStyleAttr), FavoritesSignedInEmptyLayoutView {
2120

2221
private var counter = 0
2322

24-
init {
25-
super.setOrientation(VERTICAL)
26-
}
27-
28-
override fun setOrientation(orientation: Int): Nothing {
29-
throw UnsupportedOperationException("Changing orientation is not supported for ${FavoritesSignedInEmptyLayout::class.java.simpleName}")
30-
}
31-
3223
override fun onFinishInflate() {
3324
super.onFinishInflate()
3425

@@ -41,9 +32,10 @@ class FavoritesSignedInEmptyLayout @JvmOverloads constructor(
4132

4233
override fun setButtonImage(@DrawableRes resId: Int) = favoriteFab.setImageResource(resId)
4334

44-
//TODO do we still need this? Also why is it requiring Nougat?
4535
@RequiresApi(Build.VERSION_CODES.N)
46-
override fun showAchievement(message: String) = Snackbar.make(this, readAsHtml(message), Snackbar.LENGTH_LONG).show()
36+
override fun showAchievement(message: String) {
37+
Snackbar.make(this, parseHtml(message), Snackbar.LENGTH_LONG).show()
38+
}
4739

4840
private val favoriteButtonClickListener = View.OnClickListener {
4941
presentButtonIcon(counter, this, ::favoritesFilledIconId, ::favoritesEmptyIconId)
@@ -57,7 +49,4 @@ class FavoritesSignedInEmptyLayout @JvmOverloads constructor(
5749
private fun initialAchieventMessage() = resources.getString(R.string.favorites_achievement_fast_learner)
5850

5951
private fun perseveranceAchievementMessage() = resources.getString(R.string.favorites_achievement_persevering)
60-
61-
@RequiresApi(Build.VERSION_CODES.N)
62-
private fun readAsHtml(message: String): CharSequence = Html.fromHtml(message, Html.FROM_HTML_MODE_LEGACY)
6352
}
Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
1-
<merge xmlns:android="http://schemas.android.com/apk/res/android"
1+
<net.squanchy.favorites.view.FavoritesSignedInEmptyLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
xmlns:app="http://schemas.android.com/apk/res-auto"
23
xmlns:tools="http://schemas.android.com/tools"
4+
android:id="@+id/emptyViewSignedIn"
35
android:layout_width="wrap_content"
46
android:layout_height="wrap_content"
5-
android:layout_gravity="center"
6-
android:orientation="vertical"
7-
tools:context="net.squanchy.home.HomeActivity"
7+
android:visibility="gone"
8+
tools:visibility="visible"
89
tools:showIn="@layout/view_page_favorites">
910

1011
<android.support.design.widget.FloatingActionButton
1112
android:id="@+id/favoriteFab"
1213
style="@style/EventDetails.Fab"
1314
android:layout_width="wrap_content"
1415
android:layout_height="wrap_content"
15-
android:layout_gravity="center_horizontal"
16-
android:layout_marginBottom="@dimen/favorites_empty_fab_margin_bottom" />
16+
android:layout_marginBottom="@dimen/favorites_empty_fab_margin_bottom"
17+
app:layout_constraintStart_toStartOf="parent"
18+
app:layout_constraintTop_toTopOf="parent"
19+
app:layout_constraintEnd_toEndOf="parent"
20+
app:layout_constraintBottom_toTopOf="@+id/text"
21+
app:layout_constraintVertical_chainStyle="packed" />
1722

1823
<TextView
1924
android:id="@+id/text"
2025
style="@style/Favorite.Empty.Blurb"
2126
android:layout_width="wrap_content"
2227
android:layout_height="wrap_content"
23-
android:layout_gravity="center_horizontal"
2428
android:foreground="@drawable/primary_touch_feedback"
25-
android:text="@string/favorites_empty_state_signed_in_blurb" />
29+
android:text="@string/favorites_empty_state_signed_in_blurb"
30+
app:layout_constraintStart_toStartOf="parent"
31+
app:layout_constraintTop_toBottomOf="@id/favoriteFab"
32+
app:layout_constraintEnd_toEndOf="parent"
33+
app:layout_constraintBottom_toBottomOf="parent" />
2634

27-
</merge>
35+
</net.squanchy.favorites.view.FavoritesSignedInEmptyLayout>

app/src/main/res/layout/view_page_favorites.xml

Lines changed: 85 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -9,88 +9,99 @@
99
tools:context="net.squanchy.home.HomeActivity">
1010

1111
<android.support.design.widget.AppBarLayout
12+
android:id="@+id/appBarLayout"
1213
style="@style/Squanchy.Appbar"
1314
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
14-
android:layout_width="match_parent"
15-
android:layout_height="wrap_content">
15+
android:layout_width="@dimen/match_constraint"
16+
android:layout_height="wrap_content"
17+
app:layout_constraintStart_toStartOf="parent"
18+
app:layout_constraintTop_toTopOf="parent"
19+
app:layout_constraintEnd_toEndOf="parent">
1620

1721
<android.support.v7.widget.Toolbar
1822
android:id="@+id/toolbar"
1923
android:layout_width="match_parent"
20-
android:layout_height="?attr/actionBarSize" />
24+
android:layout_height="wrap_content" />
2125

2226
</android.support.design.widget.AppBarLayout>
2327

24-
<FrameLayout
25-
android:layout_width="match_parent"
26-
android:layout_height="match_parent"
27-
android:clipChildren="false"
28-
android:clipToPadding="false"
29-
app:layout_behavior="@string/appbar_scrolling_view_behavior">
30-
31-
<net.squanchy.favorites.view.FavoritesSignedInEmptyLayout
32-
android:id="@+id/emptyViewSignedIn"
33-
android:layout_width="match_parent"
34-
android:layout_height="wrap_content"
35-
android:layout_gravity="center"
36-
android:layout_marginStart="@dimen/favorites_empty_margin_horizontal"
37-
android:layout_marginEnd="@dimen/favorites_empty_margin_horizontal"
38-
android:visibility="gone"
39-
tools:visibility="visible">
40-
41-
<include layout="@layout/merge_no_favorites_view" />
42-
43-
</net.squanchy.favorites.view.FavoritesSignedInEmptyLayout>
44-
45-
<LinearLayout
46-
android:id="@+id/emptyViewSignedOut"
47-
android:layout_width="match_parent"
48-
android:layout_height="wrap_content"
49-
android:layout_gravity="center"
50-
android:layout_marginStart="@dimen/favorites_empty_margin_horizontal"
51-
android:layout_marginEnd="@dimen/favorites_empty_margin_horizontal"
52-
android:clipChildren="false"
53-
android:clipToPadding="false"
54-
android:gravity="center"
55-
android:orientation="vertical"
56-
android:visibility="gone">
57-
58-
<ImageView
59-
android:layout_width="wrap_content"
60-
android:layout_height="wrap_content"
61-
android:layout_marginBottom="@dimen/favorites_empty_image_margin_bottom"
62-
android:contentDescription="@null"
63-
android:scaleType="fitCenter"
64-
app:srcCompat="@drawable/ic_favorites_empty_not_signed_in" />
65-
66-
<TextView
67-
style="@style/Favorite.Empty.Blurb"
68-
android:layout_width="wrap_content"
69-
android:layout_height="wrap_content"
70-
android:layout_marginBottom="@dimen/favorites_empty_blurb_margin_bottom"
71-
android:text="@string/favorites_empty_state_signed_out_blurb" />
72-
73-
<Button
74-
android:id="@+id/emptyViewSignedOutButton"
75-
style="@style/Favorite.Empty.Cta"
76-
android:layout_width="wrap_content"
77-
android:layout_height="@dimen/favorites_empty_cta_height"
78-
android:text="@string/favorites_empty_state_signed_out_cta" />
79-
80-
</LinearLayout>
81-
82-
<ProgressBar
83-
android:id="@+id/progressBar"
84-
android:layout_width="wrap_content"
85-
android:layout_height="wrap_content"
86-
android:layout_gravity="center"
87-
android:visibility="gone" />
88-
89-
<net.squanchy.favorites.view.FavoritesListView
90-
android:id="@+id/favoritesListView"
91-
android:layout_width="match_parent"
92-
android:layout_height="match_parent" />
93-
94-
</FrameLayout>
28+
<include layout="@layout/merge_no_favorites_view"
29+
android:layout_width="@dimen/match_constraint"
30+
android:layout_height="wrap_content"
31+
android:layout_marginStart="@dimen/favorites_empty_margin_horizontal"
32+
android:layout_marginEnd="@dimen/favorites_empty_margin_horizontal"
33+
app:layout_constraintBottom_toBottomOf="parent"
34+
app:layout_constraintTop_toBottomOf="@+id/appBarLayout"
35+
app:layout_constraintEnd_toEndOf="parent"
36+
app:layout_constraintStart_toStartOf="parent" />
37+
38+
<android.support.constraint.Group
39+
android:id="@+id/emptyViewSignedOut"
40+
android:layout_width="wrap_content"
41+
android:layout_height="wrap_content"
42+
android:visibility="gone"
43+
app:constraint_referenced_ids="imageView,textView,emptyViewSignedOutButton" />
44+
45+
<ImageView
46+
android:id="@+id/imageView"
47+
android:layout_width="wrap_content"
48+
android:layout_height="wrap_content"
49+
android:layout_marginBottom="@dimen/favorites_empty_image_margin_bottom"
50+
android:contentDescription="@null"
51+
android:scaleType="fitCenter"
52+
app:layout_constraintStart_toStartOf="parent"
53+
app:layout_constraintTop_toBottomOf="@+id/appBarLayout"
54+
app:layout_constraintEnd_toEndOf="parent"
55+
app:layout_constraintBottom_toTopOf="@+id/textView"
56+
app:layout_constraintVertical_chainStyle="packed"
57+
app:srcCompat="@drawable/ic_favorites_empty_not_signed_in" />
58+
59+
<TextView
60+
android:id="@+id/textView"
61+
style="@style/Favorite.Empty.Blurb"
62+
android:layout_width="wrap_content"
63+
android:layout_height="wrap_content"
64+
android:layout_marginBottom="@dimen/favorites_empty_blurb_margin_bottom"
65+
android:text="@string/favorites_empty_state_signed_out_blurb"
66+
android:paddingStart="@dimen/favorites_empty_margin_horizontal"
67+
android:paddingEnd="@dimen/favorites_empty_margin_horizontal"
68+
app:layout_constraintStart_toStartOf="parent"
69+
app:layout_constraintTop_toBottomOf="@+id/imageView"
70+
app:layout_constraintEnd_toEndOf="parent"
71+
app:layout_constraintBottom_toTopOf="@+id/emptyViewSignedOutButton"
72+
app:layout_constraintVertical_chainStyle="packed" />
73+
74+
<Button
75+
android:id="@+id/emptyViewSignedOutButton"
76+
style="@style/Favorite.Empty.Cta"
77+
android:layout_width="wrap_content"
78+
android:layout_height="wrap_content"
79+
android:text="@string/favorites_empty_state_signed_out_cta"
80+
app:layout_constraintStart_toStartOf="@+id/textView"
81+
app:layout_constraintTop_toBottomOf="@+id/textView"
82+
app:layout_constraintBottom_toBottomOf="parent"
83+
app:layout_constraintEnd_toEndOf="@+id/textView" />
84+
85+
<ProgressBar
86+
android:id="@+id/progressBar"
87+
android:layout_width="wrap_content"
88+
android:layout_height="wrap_content"
89+
android:visibility="visible"
90+
app:layout_constraintStart_toStartOf="parent"
91+
app:layout_constraintTop_toBottomOf="@+id/appBarLayout"
92+
app:layout_constraintEnd_toEndOf="parent"
93+
app:layout_constraintBottom_toBottomOf="parent"
94+
tools:visibility="gone" />
95+
96+
<net.squanchy.favorites.view.FavoritesListView
97+
android:id="@+id/favoritesListView"
98+
android:layout_width="@dimen/match_constraint"
99+
android:layout_height="@dimen/match_constraint"
100+
android:visibility="gone"
101+
app:layout_constraintStart_toStartOf="parent"
102+
app:layout_constraintTop_toBottomOf="@+id/appBarLayout"
103+
app:layout_constraintEnd_toEndOf="parent"
104+
app:layout_constraintBottom_toBottomOf="parent"
105+
tools:visibility="visible" />
95106

96107
</net.squanchy.favorites.FavoritesPageView>

dependencies.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ ext {
5050
rxLint : 'nl.littlerobots.rxlint:rxlint:1.6.1',
5151
supportAnnotations : "com.android.support:support-annotations:${supportLibVersion}",
5252
supportAppCompat : "com.android.support:appcompat-v7:${supportLibVersion}",
53-
supportConstraint : 'com.android.support.constraint:constraint-layout:1.1.0-beta6',
53+
supportConstraint : 'com.android.support.constraint:constraint-layout:1.1.0',
5454
supportDesign : "com.android.support:design:${supportLibVersion}",
5555
timber : 'com.jakewharton.timber:timber:4.7.0',
5656
viewPagerAdapter : 'com.novoda:view-pager-adapter:1.0.0'

0 commit comments

Comments
 (0)