Skip to content
This repository was archived by the owner on Jan 5, 2023. It is now read-only.

Commit 74fad4b

Browse files
jdkorenGerrit Code Review
authored andcommitted
Merge changes I6ace3747,I565e53b6 into main
* changes: Fix some settings item styles Minor tablet improvements
2 parents 093a0f0 + 124068c commit 74fad4b

File tree

24 files changed

+462
-229
lines changed

24 files changed

+462
-229
lines changed

mobile/src/androidTest/java/com/google/samples/apps/iosched/tests/ui/CodelabTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withParent
2525
import androidx.test.espresso.matcher.ViewMatchers.withText
2626
import androidx.test.ext.junit.runners.AndroidJUnit4
2727
import com.google.samples.apps.iosched.R
28+
import com.google.samples.apps.iosched.shared.data.FakeConferenceDataSource
2829
import com.google.samples.apps.iosched.tests.SetPreferencesRule
2930
import dagger.hilt.android.testing.HiltAndroidRule
3031
import dagger.hilt.android.testing.HiltAndroidTest
@@ -53,7 +54,7 @@ class CodelabTest {
5354
// Title
5455
onView(allOf(instanceOf(TextView::class.java), withParent(withId(R.id.toolbar))))
5556
.check(matches(withText(R.string.event_codelabs_title)))
56-
// One of the blocks
57-
onView(withText(R.string.codelabs_building)).check(matches(isDisplayed()))
57+
// One of the codelabs
58+
onView(withText(FakeConferenceDataSource.FAKE_CODELAB_TITLE)).check(matches(isDisplayed()))
5859
}
5960
}

mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleFragment.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.view.View
2222
import android.view.ViewGroup
2323
import android.widget.Toast
2424
import androidx.core.view.WindowInsetsCompat
25+
import androidx.core.view.doOnNextLayout
2526
import androidx.core.view.updatePadding
2627
import androidx.fragment.app.Fragment
2728
import androidx.fragment.app.activityViewModels
@@ -57,6 +58,7 @@ import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
5758
import com.google.samples.apps.iosched.util.executeAfter
5859
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
5960
import com.google.samples.apps.iosched.util.requestApplyInsetsWhenAttached
61+
import com.google.samples.apps.iosched.util.setContentMaxWidth
6062
import com.google.samples.apps.iosched.widget.BubbleDecoration
6163
import com.google.samples.apps.iosched.widget.FadingSnackbar
6264
import com.google.samples.apps.iosched.widget.JumpSmoothScroller
@@ -185,6 +187,9 @@ class ScheduleFragment : Fragment() {
185187
}
186188
})
187189
}
190+
binding.swipeRefreshLayout.doOnNextLayout {
191+
setContentMaxWidth(it)
192+
}
188193
scheduleScroller = JumpSmoothScroller(view.context)
189194

190195
dayIndicatorItemDecoration = BubbleDecoration(view.context)

mobile/src/main/java/com/google/samples/apps/iosched/ui/search/SearchFragment.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel
3939
import com.google.samples.apps.iosched.ui.sessioncommon.SessionsAdapter
4040
import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
4141
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
42+
import com.google.samples.apps.iosched.util.setContentMaxWidth
4243
import dagger.hilt.android.AndroidEntryPoint
4344
import kotlinx.coroutines.flow.collect
4445
import javax.inject.Inject
@@ -128,6 +129,9 @@ class SearchFragment : Fragment() {
128129
)
129130
v.updatePadding(bottom = padding.bottom + systemInsets.bottom)
130131
}
132+
doOnNextLayout {
133+
setContentMaxWidth(this)
134+
}
131135
}
132136

133137
launchAndRepeatWithViewLifecycle {

mobile/src/main/java/com/google/samples/apps/iosched/ui/sessiondetail/SessionDetailFragment.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import androidx.core.app.ShareCompat
2828
import androidx.core.net.toUri
2929
import androidx.core.view.WindowInsetsCompat
3030
import androidx.core.view.doOnLayout
31+
import androidx.core.view.doOnNextLayout
3132
import androidx.core.view.forEach
3233
import androidx.core.view.updatePadding
3334
import androidx.fragment.app.Fragment
@@ -71,6 +72,7 @@ import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment.Companion.
7172
import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
7273
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
7374
import com.google.samples.apps.iosched.util.openWebsiteUrl
75+
import com.google.samples.apps.iosched.util.setContentMaxWidth
7476
import dagger.hilt.android.AndroidEntryPoint
7577
import kotlinx.coroutines.CoroutineScope
7678
import kotlinx.coroutines.flow.collect
@@ -187,6 +189,9 @@ class SessionDetailFragment : Fragment(), SessionFeedbackFragment.Listener {
187189
// Choose something smaller so that the content stays visible longer.
188190
binding.collapsingToolbar.scrimVisibleHeightTrigger = systemInsets.top * 2
189191
}
192+
doOnNextLayout {
193+
setContentMaxWidth(this)
194+
}
190195
}
191196

