Skip to content

Commit cf792cd

Browse files
committedSep 16, 2020
Update JetNews to alpha03.
Update snackbar in [HomeScreen] to not restart when posts changes but the error remains false (previously it would flicker due to a restart) Change workaround in SwipeToRefresh to not crash in alpha03. This was caused by the behavior change of [onCommit]. Various renames from alpha01-alpha03
1 parent 4d40369 commit cf792cd

File tree

15 files changed

+161
-116
lines changed

15 files changed

+161
-116
lines changed
 

‎JetNews/.gitignore

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
*.iml
22
.gradle
33
/local.properties
4-
/.idea
4+
/.idea/caches
5+
/.idea/libraries
6+
/.idea/modules.xml
7+
/.idea/workspace.xml
8+
/.idea/navEditor.xml
9+
/.idea/assetWizardSettings.xml
510
.DS_Store
611
/build
712
/captures
813
.externalNativeBuild
14+
.cxx
15+
local.properties

‎JetNews/app/build.gradle

+8-8
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,18 @@ dependencies {
6767
implementation "androidx.compose.foundation:foundation:$compose_version"
6868
implementation "androidx.compose.animation:animation:$compose_version"
6969
implementation "androidx.ui:ui-tooling:$compose_version"
70-
implementation 'androidx.appcompat:appcompat:1.3.0-alpha01'
71-
implementation 'androidx.activity:activity-ktx:1.1.0'
72-
implementation 'androidx.core:core-ktx:1.5.0-alpha01'
73-
7470
implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
7571

76-
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0-alpha06"
77-
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha06"
72+
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
73+
implementation 'androidx.activity:activity-ktx:1.1.0'
74+
implementation 'androidx.core:core-ktx:1.5.0-alpha02'
75+
76+
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0-alpha07"
77+
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha07"
7878

7979
androidTestImplementation 'junit:junit:4.13'
80-
androidTestImplementation 'androidx.test:rules:1.2.0'
81-
androidTestImplementation 'androidx.test:runner:1.2.0'
80+
androidTestImplementation 'androidx.test:rules:1.3.0'
81+
androidTestImplementation 'androidx.test:runner:1.3.0'
8282
androidTestImplementation "androidx.ui:ui-test:$compose_version"
8383
}
8484

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright 2020 The Android Open Source Project
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+
* https://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.example.jetnews
18+
19+
import androidx.compose.material.ExperimentalMaterialApi
20+
import androidx.compose.material.SnackbarHostState
21+
import androidx.compose.material.rememberScaffoldState
22+
import androidx.compose.runtime.ExperimentalComposeApi
23+
import androidx.compose.runtime.snapshots.snapshotFlow
24+
import androidx.test.platform.app.InstrumentationRegistry
25+
import androidx.ui.test.assertIsDisplayed
26+
import androidx.ui.test.createComposeRule
27+
import androidx.ui.test.onNodeWithText
28+
import com.example.jetnews.ui.home.HomeScreen
29+
import com.example.jetnews.ui.state.UiState
30+
import kotlinx.coroutines.flow.filterNotNull
31+
import kotlinx.coroutines.flow.first
32+
import kotlinx.coroutines.runBlocking
33+
import org.junit.Rule
34+
import org.junit.Test
35+
36+
/**
37+
* Checks that the Snackbar is shown when the HomeScreen data contains an error.
38+
*/
39+
class HomeScreenSnackbarTest {
40+
41+
@get:Rule
42+
val composeTestRule = createComposeRule(disableTransitions = true)
43+
44+
@OptIn(
45+
ExperimentalMaterialApi::class,
46+
ExperimentalComposeApi::class
47+
)
48+
@Test
49+
fun postsContainError_snackbarShown() {
50+
val snackbarHostState = SnackbarHostState()
51+
composeTestRule.setContent {
52+
val scaffoldState = rememberScaffoldState(snackbarHostState = snackbarHostState)
53+
54+
// When the Home screen receives data with an error
55+
HomeScreen(
56+
posts = UiState(exception = IllegalStateException()),
57+
favorites = emptySet(),
58+
onToggleFavorite = {},
59+
onRefreshPosts = {},
60+
onErrorDismiss = {},
61+
navigateTo = {},
62+
scaffoldState = scaffoldState
63+
)
64+
}
65+
66+
// Then the first message received in the Snackbar is an error message
67+
val snackbarText = InstrumentationRegistry.getInstrumentation()
68+
.targetContext.resources.getString(R.string.load_error)
69+
runBlocking {
70+
// snapshotFlow converts a State to a Kotlin Flow so we can observe it
71+
// wait for the first a non-null `currentSnackbarData`
72+
snapshotFlow { snackbarHostState.currentSnackbarData }.filterNotNull().first()
73+
composeTestRule.onNodeWithText(snackbarText, false, false).assertIsDisplayed()
74+
}
75+
}
76+
}

