Skip to content

Commit 8e708cc

Browse files
committed
Merge branch 'main' into lint/sarif
2 parents c882dbd + 1b8b01c commit 8e708cc

File tree

55 files changed

+322
-598
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+322
-598
lines changed

.github/workflows/AndroidCIWithGmd.yaml

Lines changed: 0 additions & 49 deletions
This file was deleted.

.github/workflows/Build.yaml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
branches:
66
- main
77
pull_request:
8+
89
concurrency:
910
group: build-${{ github.ref }}
1011
cancel-in-progress: true
@@ -114,3 +115,42 @@ jobs:
114115
with:
115116
name: test-reports-${{ matrix.api-level }}
116117
path: '**/build/reports/androidTests'
118+
119+
androidTest-GMD:
120+
needs: build
121+
runs-on: macOS-latest # enables hardware acceleration in the virtual machine
122+
timeout-minutes: 55
123+
124+
steps:
125+
- name: Checkout
126+
uses: actions/checkout@v3
127+
128+
- name: Copy CI gradle.properties
129+
run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties
130+
131+
- name: Set up JDK 17
132+
uses: actions/setup-java@v3
133+
with:
134+
distribution: 'zulu'
135+
java-version: 17
136+
137+
- name: Setup Gradle
138+
uses: gradle/gradle-build-action@v2
139+
140+
- name: Setup Android SDK
141+
uses: android-actions/setup-android@v2
142+
143+
- name: Build AndroidTest apps
144+
run: ./gradlew packageDemoDebug packageDemoDebugAndroidTest
145+
146+
- name: Run instrumented tests with GMD
147+
run: ./gradlew cleanManagedDevices --unused-only &&
148+
./gradlew ciDemoDebugAndroidTest -Dorg.gradle.workers.max=1
149+
-Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect" -Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true
150+
151+
- name: Upload test reports
152+
if: success() || failure()
153+
uses: actions/upload-artifact@v3
154+
with:
155+
name: test-reports
156+
path: '**/build/reports/androidTests'

.idea/icon.png

9.48 KB
Loading

.idea/icon_dark.png

10.7 KB
Loading