192197
launchAndRepeatWithViewLifecycle {

mobile/src/main/java/com/google/samples/apps/iosched/ui/speaker/SpeakerFragment.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.view.LayoutInflater
2222
import android.view.View
2323
import android.view.ViewGroup
2424
import androidx.core.view.WindowInsetsCompat
25+
import androidx.core.view.doOnNextLayout
2526
import androidx.core.view.updatePadding
2627
import androidx.fragment.app.Fragment
2728
import androidx.fragment.app.activityViewModels
@@ -38,6 +39,7 @@ import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager
3839
import com.google.samples.apps.iosched.ui.schedule.ScheduleTwoPaneViewModel
3940
import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
4041
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
42+
import com.google.samples.apps.iosched.util.setContentMaxWidth
4143
import dagger.hilt.android.AndroidEntryPoint
4244
import kotlinx.coroutines.flow.collect
4345
import kotlinx.coroutines.launch
@@ -118,6 +120,9 @@ class SpeakerFragment : Fragment(), OnOffsetChangedListener {
118120
// Choose something smaller so that the content stays visible longer.
119121
binding.collapsingToolbar.scrimVisibleHeightTrigger = systemInsets.top * 2
120122
}
123+
doOnNextLayout {
124+
setContentMaxWidth(this)
125+
}
121126
}
122127

123128
binding.toolbar.setNavigationOnClickListener {

mobile/src/main/java/com/google/samples/apps/iosched/util/UiUtils.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ package com.google.samples.apps.iosched.util
1818

1919
import android.content.Context
2020
import android.graphics.drawable.Drawable
21+
import android.view.View
2122
import androidx.appcompat.content.res.AppCompatResources
23+
import androidx.constraintlayout.widget.ConstraintLayout
2224
import androidx.core.graphics.drawable.DrawableCompat
2325
import androidx.fragment.app.Fragment
2426
import androidx.lifecycle.Lifecycle
@@ -65,3 +67,27 @@ inline fun Fragment.launchAndRepeatWithViewLifecycle(
6567
}
6668
}
6769
}
70+
71+
/**
72+
* Set the maximum width the view should take as a percent of its parent. The view must a direct
73+
* child of a ConstraintLayout.
74+
*/
75+
fun setContentMaxWidth(view: View) {
76+
val parent = view.parent as? ConstraintLayout ?: return
77+
val layoutParams = view.layoutParams as ConstraintLayout.LayoutParams
78+
val screenDensity = view.resources.displayMetrics.density
79+
val widthDp = parent.width / screenDensity
80+
val widthPercent = getContextMaxWidthPercent(widthDp.toInt())
81+
layoutParams.matchConstraintPercentWidth = widthPercent
82+
view.requestLayout()
83+
}
84+
85+
private fun getContextMaxWidthPercent(maxWidthDp: Int): Float {
86+
// These match @dimen/content_max_width_percent.
87+
return when {
88+
maxWidthDp >= 1024 -> 0.6f
89+
maxWidthDp >= 840 -> 0.7f
90+
maxWidthDp >= 600 -> 0.8f
91+
else -> 1f
92+
}
93+
}

mobile/src/main/res/layout-w720dp/activity_main.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
android:layout_width="wrap_content"
6060
android:layout_height="match_parent"
6161
app:layout_constraintStart_toStartOf="parent"
62+
app:headerLayout="@layout/navigation_rail_header"
6263
app:menu="@menu/bar_navigation" />
6364

6465
</androidx.constraintlayout.widget.ConstraintLayout>

mobile/src/main/res/layout/fragment_agenda.xml

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
~ limitations under the License.
1616
-->
1717

18-
<layout xmlns:android="http://schemas.android.com/apk/res/android"
18+
<layout
19+
xmlns:android="http://schemas.android.com/apk/res/android"
1920
xmlns:app="http://schemas.android.com/apk/res-auto"
2021
xmlns:tools="http://schemas.android.com/tools">
2122

@@ -48,20 +49,30 @@
4849

4950
</com.google.android.material.appbar.AppBarLayout>
5051