‎JetNews/app/src/androidTest/java/com/example/jetnews/JetnewsUiTest.kt

+5-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import androidx.test.platform.app.InstrumentationRegistry
2121
import androidx.ui.test.assertIsDisplayed
2222
import androidx.ui.test.createComposeRule
2323
import androidx.ui.test.hasSubstring
24-
import androidx.ui.test.onAllNodes
2524
import androidx.ui.test.onNodeWithText
2625
import androidx.ui.test.performClick
2726
import org.junit.Before
@@ -41,16 +40,16 @@ class JetnewsUiTest {
4140
composeTestRule.launchJetNewsApp(InstrumentationRegistry.getInstrumentation().targetContext)
4241
}
4342

44-
@Ignore // TODO Investigate why this passes locally but fail on CI
43+
@Ignore("TODO Investigate why this passes locally but fail on CI")
4544
@Test
4645
fun app_launches() {
47-
onNodeWithText("Jetnews").assertIsDisplayed()
46+
composeTestRule.onNodeWithText("Jetnews").assertIsDisplayed()
4847
}
4948

50-
@Ignore // TODO Investigate why this passes locally but fail on CI
49+
@Ignore("TODO Investigate why this passes locally but fail on CI")
5150
@Test
5251
fun app_opensArticle() {
53-
onAllNodes(hasSubstring("Manuel Vivo"))[0].performClick()
54-
onAllNodes(hasSubstring("3 min read"))[0].assertIsDisplayed()
52+
composeTestRule.onAllNodes(hasSubstring("Manuel Vivo"))[0].performClick()
53+
composeTestRule.onAllNodes(hasSubstring("3 min read"))[0].assertIsDisplayed()
5554
}
5655
}

‎JetNews/app/src/androidTest/java/com/example/jetnews/TestHelper.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ package com.example.jetnews
1919
import android.content.Context
2020
import androidx.compose.runtime.remember
2121
import androidx.lifecycle.SavedStateHandle
22-
import androidx.ui.test.ComposeTestRule
22+
import androidx.ui.test.ComposeTestRuleJUnit
2323
import com.example.jetnews.ui.JetnewsApp
2424
import com.example.jetnews.ui.NavigationViewModel
2525

