diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..449db17b6 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,4 @@ +# style(format): run spotlessApply cmd on codebase to fix lint + format issues +cc43a9f0e1550a50d6025abb2bba2d143e799709 +# style(format): run `./gradlew --init-script gradle/init.gradle.kts spotlessApply` to format + lint all files +1fb424562e796ea572d9f9d6d8d88c3bc9f3bb0c diff --git a/.github/ci-gradle.properties b/.github/ci-gradle.properties new file mode 100644 index 000000000..bd989705d --- /dev/null +++ b/.github/ci-gradle.properties @@ -0,0 +1,28 @@ +# +# Copyright 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +org.gradle.daemon=false +org.gradle.parallel=true +org.gradle.workers.max=2 + +kotlin.incremental=false +kotlin.compiler.execution.strategy=in-process + +# Controls KotlinOptions.allWarningsAsErrors. +# This value used in CI and is currently set to false. +# If you want to treat warnings as errors locally, set this property to true +# in your ~/.gradle/gradle.properties file. +warningsAsErrors=false diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..2c5e5df09 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,225 @@ +name: Main + +on: + push: + branches: + - main + pull_request: + +concurrency: + group: build-${{ github.job }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build ๐Ÿ—๏ธ + runs-on: ubuntu-latest + timeout-minutes: 120 + + steps: + - name: Checkout ๐Ÿ›Ž๏ธ + uses: actions/checkout@v3 + + - name: Validate Gradle Wrapper ๐Ÿ“ + uses: gradle/wrapper-validation-action@v1 + + - name: Copy CI gradle.properties ๐Ÿ“‹ + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK 17 โš™๏ธ + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 17 + + - name: Setup Gradle โš™๏ธ + uses: gradle/gradle-build-action@v2 + + - name: Build all build type and flavor permutations ๐Ÿ—๏ธ + run: ./gradlew assembleDemoDebug + + - name: ๐Ÿ“Š Upload build outputs (APKs) + uses: actions/upload-artifact@v3 + with: + name: APKs + path: '**/build/outputs/apk/**/*.apk' + + spotless-check: + name: Spotless Check ๐Ÿ“ + runs-on: ubuntu-latest + timeout-minutes: 120 + steps: + - name: Checkout ๐Ÿ›Ž๏ธ + uses: actions/checkout@v3 + + - name: Validate Gradle Wrapper ๐Ÿ“ + uses: gradle/wrapper-validation-action@v1 + + - name: Copy CI gradle.properties ๐Ÿ“‹ + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK 17 โš™๏ธ + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 17 + + - name: Setup Gradle โš™๏ธ + uses: gradle/gradle-build-action@v2 + + - name: Check spotless ๐Ÿ“ + run: ./gradlew spotlessCheck --init-script gradle/init.gradle.kts --no-configuration-cache + + lint: + name: Lint Check ๐Ÿ’… + runs-on: ubuntu-latest + timeout-minutes: 120 + steps: + - name: Checkout ๐Ÿ›Ž๏ธ + uses: actions/checkout@v3 + + - name: Validate Gradle Wrapper ๐Ÿ“ + uses: gradle/wrapper-validation-action@v1 + + - name: Copy CI gradle.properties ๐Ÿ“‹ + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK 17 โš™๏ธ + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 17 + + - name: Setup Gradle โš™๏ธ + uses: gradle/gradle-build-action@v2 + + - name: Check lint ๐Ÿ’… + run: ./gradlew lintDemoDebug + + - name: ๐Ÿ“Š Upload lint reports (HTML) + if: always() + uses: actions/upload-artifact@v3 + with: + name: lint-reports + path: '**/build/reports/lint-results-*.html' + + unit-test: + name: Unit Test ๐Ÿงช + runs-on: ubuntu-latest + timeout-minutes: 120 + + steps: + - name: Checkout ๐Ÿ›Ž๏ธ + uses: actions/checkout@v3 + + - name: Validate Gradle Wrapper ๐Ÿ“ + uses: gradle/wrapper-validation-action@v1 + + - name: Copy CI gradle.properties ๐Ÿ“‹ + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK 17 โš™๏ธ + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 17 + + - name: Setup Gradle โš™๏ธ + uses: gradle/gradle-build-action@v2 + + - name: Run local tests ๐Ÿงช + run: ./gradlew testDemoDebug testProdDebug + + - name: ๐Ÿ“Š Upload test results (XML) + if: always() + uses: actions/upload-artifact@v3 + with: + name: test-results + path: '**/build/test-results/test*UnitTest/**.xml' + + androidTest: + if: false # disabled bc packageDemoDebugAndroidTest is failing + name: Android Test ๐Ÿงช + needs: build + runs-on: macos-latest # enables hardware acceleration in the virtual machine + timeout-minutes: 90 + strategy: + matrix: + api-level: [26, 30] + + steps: + - name: Checkout ๐Ÿ›Ž๏ธ + uses: actions/checkout@v3 + + - name: Copy CI gradle.properties ๐Ÿ“‹ + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK 17 โš™๏ธ + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 17 + + - name: Setup Gradle โš™๏ธ + uses: gradle/gradle-build-action@v2 + + - name: Build AndroidTest apps ๐Ÿ—๏ธ + run: ./gradlew packageDemoDebug packageDemoDebugAndroidTest --daemon + + - name: Run instrumentation tests ๐Ÿงช + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + arch: x86_64 + disable-animations: true + disk-size: 6000M + heap-size: 600M + script: ./gradlew connectedDemoDebugAndroidTest --daemon + + - name: ๐Ÿ“Š Upload test reports + if: always() + uses: actions/upload-artifact@v3 + with: + name: test-reports-${{ matrix.api-level }} + path: '**/build/reports/androidTests' + + androidTest-GMD: + if: false # disabled bc packageDemoDebugAndroidTest is failing + name: Android Test GMD ๐Ÿงช + needs: build + runs-on: macos-latest # enables hardware acceleration in the virtual machine + timeout-minutes: 90 + + steps: + - name: Checkout ๐Ÿ›Ž๏ธ + uses: actions/checkout@v3 + + - name: Copy CI gradle.properties ๐Ÿ“‹ + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK 17 โš™๏ธ + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 17 + + - name: Setup Gradle โš™๏ธ + uses: gradle/gradle-build-action@v2 + + - name: Accept Android licenses โœ”๏ธ + run: yes | "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager --licenses || true + + - name: Build AndroidTest apps ๐Ÿ—๏ธ + run: ./gradlew packageDemoDebug packageDemoDebugAndroidTest + + - name: Run instrumented tests with GMD ๐Ÿงช + run: ./gradlew cleanManagedDevices --unused-only && + ./gradlew ciDemoDebugAndroidTest -Dorg.gradle.workers.max=1 + -Pandroid.testoptions.manageddevices.emulator.gpu="swiftshader_indirect" -Pandroid.experimental.testOptions.managedDevices.emulator.showKernelLogging=true + + - name: ๐Ÿ“Š Upload test reports + if: success() || failure() + uses: actions/upload-artifact@v3 + with: + name: test-reports + path: '**/build/reports/androidTests' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..9d2d1726c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,52 @@ +name: GitHub Release with APKs + +on: + push: + tags: + - 'v*' + +jobs: + build: + name: Build and Release ๐Ÿท๏ธ + runs-on: ubuntu-latest + timeout-minutes: 45 + + steps: + - name: Checkout ๐Ÿ›Ž๏ธ + uses: actions/checkout@v3 + + - name: Validate Gradle Wrapper ๐Ÿ“ + uses: gradle/wrapper-validation-action@v1 + + - name: Copy CI gradle.properties ๐Ÿ“‹ + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK 17 โš™๏ธ + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 17 + + - name: Build app ๐Ÿ—๏ธ + run: ./gradlew :app:assembleDemoRelease + + - name: Create Release ๐Ÿš€ + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + draft: true + prerelease: false + + - name: Upload app ๐Ÿ“ค + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: app/build/outputs/apk/demo/release/app-demo-release.apk + asset_name: app-demo-release.apk + asset_content_type: application/vnd.android.package-archive diff --git a/.tool-versions b/.tool-versions index 32479b157..f40abe5ba 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -java adoptopenjdk-17.0.8+7 +java zulu-17.44.17 direnv 2.32.3 maestro 1.31.0 diff --git a/app/src/androidTest/java/com/crisiscleanup/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/crisiscleanup/ExampleInstrumentedTest.kt index f9710e4aa..b69dc732f 100644 --- a/app/src/androidTest/java/com/crisiscleanup/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/crisiscleanup/ExampleInstrumentedTest.kt @@ -19,4 +19,4 @@ class ExampleInstrumentedTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext Assert.assertEquals("com.crisiscleanup.demo.debug", appContext.packageName) } -} \ No newline at end of file +} diff --git a/app/src/androidTest/java/com/crisiscleanup/ui/CrisisCleanupAppStateTest.kt b/app/src/androidTest/java/com/crisiscleanup/ui/CrisisCleanupAppStateTest.kt index 89adf3071..b07b58cf6 100644 --- a/app/src/androidTest/java/com/crisiscleanup/ui/CrisisCleanupAppStateTest.kt +++ b/app/src/androidTest/java/com/crisiscleanup/ui/CrisisCleanupAppStateTest.kt @@ -16,14 +16,16 @@ import androidx.navigation.createGraph import androidx.navigation.testing.TestNavHostController import com.crisiscleanup.core.testing.util.TestNavigationObserver import com.crisiscleanup.core.testing.util.TestNetworkMonitor -import junit.framework.TestCase.* +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertFalse +import junit.framework.TestCase.assertTrue import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test -import java.util.* +import java.util.Locale /** * Tests [CrisisCleanupAppState]. @@ -56,7 +58,7 @@ class CrisisCleanupAppStateTest { windowSizeClass = getCompactWindowClass(), navController = navController, networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -87,7 +89,7 @@ class CrisisCleanupAppStateTest { for (i in destinations.indices) { assertEquals( destinations[i], - state.topLevelDestinations[i].name.lowercase(Locale.getDefault()) + state.topLevelDestinations[i].name.lowercase(Locale.getDefault()), ) } } @@ -99,7 +101,7 @@ class CrisisCleanupAppStateTest { windowSizeClass = getCompactWindowClass(), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -114,7 +116,7 @@ class CrisisCleanupAppStateTest { windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(800.dp, 800.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -124,13 +126,12 @@ class CrisisCleanupAppStateTest { @Test fun CrisisCleanupAppState_showNavRail_large() = runTest { - composeTestRule.setContent { state = CrisisCleanupAppState( windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(900.dp, 1200.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -140,13 +141,12 @@ class CrisisCleanupAppStateTest { @Test fun stateIsOfflineWhenNetworkMonitorIsOffline() = runTest(UnconfinedTestDispatcher()) { - composeTestRule.setContent { state = CrisisCleanupAppState( windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(900.dp, 1200.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -154,7 +154,7 @@ class CrisisCleanupAppStateTest { networkMonitor.setConnected(false) assertEquals( true, - state.isOffline.value + state.isOffline.value, ) } diff --git a/app/src/demo/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/demo/res/mipmap-anydpi-v26/ic_launcher.xml index bbd3e0212..6ae6a23dd 100644 --- a/app/src/demo/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/demo/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/demoDebug/AndroidManifest.xml b/app/src/demoDebug/AndroidManifest.xml index 0ae8aa2f8..92e3300ad 100644 --- a/app/src/demoDebug/AndroidManifest.xml +++ b/app/src/demoDebug/AndroidManifest.xml @@ -1,7 +1,3 @@ - diff --git a/app/src/demoDebug/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/demoDebug/res/mipmap-anydpi-v26/ic_launcher.xml index bbd3e0212..6ae6a23dd 100644 --- a/app/src/demoDebug/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/demoDebug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/demoDebug/res/values/strings.xml b/app/src/demoDebug/res/values/strings.xml index 9fa873246..62842ed17 100644 --- a/app/src/demoDebug/res/values/strings.xml +++ b/app/src/demoDebug/res/values/strings.xml @@ -1,4 +1,3 @@ - ccu \ No newline at end of file diff --git a/app/src/earlybird/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/earlybird/res/mipmap-anydpi-v26/ic_launcher.xml index eca70cfe5..3b9280ae0 100644 --- a/app/src/earlybird/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/earlybird/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe898c387..7fbd64f61 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/java/com/crisiscleanup/AndroidLocationProvider.kt b/app/src/main/java/com/crisiscleanup/AndroidLocationProvider.kt index 60155cd35..35350902b 100644 --- a/app/src/main/java/com/crisiscleanup/AndroidLocationProvider.kt +++ b/app/src/main/java/com/crisiscleanup/AndroidLocationProvider.kt @@ -53,4 +53,4 @@ class AndroidLocationProvider @Inject constructor( } return null } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/AndroidPermissionManager.kt b/app/src/main/java/com/crisiscleanup/AndroidPermissionManager.kt index a6f19266b..6ca998a17 100644 --- a/app/src/main/java/com/crisiscleanup/AndroidPermissionManager.kt +++ b/app/src/main/java/com/crisiscleanup/AndroidPermissionManager.kt @@ -37,8 +37,11 @@ class AndroidPermissionManager @Inject constructor( private var activityWr: WeakReference = WeakReference(null) private val screenshotReadPermission = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) READ_MEDIA_IMAGES - else READ_EXTERNAL_STORAGE + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + READ_MEDIA_IMAGES + } else { + READ_EXTERNAL_STORAGE + } override fun onCreate(owner: LifecycleOwner) { (owner as? ComponentActivity)?.let { activity -> @@ -50,8 +53,11 @@ class AndroidPermissionManager @Inject constructor( // Assume unchanged permission since requested val permission = permissionChanges.value.first val status = - if (isGranted) PermissionStatus.Granted - else PermissionStatus.Denied + if (isGranted) { + PermissionStatus.Granted + } else { + PermissionStatus.Denied + } permissionChanges.value = Pair(permission, status) if (permission == ACCESS_COARSE_LOCATION || permission == ACCESS_FINE_LOCATION) { @@ -67,7 +73,7 @@ class AndroidPermissionManager @Inject constructor( private fun publishLocationPermission() { hasLocationPermission.value = hasPermission(ACCESS_COARSE_LOCATION) || - hasPermission(ACCESS_FINE_LOCATION) + hasPermission(ACCESS_FINE_LOCATION) } private fun hasPermission(permission: String): Boolean { diff --git a/app/src/main/java/com/crisiscleanup/AppVisualAlertManager.kt b/app/src/main/java/com/crisiscleanup/AppVisualAlertManager.kt index fcfdeb7f3..d0cb93002 100644 --- a/app/src/main/java/com/crisiscleanup/AppVisualAlertManager.kt +++ b/app/src/main/java/com/crisiscleanup/AppVisualAlertManager.kt @@ -16,4 +16,4 @@ class AppVisualAlertManager @Inject constructor() : VisualAlertManager { override fun setNonProductionAppAlert(show: Boolean) { showNonProductionAlert.set(show) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/CrisisCleanupAppEnv.kt b/app/src/main/java/com/crisiscleanup/CrisisCleanupAppEnv.kt index 9522ba992..400176639 100644 --- a/app/src/main/java/com/crisiscleanup/CrisisCleanupAppEnv.kt +++ b/app/src/main/java/com/crisiscleanup/CrisisCleanupAppEnv.kt @@ -17,4 +17,4 @@ class CrisisCleanupAppEnv @Inject constructor() : AppEnv { block() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/FirebaseFeedbackReceiver.kt b/app/src/main/java/com/crisiscleanup/FirebaseFeedbackReceiver.kt index 80f7820db..3f9bdd959 100644 --- a/app/src/main/java/com/crisiscleanup/FirebaseFeedbackReceiver.kt +++ b/app/src/main/java/com/crisiscleanup/FirebaseFeedbackReceiver.kt @@ -17,4 +17,4 @@ class FirebaseFeedbackReceiver @Inject constructor( Firebase.appDistribution.startFeedback("Do share O_o") } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/MainActivityViewModel.kt b/app/src/main/java/com/crisiscleanup/MainActivityViewModel.kt index adfa5f677..05f5145e9 100644 --- a/app/src/main/java/com/crisiscleanup/MainActivityViewModel.kt +++ b/app/src/main/java/com/crisiscleanup/MainActivityViewModel.kt @@ -98,8 +98,11 @@ class MainActivityViewModel @Inject constructor( .map { isAccountExpired.value = !it.areTokensValid - if (it.hasAuthenticated) AuthState.Authenticated(it) - else AuthState.NotAuthenticated + if (it.hasAuthenticated) { + AuthState.Authenticated(it) + } else { + AuthState.NotAuthenticated + } } .stateIn( scope = viewModelScope, @@ -200,4 +203,4 @@ sealed interface AuthState { data object Loading : AuthState data class Authenticated(val accountData: AccountData) : AuthState data object NotAuthenticated : AuthState -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/di/AppModule.kt b/app/src/main/java/com/crisiscleanup/di/AppModule.kt index ab17f4b1b..d21307a97 100644 --- a/app/src/main/java/com/crisiscleanup/di/AppModule.kt +++ b/app/src/main/java/com/crisiscleanup/di/AppModule.kt @@ -39,13 +39,13 @@ interface AppModule { @Singleton @Binds fun bindsCrisisCleanupAuthInterceptorProvider( - provider: CrisisCleanupAuthInterceptorProvider + provider: CrisisCleanupAuthInterceptorProvider, ): AuthInterceptorProvider @Singleton @Binds fun bindsCrisisCleanupInterceptorProvider( - provider: CrisisCleanupInterceptorProvider + provider: CrisisCleanupInterceptorProvider, ): RetrofitInterceptorProvider @Singleton @@ -84,4 +84,4 @@ object AppObjectModule { fun firebaseAnalytics( @ApplicationContext context: Context, ): FirebaseAnalytics = FirebaseAnalytics.getInstance(context) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/di/JankStatsModule.kt b/app/src/main/java/com/crisiscleanup/di/JankStatsModule.kt index f019e2ce3..10c2c648c 100644 --- a/app/src/main/java/com/crisiscleanup/di/JankStatsModule.kt +++ b/app/src/main/java/com/crisiscleanup/di/JankStatsModule.kt @@ -31,7 +31,7 @@ object JankStatsModule { @Provides fun providesJankStats( window: Window, - frameListener: JankStats.OnFrameListener + frameListener: JankStats.OnFrameListener, ): JankStats { return JankStats.createAndTrack(window, frameListener) } diff --git a/app/src/main/java/com/crisiscleanup/log/CrisisCleanupAppLogger.kt b/app/src/main/java/com/crisiscleanup/log/CrisisCleanupAppLogger.kt index 92c523433..f5eefb2c3 100644 --- a/app/src/main/java/com/crisiscleanup/log/CrisisCleanupAppLogger.kt +++ b/app/src/main/java/com/crisiscleanup/log/CrisisCleanupAppLogger.kt @@ -41,4 +41,4 @@ class CrisisCleanupAppLogger @Inject constructor( crashlytics.log(message) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/navigation/CrisisCleanupNavigationObserver.kt b/app/src/main/java/com/crisiscleanup/navigation/CrisisCleanupNavigationObserver.kt index 3450848d8..8ca2c9281 100644 --- a/app/src/main/java/com/crisiscleanup/navigation/CrisisCleanupNavigationObserver.kt +++ b/app/src/main/java/com/crisiscleanup/navigation/CrisisCleanupNavigationObserver.kt @@ -23,4 +23,4 @@ class CrisisCleanupNavigationObserver @Inject constructor( override fun onRouteChange(route: String?, arguments: Bundle?) { navigationRoute.value = Pair(navigationRoute.value.second, route) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/navigation/TopLevelDestination.kt b/app/src/main/java/com/crisiscleanup/navigation/TopLevelDestination.kt index ac10fc5aa..a219e22a5 100644 --- a/app/src/main/java/com/crisiscleanup/navigation/TopLevelDestination.kt +++ b/app/src/main/java/com/crisiscleanup/navigation/TopLevelDestination.kt @@ -29,5 +29,5 @@ enum class TopLevelDestination( selectedIcon = ImageVectorIcon(CrisisCleanupIcons.Menu), unselectedIcon = ImageVectorIcon(CrisisCleanupIcons.Menu), titleTranslateKey = "nav.menu", - ) + ), } diff --git a/app/src/main/java/com/crisiscleanup/network/CrisisCleanupInterceptorProvider.kt b/app/src/main/java/com/crisiscleanup/network/CrisisCleanupInterceptorProvider.kt index c6b439a87..2c9d67d88 100644 --- a/app/src/main/java/com/crisiscleanup/network/CrisisCleanupInterceptorProvider.kt +++ b/app/src/main/java/com/crisiscleanup/network/CrisisCleanupInterceptorProvider.kt @@ -280,4 +280,4 @@ class CrisisCleanupAuthInterceptorProvider @Inject constructor() : AuthIntercept } } -private class NetworkAuthException(message: String) : IOException(message) \ No newline at end of file +private class NetworkAuthException(message: String) : IOException(message) diff --git a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt index 967b213cd..c29cd8a03 100644 --- a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt +++ b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt @@ -94,7 +94,6 @@ fun CrisisCleanupApp( ) { CrisisCleanupBackground { Box(Modifier.fillMaxSize()) { - val snackbarHostState = remember { SnackbarHostState() } val isOffline by appState.isOffline.collectAsStateWithLifecycle() @@ -104,11 +103,13 @@ fun CrisisCleanupApp( LaunchedEffect(isOffline) { val notConnectedMessage = translator("info.no_internet") - if (isOffline) snackbarHostState.showSnackbar( - message = notConnectedMessage, - duration = SnackbarDuration.Indefinite, - withDismissAction = true, - ) + if (isOffline) { + snackbarHostState.showSnackbar( + message = notConnectedMessage, + duration = SnackbarDuration.Indefinite, + withDismissAction = true, + ) + } } val authState by viewModel.authState.collectAsStateWithLifecycle() @@ -320,8 +321,11 @@ private fun NavigableContent( .padding(padding) .consumeWindowInsets(padding) .windowInsetsPadding( - if (isFullscreen) WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal) - else WindowInsets.safeDrawing, + if (isFullscreen) { + WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal) + } else { + WindowInsets.safeDrawing + }, ), ) { if (showNavigation && appState.shouldShowNavRail) { @@ -341,7 +345,11 @@ private fun NavigableContent( if (!showNavigation && snackbarHostState.currentSnackbarData != null && keyboardVisibility == ScreenKeyboardVisibility.NotVisible - ) 64.dp else 0.dp + ) { + 64.dp + } else { + 0.dp + } CompositionLocalProvider( LocalAppLayout provides AppLayoutArea(snackbarHostState), @@ -431,8 +439,11 @@ private fun AppHeader( @Composable private fun TopLevelDestination.Icon(isSelected: Boolean, description: String) { - val icon = if (isSelected) selectedIcon - else unselectedIcon + val icon = if (isSelected) { + selectedIcon + } else { + unselectedIcon + } when (icon) { is ImageVectorIcon -> Icon( imageVector = icon.imageVector, @@ -489,7 +500,7 @@ private fun CrisisCleanupBottomBar( selected = selected, onClick = { onNavigateToDestination(destination) }, icon = { destination.Icon(selected, title) }, - modifier = Modifier.testTag("navItem_${title}"), + modifier = Modifier.testTag("navItem_$title"), label = { Text( title, diff --git a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppHeaderUiState.kt b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppHeaderUiState.kt index a5d08070a..2bdb470e6 100644 --- a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppHeaderUiState.kt +++ b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppHeaderUiState.kt @@ -28,4 +28,4 @@ class CrisisCleanupAppHeaderUiState @Inject constructor( override fun setTitle(title: String) { this.title.value = title } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppState.kt b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppState.kt index 6a7b30902..105188d5f 100644 --- a/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppState.kt +++ b/app/src/main/java/com/crisiscleanup/ui/CrisisCleanupAppState.kt @@ -45,7 +45,7 @@ fun rememberCrisisCleanupAppState( networkMonitor: NetworkMonitor, navigationObserver: NavigationObserver, coroutineScope: CoroutineScope = rememberCoroutineScope(), - navController: NavHostController = rememberNavController() + navController: NavHostController = rememberNavController(), ): CrisisCleanupAppState { NavigationTrackingSideEffect(navController) NavigationObserverSideEffect(navController, navigationObserver) @@ -97,7 +97,7 @@ class CrisisCleanupAppState( .stateIn( scope = coroutineScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = false + initialValue = false, ) val hideLoginAlert: Boolean diff --git a/app/src/main/java/com/crisiscleanup/ui/EndOfLifeView.kt b/app/src/main/java/com/crisiscleanup/ui/EndOfLifeView.kt index 4df8fe126..3fb2d1174 100644 --- a/app/src/main/java/com/crisiscleanup/ui/EndOfLifeView.kt +++ b/app/src/main/java/com/crisiscleanup/ui/EndOfLifeView.kt @@ -61,4 +61,4 @@ internal fun EndOfLifeView( ) } } -} \ No newline at end of file +} diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index d9e78cc1c..662b61348 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml index fa0f996d2..c76c34673 100644 --- a/app/src/main/res/xml/backup_rules.xml +++ b/app/src/main/res/xml/backup_rules.xml @@ -1,10 +1,3 @@ - diff --git a/ui-test-hilt-manifest/src/main/java/com/crisiscleanup/uitesthiltmanifest/HiltComponentActivity.kt b/ui-test-hilt-manifest/src/main/java/com/crisiscleanup/uitesthiltmanifest/HiltComponentActivity.kt index 4966b0ca0..a5d24f9a4 100644 --- a/ui-test-hilt-manifest/src/main/java/com/crisiscleanup/uitesthiltmanifest/HiltComponentActivity.kt +++ b/ui-test-hilt-manifest/src/main/java/com/crisiscleanup/uitesthiltmanifest/HiltComponentActivity.kt @@ -1,19 +1,3 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package com.crisiscleanup.uitesthiltmanifest import androidx.activity.ComponentActivity