app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import androidx.compose.runtime.mutableStateOf
3636
import androidx.compose.runtime.remember
3737
import androidx.compose.runtime.setValue
3838
import androidx.compose.ui.Modifier
39-
import androidx.compose.ui.res.painterResource
4039
import androidx.compose.ui.unit.dp
4140
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaButton
4241
import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaFilterChip
@@ -206,13 +205,13 @@ fun NiaCatalog() {
206205
onCheckedChange = { checked -> firstChecked = checked },
207206
icon = {
208207
Icon(
209-
painter = painterResource(id = NiaIcons.BookmarkBorder),
208+
imageVector = NiaIcons.BookmarkBorder,
210209
contentDescription = null,
211210
)
212211
},
213212
checkedIcon = {
214213
Icon(
215-
painter = painterResource(id = NiaIcons.Bookmark),
214+
imageVector = NiaIcons.Bookmark,
216215
contentDescription = null,
217216
)
218217
},
@@ -223,13 +222,13 @@ fun NiaCatalog() {
223222
onCheckedChange = { checked -> secondChecked = checked },
224223
icon = {
225224
Icon(
226-
painter = painterResource(id = NiaIcons.BookmarkBorder),
225+
imageVector = NiaIcons.BookmarkBorder,
227226
contentDescription = null,
228227
)
229228
},
230229
checkedIcon = {
231230
Icon(
232-
painter = painterResource(id = NiaIcons.Bookmark),
231+
imageVector = NiaIcons.Bookmark,
233232
contentDescription = null,
234233
)
235234
},
@@ -239,13 +238,13 @@ fun NiaCatalog() {
239238
onCheckedChange = {},
240239
icon = {
241240
Icon(
242-
painter = painterResource(id = NiaIcons.BookmarkBorder),
241+
imageVector = NiaIcons.BookmarkBorder,
243242
contentDescription = null,
244243
)
245244
},
246245
checkedIcon = {
247246
Icon(
248-
painter = painterResource(id = NiaIcons.Bookmark),
247+
imageVector = NiaIcons.Bookmark,
249248
contentDescription = null,
250249
)
251250
},
@@ -256,13 +255,13 @@ fun NiaCatalog() {
256255
onCheckedChange = {},
257256
icon = {
258257
Icon(
259-
painter = painterResource(id = NiaIcons.BookmarkBorder),
258+
imageVector = NiaIcons.BookmarkBorder,
260259
contentDescription = null,
261260
)
262261
},
263262
checkedIcon = {
264263
Icon(
265-
painter = painterResource(id = NiaIcons.Bookmark),
264+
imageVector = NiaIcons.Bookmark,
266265
contentDescription = null,
267266
)
268267
},
@@ -334,40 +333,31 @@ fun NiaCatalog() {
334333
item { Text("Navigation", Modifier.padding(top = 16.dp)) }
335334
item {
336335
var selectedItem by remember { mutableStateOf(0) }
337-
val items = listOf("For you", "Episodes", "Saved", "Interests")
336+
val items = listOf("For you", "Saved", "Interests")
338337
val icons = listOf(
339338
NiaIcons.UpcomingBorder,
340-
NiaIcons.MenuBookBorder,
341339
NiaIcons.BookmarksBorder,
340+
NiaIcons.Grid3x3,
342341
)
343342
val selectedIcons = listOf(
344343
NiaIcons.Upcoming,
345-
NiaIcons.MenuBook,
346344
NiaIcons.Bookmarks,
345+
NiaIcons.Grid3x3,
347346
)
348-
val tagIcon = NiaIcons.Tag
349347
NiaNavigationBar {
350348
items.forEachIndexed { index, item ->
351349
NiaNavigationBarItem(
352350
icon = {
353-
if (index == 3) {
354-
Icon(imageVector = tagIcon, contentDescription = null)
355-
} else {
356-
Icon(
357-
painter = painterResource(id = icons[index]),
358-
contentDescription = item,
359-
)
360-
}
351+
Icon(
352+
imageVector = icons[index],
353+
contentDescription = item,
354+
)
361355
},
362356
selectedIcon = {
363-
if (index == 3) {
364-
Icon(imageVector = tagIcon, contentDescription = null)
365-
} else {
366-
Icon(
367-
painter = painterResource(id = selectedIcons[index]),
368-
contentDescription = item,
369-
)
370-
}
357+
Icon(
358+
imageVector = selectedIcons[index],
359+
contentDescription = item,
360+
)
371361
},
372362
label = { Text(item) },
373363
selected = selectedItem == index,

app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.test.espresso.Espresso
3333
import androidx.test.espresso.NoActivityResumedException
3434
import com.google.samples.apps.nowinandroid.MainActivity
3535
import com.google.samples.apps.nowinandroid.R
36+
import com.google.samples.apps.nowinandroid.core.rules.GrantPostNotificationsPermissionRule
3637
import dagger.hilt.android.testing.BindValue
3738
import dagger.hilt.android.testing.HiltAndroidRule
3839
import dagger.hilt.android.testing.HiltAndroidTest
@@ -66,9 +67,15 @@ class NavigationTest {
6667
val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build()
6768

6869
/**
69-
* Use the primary activity to initialize the app normally.
70+
* Grant [android.Manifest.permission.POST_NOTIFICATIONS] permission.
7071
*/
7172
@get:Rule(order = 2)
73+
val postNotificationsPermission = GrantPostNotificationsPermissionRule()
74+
75+
/**
76+
* Use the primary activity to initialize the app normally.
77+
*/
78+
@get:Rule(order = 3)
7279
val composeTestRule = createAndroidComposeRule<MainActivity>()
7380

7481
private fun AndroidComposeTestRule<*, *>.stringResource(@StringRes resId: Int) =

app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp
2727
import com.google.accompanist.testharness.TestHarness
2828
import com.google.samples.apps.nowinandroid.core.data.repository.CompositeUserNewsResourceRepository
2929
import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor
30+
import com.google.samples.apps.nowinandroid.core.rules.GrantPostNotificationsPermissionRule
3031
import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepository
3132
import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository
3233
import com.google.samples.apps.nowinandroid.uitesthiltmanifest.HiltComponentActivity
@@ -61,9 +62,15 @@ class NavigationUiTest {
6162
val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build()
6263

6364
/**
64-
* Use a test activity to set the content on.
65+
* Grant [android.Manifest.permission.POST_NOTIFICATIONS] permission.
6566
*/
6667
@get:Rule(order = 2)
68+
val postNotificationsPermission = GrantPostNotificationsPermissionRule()
69+
70+
/**
71+
* Use a test activity to set the content on.
72+
*/
73+
@get:Rule(order = 3)
6774
val composeTestRule = createAndroidComposeRule<HiltComponentActivity>()
6875

6976
val userNewsResourceRepository = CompositeUserNewsResourceRepository(

app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import com.google.samples.apps.nowinandroid.ui.NiaAppState
3939
@Composable
4040
fun NiaNavHost(
4141
appState: NiaAppState,
42+
onShowSnackbar: suspend (String, String?) -> Boolean,
4243
modifier: Modifier = Modifier,
4344
startDestination: String = forYouNavigationRoute,
4445
) {
@@ -50,7 +51,10 @@ fun NiaNavHost(
5051
) {
5152
// TODO: handle topic clicks from each top level destination
5253
forYouScreen(onTopicClick = {})
53-
bookmarksScreen(onTopicClick = {})
54+
bookmarksScreen(
55+
onTopicClick = navController::navigateToTopic,
56+
onShowSnackbar = onShowSnackbar,
57+
)
5458
searchScreen(
5559
onBackClick = navController::popBackStack,
5660
onInterestsClick = { appState.navigateToTopLevelDestination(INTERESTS) },

app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@
1616

1717
package com.google.samples.apps.nowinandroid.navigation
1818

19+
import androidx.compose.ui.graphics.vector.ImageVector
1920
import com.google.samples.apps.nowinandroid.R
20-
import com.google.samples.apps.nowinandroid.core.designsystem.icon.Icon
21-
import com.google.samples.apps.nowinandroid.core.designsystem.icon.Icon.DrawableResourceIcon
22-
import com.google.samples.apps.nowinandroid.core.designsystem.icon.Icon.ImageVectorIcon
2321
import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons
2422
import com.google.samples.apps.nowinandroid.feature.bookmarks.R as bookmarksR
2523
import com.google.samples.apps.nowinandroid.feature.foryou.R as forYouR
@@ -31,26 +29,26 @@ import com.google.samples.apps.nowinandroid.feature.interests.R as interestsR
3129
* next within a single destination will be handled directly in composables.
3230
*/
3331
enum class TopLevelDestination(
34-
val selectedIcon: Icon,
35-
val unselectedIcon: Icon,
32+
val selectedIcon: ImageVector,
33+
val unselectedIcon: ImageVector,
3634
val iconTextId: Int,
3735
val titleTextId: Int,
3836
) {
3937
FOR_YOU(
40-
selectedIcon = DrawableResourceIcon(NiaIcons.Upcoming),
41-
unselectedIcon = DrawableResourceIcon(NiaIcons.UpcomingBorder),
38+
selectedIcon = NiaIcons.Upcoming,
39+
unselectedIcon = NiaIcons.UpcomingBorder,
4240
iconTextId = forYouR.string.for_you,
4341
titleTextId = R.string.app_name,
4442
),
4543
BOOKMARKS(
46-
selectedIcon = DrawableResourceIcon(NiaIcons.Bookmarks),
47-
unselectedIcon = DrawableResourceIcon(NiaIcons.BookmarksBorder),
44+
selectedIcon = NiaIcons.Bookmarks,
45+
unselectedIcon = NiaIcons.BookmarksBorder,
4846
iconTextId = bookmarksR.string.saved,
4947
titleTextId = bookmarksR.string.saved,
5048
),
5149
INTERESTS(
52-
selectedIcon = ImageVectorIcon(NiaIcons.Grid3x3),
53-
unselectedIcon = ImageVectorIcon(NiaIcons.Grid3x3),
50+
selectedIcon = NiaIcons.Grid3x3,
51+
unselectedIcon = NiaIcons.Grid3x3,
5452
iconTextId = interestsR.string.interests,
5553
titleTextId = interestsR.string.interests,
5654
),

0 commit comments

Comments
 (0)