2626
/**
2727
* Launches the app from a test context
2828
*/
29-
fun ComposeTestRule.launchJetNewsApp(context: Context) {
29+
fun ComposeTestRuleJUnit.launchJetNewsApp(context: Context) {
3030
setContent {
3131
JetnewsApp(
3232
TestAppContainer(context),

‎JetNews/app/src/main/java/com/example/jetnews/ui/JetnewsApp.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ private fun DrawerButton(
180180
) {
181181
Row(
182182
horizontalArrangement = Arrangement.Start,
183-
verticalGravity = Alignment.CenterVertically,
183+
verticalAlignment = Alignment.CenterVertically,
184184
modifier = Modifier.fillMaxWidth()
185185
) {
186186
Image(

‎JetNews/app/src/main/java/com/example/jetnews/ui/SwipeToRefresh.kt

+12-16
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,15 @@ fun SwipeToRefreshLayout(
4242
content: @Composable () -> Unit
4343
) {
4444
val refreshDistance = with(DensityAmbient.current) { RefreshDistance.toPx() }
45-
val state = rememberSwipeableState(refreshingState)
46-
// TODO (https://issuetracker.google.com/issues/164113834): This state->event trampoline is a
47-
// workaround for a bug in the SwipableState API. It should be replaced with a correct solution
48-
// when that bug closes.
49-
onCommit(refreshingState) {
50-
state.animateTo(refreshingState)
51-
}
52-
// TODO (https://issuetracker.google.com/issues/164113834): Hoist state changes when bug is
53-
// fixed and do this logic in the ViewModel. Currently, state.value is a duplicated source of
54-
// truth of refreshingState
55-
onCommit(state.value) {
56-
if (state.value) {
57-
onRefresh()
58-
}
45+
val state = rememberSwipeableState(refreshingState) { newValue ->
46+
// compare both copies of the swipe state before calling onRefresh(). This is a workaround.
47+
if (newValue && !refreshingState) onRefresh()
48+
true
5949
}
6050

6151
Stack(
6252
modifier = Modifier.swipeable(
6353
state = state,
64-
enabled = !state.value,
6554
anchors = mapOf(
6655
-refreshDistance to false,
6756
refreshDistance to true
@@ -71,10 +60,17 @@ fun SwipeToRefreshLayout(
7160
)
7261
) {
7362
content()
74-
Box(Modifier.gravity(Alignment.TopCenter).offsetPx(y = state.offset)) {
63+
Box(Modifier.align(Alignment.TopCenter).offsetPx(y = state.offset)) {
7564
if (state.offset.value != -refreshDistance) {
7665
refreshIndicator()
7766
}
7867
}
68+
69+
// TODO (https://issuetracker.google.com/issues/164113834): This state->event trampoline is a
70+
// workaround for a bug in the SwipableState API. Currently, state.value is a duplicated
71+
// source of truth of refreshingState.
72+
onCommit(refreshingState) {
73+
state.animateTo(refreshingState)
74+
}
7975
}
8076
}

‎JetNews/app/src/main/java/com/example/jetnews/ui/article/ArticleScreen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ private fun BottomBar(
171171
) {
172172
Surface(elevation = 2.dp) {
173173
Row(
174-
verticalGravity = Alignment.CenterVertically,
174+
verticalAlignment = Alignment.CenterVertically,
175175
modifier = Modifier
176176
.preferredHeight(56.dp)
177177
.fillMaxWidth()

‎JetNews/app/src/main/java/com/example/jetnews/ui/article/PostContent.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ import androidx.compose.foundation.layout.Column
2525
import androidx.compose.foundation.layout.Row
2626
import androidx.compose.foundation.layout.Spacer
2727
import androidx.compose.foundation.layout.fillMaxWidth
28+
import androidx.compose.foundation.layout.heightIn
2829
import androidx.compose.foundation.layout.padding
2930
import androidx.compose.foundation.layout.preferredHeight
30-
import androidx.compose.foundation.layout.preferredHeightIn
3131
import androidx.compose.foundation.layout.preferredSize
3232
import androidx.compose.foundation.layout.preferredWidth
3333
import androidx.compose.foundation.shape.CircleShape
@@ -101,7 +101,7 @@ fun PostContent(post: Post, modifier: Modifier = Modifier) {
101101
private fun PostHeaderImage(post: Post) {
102102
post.image?.let { image ->
103103
val imageModifier = Modifier
104-
.preferredHeightIn(minHeight = 180.dp)
104+
.heightIn(min = 180.dp)
105105
.fillMaxWidth()
106106
.clip(shape = MaterialTheme.shapes.medium)
107107
Image(image, imageModifier, contentScale = ContentScale.Crop)

‎JetNews/app/src/main/java/com/example/jetnews/ui/home/HomeScreen.kt

+34-69
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import androidx.compose.foundation.Text
2828
import androidx.compose.foundation.clickable
2929
import androidx.compose.foundation.contentColor
3030
import androidx.compose.foundation.layout.Column
31-
import androidx.compose.foundation.layout.Stack
3231
import androidx.compose.foundation.layout.fillMaxSize
3332
import androidx.compose.foundation.layout.padding
3433
import androidx.compose.foundation.layout.preferredSize
@@ -38,12 +37,14 @@ import androidx.compose.material.CircularProgressIndicator
3837
import androidx.compose.material.Divider
3938
import androidx.compose.material.DrawerValue
4039
import androidx.compose.material.EmphasisAmbient
40+
import androidx.compose.material.ExperimentalMaterialApi
4141
import androidx.compose.material.IconButton
4242
import androidx.compose.material.MaterialTheme
4343
import androidx.compose.material.ProvideEmphasis
4444
import androidx.compose.material.Scaffold
4545
import androidx.compose.material.ScaffoldState
4646
import androidx.compose.material.Snackbar
47+
import androidx.compose.material.SnackbarResult
4748
import androidx.compose.material.Surface
4849
import androidx.compose.material.TextButton
4950
import androidx.compose.material.TopAppBar
@@ -57,6 +58,7 @@ import androidx.compose.runtime.rememberCoroutineScope
5758
import androidx.compose.ui.Alignment
5859
import androidx.compose.ui.Modifier
5960
import androidx.compose.ui.platform.ContextAmbient
61+
import androidx.compose.ui.res.stringResource
6062
import androidx.compose.ui.res.vectorResource
6163
import androidx.compose.ui.text.style.TextAlign
6264
import androidx.compose.ui.unit.dp
@@ -122,11 +124,13 @@ fun HomeScreen(
122124
* Stateless composable is not coupled to any specific state management.
123125
*
124126
* @param posts (state) the data to show on the screen
127+
* @param favorites (state) favorite posts
128+
* @param onToggleFavorite (event) toggles favorite for a post
125129
* @param onRefreshPosts (event) request a refresh of posts
126130
* @param onErrorDismiss (event) request the current error be dismissed
127131
* @param navigateTo (event) request navigation to [Screen]
128-
* @param scaffoldState (state) state for the [Scaffold] component on this screen
129132
*/
133+
@OptIn(ExperimentalMaterialApi::class)
130134
@Composable
131135
fun HomeScreen(
132136
posts: UiState<List<Post>>,
@@ -137,6 +141,24 @@ fun HomeScreen(
137141
navigateTo: (Screen) -> Unit,
138142
scaffoldState: ScaffoldState
139143
) {
144+
if (posts.hasError) {
145+
val errorMessage = stringResource(id = R.string.load_error)
146+
val retryMessage = stringResource(id = R.string.retry)
147+
// Show snackbar using a coroutine, when the coroutine is cancelled the snackbar will
148+
// automatically dismiss. This coroutine will cancel whenever posts.hasError changes, and
149+
// only start when posts.hasError is true (due to the above if-check).
150+
launchInComposition(posts.hasError) {
151+
val snackbarResult = scaffoldState.snackbarHostState.showSnackbar(
152+
message = errorMessage,
153+
actionLabel = retryMessage
154+
)
155+
when (snackbarResult) {
156+
SnackbarResult.ActionPerformed -> onRefreshPosts()
157+
SnackbarResult.Dismissed -> onErrorDismiss()
158+
}
159+
}
160+
}
161+
140162
Scaffold(
141163
scaffoldState = scaffoldState,
142164
drawerContent = {
@@ -147,8 +169,9 @@ fun HomeScreen(
147169
)
148170
},
149171
topBar = {
172+
val title = stringResource(id = R.string.app_name)
150173
TopAppBar(
151-
title = { Text(text = "Jetnews") },
174+
title = { Text(text = title) },
152175
navigationIcon = {
153176
IconButton(onClick = { scaffoldState.drawerState.open() }) {
154177
Icon(vectorResource(R.drawable.ic_jetnews_logo))
@@ -169,7 +192,6 @@ fun HomeScreen(
169192
onRefresh = {
170193
onRefreshPosts()
171194
},
172-
onErrorDismiss = onErrorDismiss,
173195
navigateTo = navigateTo,
174196
favorites = favorites,
175197
onToggleFavorite = onToggleFavorite,
@@ -223,35 +245,27 @@ private fun LoadingContent(
223245
*
224246
* @param posts (state) list of posts and error state to display
225247
* @param onRefresh (event) request to refresh data
226-
* @param onErrorDismiss (event) request that the current error be dismissed
227248
* @param navigateTo (event) request navigation to [Screen]
249+
* @param favorites (state) all favorites
250+
* @param onToggleFavorite (event) request a single favorite be toggled
228251
* @param modifier modifier for root element
229252
*/
230253
@Composable
231254
private fun HomeScreenErrorAndContent(
232255
posts: UiState<List<Post>>,
233256
onRefresh: () -> Unit,
234-
onErrorDismiss: () -> Unit,
235257
navigateTo: (Screen) -> Unit,
236258
favorites: Set<String>,
237259
onToggleFavorite: (String) -> Unit,
238260
modifier: Modifier = Modifier
239261
) {
240-
Stack(modifier = modifier.fillMaxSize()) {
241-
if (posts.data != null) {
242-
PostList(posts.data, navigateTo, favorites, onToggleFavorite)
243-
} else if (!posts.hasError) {
244-
// if there are no posts, and no error, let the user refresh manually
245-
TextButton(onClick = onRefresh, Modifier.fillMaxSize()) {
246-
Text("Tap to load content", textAlign = TextAlign.Center)
247-
}
262+
if (posts.data != null) {
263+
PostList(posts.data, navigateTo, favorites, onToggleFavorite, modifier)
264+
} else if (!posts.hasError) {
265+
// if there are no posts, and no error, let the user refresh manually
266+
TextButton(onClick = onRefresh, modifier.fillMaxSize()) {
267+
Text("Tap to load content", textAlign = TextAlign.Center)
248268
}
249-
ErrorSnackbar(
250-
showError = posts.hasError,
251-
onErrorAction = onRefresh,
252-
onDismiss = onErrorDismiss,
253-
modifier = Modifier.gravity(Alignment.BottomCenter)
254-
)
255269
}
256270
}
257271

@@ -296,55 +310,6 @@ private fun FullScreenLoading() {
296310
}
297311
}
298312

299-
/**
300-
* Display an error snackbar when network requests fail.
301-
*
302-
* @param showError (state) if true, this snackbar will display
303-
* @param modifier modifier for root element
304-
* @param onErrorAction (event) user has requested error action by clicking on it
305-
* @param onDismiss (event) request that this snackbar be dismissed.
306-
*/
307-
@OptIn(ExperimentalAnimationApi::class)
308-
@Composable
309-
private fun ErrorSnackbar(
310-
showError: Boolean,
311-
modifier: Modifier = Modifier,
312-
onErrorAction: () -> Unit = { },
313-
onDismiss: () -> Unit = { }
314-
) {
315-
// Make Snackbar disappear after 5 seconds if the user hasn't interacted with it
316-
launchInComposition(showError) {
317-
delay(timeMillis = 5000L)
318-
if (showError) { onDismiss() }
319-
}
320-
321-
AnimatedVisibility(
322-
visible = showError,
323-
enter = slideInVertically(initialOffsetY = { it }),
324-
exit = slideOutVertically(targetOffsetY = { it }),
325-
modifier = modifier
326-
) {
327-
Snackbar(
328-
modifier = Modifier.padding(16.dp),
329-
text = { Text("Can't update latest news") },
330-
action = {
331-
TextButton(
332-
onClick = {
333-
onErrorAction()
334-
onDismiss()
335-
},
336-
contentColor = contentColor()
337-
) {
338-
Text(
339-
text = "RETRY",
340-
color = MaterialTheme.colors.snackbarAction
341-
)
342-
}
343-
}
344-
)
345-
}
346-
}
347-
348313
/**
349314
* Top section of [PostList]
350315
*

‎JetNews/app/src/main/java/com/example/jetnews/ui/home/PostCardTop.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ import androidx.compose.foundation.Text
2121
import androidx.compose.foundation.layout.Column
2222
import androidx.compose.foundation.layout.Spacer
2323
import androidx.compose.foundation.layout.fillMaxWidth
24+
import androidx.compose.foundation.layout.heightIn
2425
import androidx.compose.foundation.layout.padding
2526
import androidx.compose.foundation.layout.preferredHeight
26-
import androidx.compose.foundation.layout.preferredHeightIn
2727
import androidx.compose.material.EmphasisAmbient
2828
import androidx.compose.material.MaterialTheme
2929
import androidx.compose.material.ProvideEmphasis
@@ -47,7 +47,7 @@ fun PostCardTop(post: Post, modifier: Modifier = Modifier) {
4747
Column(modifier = modifier.fillMaxWidth().padding(16.dp)) {
4848
post.image?.let { image ->
4949
val imageModifier = Modifier
50-
.preferredHeightIn(minHeight = 180.dp)
50+
.heightIn(min = 180.dp)
5151
.fillMaxWidth()
5252
.clip(shape = MaterialTheme.shapes.medium)
5353
Image(image, modifier = imageModifier, contentScale = ContentScale.Crop)

‎JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -349,20 +349,20 @@ private fun TopicItem(itemTitle: String, selected: Boolean, onToggle: () -> Unit
349349
Image(
350350
image,
351351
Modifier
352-
.gravity(Alignment.CenterVertically)
352+
.align(Alignment.CenterVertically)
353353
.preferredSize(56.dp, 56.dp)
354354
.clip(RoundedCornerShape(4.dp))
355355
)
356356
Text(
357357
text = itemTitle,
358358
modifier = Modifier
359359
.weight(1f)
360-
.gravity(Alignment.CenterVertically)
360+
.align(Alignment.CenterVertically)
361361
.padding(16.dp),
362362
style = MaterialTheme.typography.subtitle1
363363
)
364364
SelectTopicButton(
365-
modifier = Modifier.gravity(Alignment.CenterVertically),
365+
modifier = Modifier.align(Alignment.CenterVertically),
366366
selected = selected
367367
)
368368
}

‎JetNews/app/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@
1414
-->
1515
<resources>
1616
<string name="app_name">Jetnews</string>
17+
<string name="load_error">Can\'t update latest news</string>
18+
<string name="retry">Retry</string>
1719
</resources>

‎JetNews/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@
1616

1717
buildscript {
1818
ext.kotlin_version = '1.4.0'
19-
ext.compose_version = '1.0.0-alpha01'
19+
ext.compose_version = '1.0.0-alpha03'
2020

2121
repositories {
2222
google()
2323
jcenter()
2424
}
2525

2626
dependencies {
27-
classpath 'com.android.tools.build:gradle:4.2.0-alpha08'
27+
classpath 'com.android.tools.build:gradle:4.2.0-alpha10'
2828
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
2929
}
3030
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Wed Mar 18 11:29:05 CET 2020
1+
#Wed Sep 16 10:20:00 PDT 2020
22
distributionBase=GRADLE_USER_HOME
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip
34
distributionPath=wrapper/dists
4-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-bin.zip
5+
zipStorePath=wrapper/dists
56
zipStoreBase=GRADLE_USER_HOME
6-
zipStorePath=wrapper/dists

0 commit comments

Comments
 (0)
Please sign in to comment.