51-
<androidx.recyclerview.widget.RecyclerView
52-
android:id="@+id/recyclerView"
52+
<androidx.constraintlayout.widget.ConstraintLayout
5353
android:layout_width="match_parent"
5454
android:layout_height="match_parent"
55-
android:clipToPadding="false"
56-
android:orientation="vertical"
57-
android:paddingBottom="@dimen/spacing_normal"
58-
android:paddingTop="@dimen/spacing_normal"
59-
android:scrollbars="vertical"
60-
app:layout_behavior="@string/appbar_scrolling_view_behavior"
61-
app:agendaItems="@{viewModel.agenda}"
62-
app:layoutManager="LinearLayoutManager"
63-
app:timeZoneId="@{viewModel.timeZoneId}"
64-
tools:ignore="UnusedAttribute" />
55+
app:layout_behavior="@string/appbar_scrolling_view_behavior">
6556

57+
<androidx.recyclerview.widget.RecyclerView
58+
android:id="@+id/recyclerView"
59+
android:layout_width="0dp"
60+
android:layout_height="0dp"
61+
android:clipToPadding="false"
62+
android:orientation="vertical"
63+
android:paddingBottom="@dimen/spacing_normal"
64+
android:paddingTop="@dimen/spacing_normal"
65+
android:scrollbars="vertical"
66+
app:layout_constraintBottom_toBottomOf="parent"
67+
app:layout_constraintLeft_toLeftOf="parent"
68+
app:layout_constraintRight_toRightOf="parent"
69+
app:layout_constraintTop_toTopOf="parent"
70+
app:layout_constraintWidth_percent="@dimen/content_max_width_percent"
71+
app:agendaItems="@{viewModel.agenda}"
72+
app:layoutManager="LinearLayoutManager"
73+
app:timeZoneId="@{viewModel.timeZoneId}"
74+
tools:ignore="UnusedAttribute" />
75+
76+
</androidx.constraintlayout.widget.ConstraintLayout>
6677
</androidx.coordinatorlayout.widget.CoordinatorLayout>
6778
</layout>

mobile/src/main/res/layout/fragment_codelabs.xml

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
~ See the License for the specific language governing permissions and
1515
~ limitations under the License.
1616
-->
17-
<layout xmlns:android="http://schemas.android.com/apk/res/android"
17+
<layout
18+
xmlns:android="http://schemas.android.com/apk/res/android"
1819
xmlns:app="http://schemas.android.com/apk/res-auto"
1920
xmlns:tools="http://schemas.android.com/tools">
2021

@@ -47,22 +48,30 @@
4748

4849
</com.google.android.material.appbar.AppBarLayout>
4950

50-
<androidx.recyclerview.widget.RecyclerView
51-
android:id="@+id/codelabs_list"
51+
<androidx.constraintlayout.widget.ConstraintLayout
5252
android:layout_width="match_parent"
5353
android:layout_height="match_parent"
54-
android:clipToPadding="false"
55-
android:orientation="vertical"
56-
android:paddingBottom="@dimen/spacing_normal"
57-
android:paddingTop="@dimen/spacing_normal"
58-
android:scrollbars="vertical"
59-
app:layout_behavior="@string/appbar_scrolling_view_behavior"
60-
app:layout_constraintBottom_toBottomOf="parent"
61-
app:layout_constraintTop_toTopOf="parent"
62-
app:layoutManager="LinearLayoutManager"
63-
tools:listitem="@layout/item_codelab" />
54+
app:layout_behavior="@string/appbar_scrolling_view_behavior">
6455

65-
<!-- TODO add empty view -->
56+
<androidx.recyclerview.widget.RecyclerView
57+
android:id="@+id/codelabs_list"
58+
android:layout_width="0dp"
59+
android:layout_height="0dp"
60+
android:clipToPadding="false"
61+
android:orientation="vertical"
62+
android:paddingBottom="@dimen/spacing_normal"
63+
android:paddingTop="@dimen/spacing_normal"
64+
android:scrollbars="vertical"
65+
app:layout_constraintBottom_toBottomOf="parent"
66+
app:layout_constraintLeft_toLeftOf="parent"
67+
app:layout_constraintRight_toRightOf="parent"
68+
app:layout_constraintTop_toTopOf="parent"
69+
app:layout_constraintWidth_percent="@dimen/content_max_width_percent"
70+
app:layoutManager="LinearLayoutManager"
71+
tools:listitem="@layout/item_codelab" />
72+
73+
<!-- TODO add empty view -->
74+
</androidx.constraintlayout.widget.ConstraintLayout>
6675

6776
</androidx.coordinatorlayout.widget.CoordinatorLayout>
6877
</layout>

mobile/src/main/res/layout/fragment_schedule.xml

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
~ limitations under the License.
1616
-->
1717

18-
<layout xmlns:android="http://schemas.android.com/apk/res/android"
18+
<layout
19+
xmlns:android="http://schemas.android.com/apk/res/android"
1920
xmlns:app="http://schemas.android.com/apk/res-auto"
2021
xmlns:tools="http://schemas.android.com/tools">
2122

@@ -70,17 +71,22 @@
7071
android:fitsSystemWindows="true"
7172
app:layout_behavior="com.google.samples.apps.iosched.util.StatusBarScrimBehavior" />
7273

73-
<com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout
74+
<androidx.constraintlayout.widget.ConstraintLayout
7475
android:layout_width="match_parent"
7576
android:layout_height="match_parent"
76-
app:layout_behavior="@string/appbar_scrolling_view_behavior"
77-
app:onRefreshListener="@{() -> viewModel.onSwipeRefresh()}"
78-
app:refreshing="@{viewModel.swipeRefreshing}"
79-
app:swipeRefreshColors="@{@intArray/swipe_refresh}">
80-
81-
<FrameLayout
82-
android:layout_width="match_parent"
83-
android:layout_height="match_parent">
77+
app:layout_behavior="@string/appbar_scrolling_view_behavior">
78+
79+
<com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout
80+
android:id="@+id/swipe_refresh_layout"
81+
android:layout_width="0dp"
82+
android:layout_height="0dp"
83+
app:layout_constraintBottom_toBottomOf="parent"
84+
app:layout_constraintLeft_toLeftOf="parent"
85+
app:layout_constraintRight_toRightOf="parent"
86+
app:layout_constraintTop_toTopOf="parent"
87+
app:onRefreshListener="@{() -> viewModel.onSwipeRefresh()}"
88+
app:refreshing="@{viewModel.swipeRefreshing}"
89+
app:swipeRefreshColors="@{@intArray/swipe_refresh}">
8490

8591
<androidx.recyclerview.widget.RecyclerView
8692
android:id="@+id/recyclerview_schedule"
@@ -91,24 +97,29 @@
9197
android:paddingBottom="@dimen/schedule_page_padding_bottom"
9298
android:paddingTop="@dimen/spacing_normal"
9399
android:scrollbars="vertical"
94-
app:layoutManager="LinearLayoutManager" />
95-
96-
<TextView
97-
android:id="@+id/empty"
98-
style="@style/Widget.IOSched.EmptyResults"
99-
android:layout_width="match_parent"
100-
android:layout_height="wrap_content"
101-
android:layout_gravity="center"
102-
android:layout_marginBottom="@dimen/schedule_page_padding_bottom"
103-
android:layout_marginHorizontal="@dimen/margin_large"
104-
android:text="@string/schedule_filters_empty"
105-
app:goneUnless="@{isEmpty &amp;&amp; !viewModel.isLoading}"
106-
tools:targetApi="o"
107-
tools:visibility="visible" />
100+
app:layoutManager="LinearLayoutManager"
101+
tools:listitem="@layout/item_session" />
108102

109-
</FrameLayout>
103+
</com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout>
110104

111-
</com.google.samples.apps.iosched.widget.CustomSwipeRefreshLayout>
105+
<TextView
106+
android:id="@+id/empty"
107+
style="@style/Widget.IOSched.EmptyResults"
108+
android:layout_width="match_parent"
109+
android:layout_height="wrap_content"
110+
android:layout_gravity="center"
111+
android:layout_marginBottom="@dimen/schedule_page_padding_bottom"
112+
android:layout_marginHorizontal="@dimen/margin_large"
113+
android:text="@string/schedule_filters_empty"
114+
app:layout_constraintBottom_toBottomOf="parent"
115+
app:layout_constraintLeft_toLeftOf="parent"
116+
app:layout_constraintRight_toRightOf="parent"
117+
app:layout_constraintTop_toTopOf="parent"
118+
app:goneUnless="@{isEmpty &amp;&amp; !viewModel.isLoading}"
119+
tools:targetApi="o"
120+
tools:visibility="visible" />
121+
122+
</androidx.constraintlayout.widget.ConstraintLayout>
112123

113124
<!-- TODO(b/72711711): Provide a better loading indicator -->
114125
<ProgressBar

0 commit comments

Comments
 (0)