Compare commits
57 commits
ebe47c4126
...
2f5ebb28f6
Author | SHA1 | Date | |
---|---|---|---|
2f5ebb28f6 | |||
6569ac64b2 | |||
13962a11d7 | |||
380280686a | |||
53df7da0aa | |||
9e8c65396e | |||
730bf3f7d8 | |||
80b18b242e | |||
1a4e5b8e9e | |||
29469df9c6 | |||
0d30c2b40d | |||
055437c052 | |||
9bc75b475e | |||
1de349e161 | |||
20d688d110 | |||
554937ae03 | |||
8e6e305ecf | |||
c1ba9dcf91 | |||
9bc220d5bb | |||
bb158f0120 | |||
8809d295c4 | |||
7de4996816 | |||
a4ef52f2cc | |||
ce14205c4f | |||
41607fba52 | |||
ca83a92158 | |||
c59faea4d4 | |||
d028c8cb2f | |||
f2f92b2318 | |||
e94b5a67c1 | |||
e386fcd82f | |||
cbbef5cf6f | |||
e8eb71e18b | |||
5abfe147f3 | |||
24ed864645 | |||
4f36b2f54c | |||
b6ee357407 | |||
154ccad9f1 | |||
d9032fb686 | |||
9898e09ac6 | |||
4932ac15f8 | |||
8fd4c8f8fd | |||
79b0f9996f | |||
7024ffc6d6 | |||
2f30d2fd6f | |||
0ade9be784 | |||
bf01006004 | |||
e5e072e4fe | |||
6d34bb6f94 | |||
9d26752d2b | |||
3f5c6b7ebf | |||
79d609f138 | |||
4271ded6aa | |||
7f945ba5fe | |||
12d5fcb834 | |||
3ac064c02c | |||
b0105dc5a4 |
20 changed files with 143 additions and 90 deletions
|
@ -15,7 +15,7 @@ jobs:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: https://git.wbrawner.com/gradle/actions/wrapper-validation@v3
|
uses: https://git.wbrawner.com/gradle/actions/wrapper-validation@v4
|
||||||
unit_tests:
|
unit_tests:
|
||||||
name: Run Unit Tests
|
name: Run Unit Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -30,10 +30,10 @@ jobs:
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: https://git.wbrawner.com/android-actions/setup-android@v3
|
uses: https://git.wbrawner.com/android-actions/setup-android@v3
|
||||||
|
- name: Setup Gradle
|
||||||
|
uses: https://git.wbrawner.com/gradle/actions/setup-gradle@v4
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
uses: https://git.wbrawner.com/gradle/actions/setup-gradle@v3
|
run: ./gradlew check
|
||||||
with:
|
|
||||||
arguments: check
|
|
||||||
- name: Publish JUnit Results
|
- name: Publish JUnit Results
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
if: always()
|
if: always()
|
||||||
|
@ -55,10 +55,10 @@ jobs:
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: https://git.wbrawner.com/android-actions/setup-android@v3
|
uses: https://git.wbrawner.com/android-actions/setup-android@v3
|
||||||
- name: Build with Gradle
|
- name: Setup Gradle
|
||||||
uses: https://git.wbrawner.com/gradle/gradle-build-action@v2
|
uses: https://git.wbrawner.com/gradle/actions/setup-gradle@v4
|
||||||
with:
|
- name: Build APKs
|
||||||
arguments: assemblePlayDebug assemblePlayDebugAndroidTest
|
run: ./gradlew assemblePlayDebug assemblePlayDebugAndroidTest
|
||||||
- name: Grant execute permission for flank_auth.sh
|
- name: Grant execute permission for flank_auth.sh
|
||||||
run: chmod +x flank_auth.sh
|
run: chmod +x flank_auth.sh
|
||||||
- name: Add auth for flank
|
- name: Add auth for flank
|
||||||
|
@ -67,6 +67,4 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
./flank_auth.sh
|
./flank_auth.sh
|
||||||
- name: Run UI tests
|
- name: Run UI tests
|
||||||
uses: https://git.wbrawner.com/gradle/gradle-build-action@v2
|
run: ./gradlew runFlank
|
||||||
with:
|
|
||||||
arguments: runFlank
|
|
||||||
|
|
6
.github/workflows/android.yml
vendored
6
.github/workflows/android.yml
vendored
|
@ -37,7 +37,7 @@ jobs:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
uses: gradle/gradle-build-action@v2
|
uses: gradle/gradle-build-action@v3
|
||||||
with:
|
with:
|
||||||
arguments: testPlayDebugUnitTest
|
arguments: testPlayDebugUnitTest
|
||||||
- name: Publish JUnit Results
|
- name: Publish JUnit Results
|
||||||
|
@ -61,7 +61,7 @@ jobs:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
uses: gradle/gradle-build-action@v2
|
uses: gradle/gradle-build-action@v3
|
||||||
with:
|
with:
|
||||||
arguments: assemblePlayDebug assemblePlayDebugAndroidTest
|
arguments: assemblePlayDebug assemblePlayDebugAndroidTest
|
||||||
- name: Grant execute permission for flank_auth.sh
|
- name: Grant execute permission for flank_auth.sh
|
||||||
|
@ -72,6 +72,6 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
./flank_auth.sh
|
./flank_auth.sh
|
||||||
- name: Run UI tests
|
- name: Run UI tests
|
||||||
uses: gradle/gradle-build-action@v2
|
uses: gradle/gradle-build-action@v3
|
||||||
with:
|
with:
|
||||||
arguments: runFlank
|
arguments: runFlank
|
||||||
|
|
|
@ -21,6 +21,7 @@ try {
|
||||||
keystoreProperties["keyPassword"] = ""
|
keystoreProperties["keyPassword"] = ""
|
||||||
keystoreProperties["storeFile"] = File.createTempFile("temp", ".tmp").absolutePath
|
keystoreProperties["storeFile"] = File.createTempFile("temp", ".tmp").absolutePath
|
||||||
keystoreProperties["storePassword"] = ""
|
keystoreProperties["storePassword"] = ""
|
||||||
|
keystoreProperties["publishCredentialsFile"] = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
@ -37,18 +38,18 @@ android {
|
||||||
}
|
}
|
||||||
compileSdk = libs.versions.maxSdk.get().toInt()
|
compileSdk = libs.versions.maxSdk.get().toInt()
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "11"
|
||||||
}
|
}
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.wbrawner.simplemarkdown"
|
applicationId = "com.wbrawner.simplemarkdown"
|
||||||
minSdk = libs.versions.minSdk.get().toInt()
|
minSdk = libs.versions.minSdk.get().toInt()
|
||||||
targetSdk = libs.versions.maxSdk.get().toInt()
|
targetSdk = libs.versions.maxSdk.get().toInt()
|
||||||
versionCode = 44
|
versionCode = 45
|
||||||
versionName = "1.0.2"
|
versionName = "2024.10.0"
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
testInstrumentationRunnerArguments["clearPackageData"] = "true"
|
testInstrumentationRunnerArguments["clearPackageData"] = "true"
|
||||||
buildConfigField("boolean", "ENABLE_CUSTOM_CSS", "true")
|
buildConfigField("boolean", "ENABLE_CUSTOM_CSS", "true")
|
||||||
|
@ -98,7 +99,11 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lint {
|
lint {
|
||||||
disable += listOf("AndroidGradlePluginVersion", "GradleDependency")
|
disable += listOf(
|
||||||
|
"AndroidGradlePluginVersion",
|
||||||
|
"GradleDependency",
|
||||||
|
"ObsoleteLintCustomCheck"
|
||||||
|
)
|
||||||
warningsAsErrors = true
|
warningsAsErrors = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,6 +113,9 @@ play {
|
||||||
enabled.set(false)
|
enabled.set(false)
|
||||||
track.set("production")
|
track.set("production")
|
||||||
defaultToAppBundles.set(true)
|
defaultToAppBundles.set(true)
|
||||||
|
(keystoreProperties["publishCredentialsFile"] as? String)?.ifBlank { null }?.let {
|
||||||
|
serviceAccountCredentials.set(file(it))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
@ -154,7 +162,6 @@ dependencies {
|
||||||
androidTestImplementation(libs.androidx.core)
|
androidTestImplementation(libs.androidx.core)
|
||||||
androidTestImplementation(libs.androidx.monitor)
|
androidTestImplementation(libs.androidx.monitor)
|
||||||
androidTestImplementation(libs.junit)
|
androidTestImplementation(libs.junit)
|
||||||
androidTestImplementation(libs.hamcrest.core)
|
|
||||||
implementation(libs.androidx.activity.ktx)
|
implementation(libs.androidx.activity.ktx)
|
||||||
implementation(libs.androidx.activity.ktx)
|
implementation(libs.androidx.activity.ktx)
|
||||||
implementation(libs.androidx.animation.core)
|
implementation(libs.androidx.animation.core)
|
||||||
|
|
|
@ -182,6 +182,29 @@ class MarkdownTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun launchWithContentUriTest() = runTest {
|
||||||
|
val markdownText = "# UI Testing\n\nThe quick brown fox jumped over the lazy dog."
|
||||||
|
file.outputStream().writer().use { it.write(markdownText) }
|
||||||
|
val fileUri = FileProvider.getUriForFile(
|
||||||
|
getApplicationContext(),
|
||||||
|
"${BuildConfig.APPLICATION_ID}.fileprovider",
|
||||||
|
file
|
||||||
|
)
|
||||||
|
ActivityScenario.launch<MainActivity>(
|
||||||
|
Intent(
|
||||||
|
Intent.ACTION_VIEW,
|
||||||
|
fileUri,
|
||||||
|
getInstrumentation().targetContext,
|
||||||
|
MainActivity::class.java
|
||||||
|
)
|
||||||
|
)
|
||||||
|
onMainScreen(composeRule) {
|
||||||
|
awaitIdle()
|
||||||
|
checkMarkdownEquals(markdownText)
|
||||||
|
checkTitleEquals("temp.md")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun openEditAndSaveMarkdownTest() = runTest {
|
fun openEditAndSaveMarkdownTest() = runTest {
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
<application
|
<application
|
||||||
android:name=".MarkdownApplication"
|
android:name=".MarkdownApplication"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
android:enableOnBackInvokedCallback="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:resizeableActivity="true"
|
android:resizeableActivity="true"
|
||||||
|
@ -14,7 +15,7 @@
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.App.Starting"
|
android:theme="@style/Theme.App.Starting"
|
||||||
tools:ignore="AllowBackup"
|
tools:ignore="AllowBackup"
|
||||||
tools:targetApi="n">
|
tools:targetApi="tiramisu">
|
||||||
<activity android:name=".MainActivity"
|
<activity android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/app_name_short">
|
android:label="@string/app_name_short">
|
||||||
|
|
|
@ -8,12 +8,11 @@ import androidx.annotation.StringRes
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.compose.animation.AnimatedContentTransitionScope
|
import androidx.compose.animation.AnimatedContentTransitionScope
|
||||||
import androidx.compose.animation.EnterTransition
|
|
||||||
import androidx.compose.animation.core.EaseIn
|
import androidx.compose.animation.core.EaseIn
|
||||||
import androidx.compose.animation.core.LinearEasing
|
import androidx.compose.animation.core.LinearEasing
|
||||||
import androidx.compose.animation.core.tween
|
import androidx.compose.animation.core.tween
|
||||||
import androidx.compose.animation.fadeIn
|
import androidx.compose.animation.fadeIn
|
||||||
import androidx.compose.animation.fadeOut
|
import androidx.compose.animation.scaleOut
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.Help
|
import androidx.compose.material.icons.automirrored.filled.Help
|
||||||
import androidx.compose.material.icons.filled.Edit
|
import androidx.compose.material.icons.filled.Edit
|
||||||
|
@ -108,13 +107,9 @@ class MainActivity : AppCompatActivity(), ActivityCompat.OnRequestPermissionsRes
|
||||||
towards = AnimatedContentTransitionScope.SlideDirection.Start
|
towards = AnimatedContentTransitionScope.SlideDirection.Start
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
popEnterTransition = { EnterTransition.None },
|
popEnterTransition = { fadeIn() },
|
||||||
popExitTransition = {
|
popExitTransition = {
|
||||||
fadeOut(
|
scaleOut(targetScale = 0.9f) + slideOutOfContainer(
|
||||||
animationSpec = tween(
|
|
||||||
300, easing = LinearEasing
|
|
||||||
)
|
|
||||||
) + slideOutOfContainer(
|
|
||||||
animationSpec = tween(300, easing = EaseIn),
|
animationSpec = tween(300, easing = EaseIn),
|
||||||
towards = AnimatedContentTransitionScope.SlideDirection.End
|
towards = AnimatedContentTransitionScope.SlideDirection.End
|
||||||
)
|
)
|
||||||
|
|
|
@ -14,7 +14,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
@ -50,9 +49,6 @@ class MarkdownViewModel(
|
||||||
private val saveMutex = Mutex()
|
private val saveMutex = Mutex()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
viewModelScope.launch {
|
|
||||||
load(null)
|
|
||||||
}
|
|
||||||
preferenceHelper.observe<Boolean>(Preference.LOCK_SWIPING)
|
preferenceHelper.observe<Boolean>(Preference.LOCK_SWIPING)
|
||||||
.onEach {
|
.onEach {
|
||||||
_state.value = _state.value.copy(lockSwiping = it)
|
_state.value = _state.value.copy(lockSwiping = it)
|
||||||
|
|
|
@ -4,7 +4,6 @@ import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
@ -62,6 +61,7 @@ import com.wbrawner.simplemarkdown.MarkdownViewModel
|
||||||
import com.wbrawner.simplemarkdown.ParameterizedText
|
import com.wbrawner.simplemarkdown.ParameterizedText
|
||||||
import com.wbrawner.simplemarkdown.R
|
import com.wbrawner.simplemarkdown.R
|
||||||
import com.wbrawner.simplemarkdown.Route
|
import com.wbrawner.simplemarkdown.Route
|
||||||
|
import com.wbrawner.simplemarkdown.utility.activity
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
|
@ -87,6 +87,10 @@ fun MainScreen(
|
||||||
val alert by viewModel.collectAsState(EditorState::alert, null)
|
val alert by viewModel.collectAsState(EditorState::alert, null)
|
||||||
val saveCallback by viewModel.collectAsState(EditorState::saveCallback, null)
|
val saveCallback by viewModel.collectAsState(EditorState::saveCallback, null)
|
||||||
val lockSwiping by viewModel.collectAsState(EditorState::lockSwiping, false)
|
val lockSwiping by viewModel.collectAsState(EditorState::lockSwiping, false)
|
||||||
|
val intentData = LocalContext.current.activity?.intent?.data
|
||||||
|
LaunchedEffect(intentData) {
|
||||||
|
viewModel.load(intentData?.toString())
|
||||||
|
}
|
||||||
LaunchedEffect(enableAutosave) {
|
LaunchedEffect(enableAutosave) {
|
||||||
if (!enableAutosave) return@LaunchedEffect
|
if (!enableAutosave) return@LaunchedEffect
|
||||||
while (isActive) {
|
while (isActive) {
|
||||||
|
@ -327,7 +331,7 @@ private fun MainScreen(
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
private fun TabbedMarkdownEditor(
|
private fun TabbedMarkdownEditor(
|
||||||
initialMarkdown: String,
|
initialMarkdown: String,
|
||||||
markdown: String,
|
markdown: String,
|
||||||
|
@ -349,7 +353,7 @@ private fun TabbedMarkdownEditor(
|
||||||
}
|
}
|
||||||
HorizontalPager(
|
HorizontalPager(
|
||||||
modifier = Modifier.fillMaxSize(1f), state = pagerState,
|
modifier = Modifier.fillMaxSize(1f), state = pagerState,
|
||||||
beyondBoundsPageCount = 1,
|
beyondViewportPageCount = 1,
|
||||||
userScrollEnabled = !lockSwiping
|
userScrollEnabled = !lockSwiping
|
||||||
) { page ->
|
) { page ->
|
||||||
val keyboardController = LocalSoftwareKeyboardController.current
|
val keyboardController = LocalSoftwareKeyboardController.current
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package com.wbrawner.simplemarkdown.utility
|
package com.wbrawner.simplemarkdown.utility
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.ContextWrapper
|
||||||
import android.content.res.AssetManager
|
import android.content.res.AssetManager
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.OpenableColumns
|
import android.provider.OpenableColumns
|
||||||
import android.view.View
|
|
||||||
import android.view.inputmethod.InputMethodManager
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.Reader
|
import java.io.Reader
|
||||||
|
@ -41,3 +41,11 @@ suspend fun Uri.getName(context: Context): String {
|
||||||
}
|
}
|
||||||
return fileName ?: "Untitled.md"
|
return fileName ?: "Untitled.md"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("RecursivePropertyAccessor")
|
||||||
|
val Context.activity: Activity?
|
||||||
|
get() = when (this) {
|
||||||
|
is Activity -> this
|
||||||
|
is ContextWrapper -> baseContext.activity
|
||||||
|
else -> null
|
||||||
|
}
|
|
@ -47,6 +47,7 @@ class AndroidPreferenceHelper(context: Context, private val coroutineScope: Coro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun <T> observe(preference: Preference): StateFlow<T> = states[preference]!!.asStateFlow() as StateFlow<T>
|
override fun <T> observe(preference: Preference): StateFlow<T> = states[preference]!!.asStateFlow() as StateFlow<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
app/src/play/play/release-notes/en-US/default.txt
Normal file
2
app/src/play/play/release-notes/en-US/default.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
- Fix opening files from external apps
|
||||||
|
- Update dependencies
|
|
@ -1,5 +0,0 @@
|
||||||
- Fix crash on markdown preview
|
|
||||||
- Persist preference for Lock Swiping
|
|
||||||
- Enable gestures on nav drawer when open
|
|
||||||
- Close navigation drawer on back press
|
|
||||||
- Various dependency updates
|
|
|
@ -23,6 +23,7 @@ class FakePreferenceHelper: PreferenceHelper {
|
||||||
preferences[preference] = value
|
preferences[preference] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun <T> observe(preference: Preference): StateFlow<T> =
|
override fun <T> observe(preference: Preference): StateFlow<T> =
|
||||||
preferenceFlow(preference) as StateFlow<T>
|
preferenceFlow(preference) as StateFlow<T>
|
||||||
}
|
}
|
|
@ -23,6 +23,7 @@ import timber.log.Timber
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
|
|
||||||
|
@OptIn(ExperimentalCoroutinesApi::class)
|
||||||
class MarkdownViewModelTest {
|
class MarkdownViewModelTest {
|
||||||
private lateinit var fileHelper: FakeFileHelper
|
private lateinit var fileHelper: FakeFileHelper
|
||||||
private lateinit var preferenceHelper: FakePreferenceHelper
|
private lateinit var preferenceHelper: FakePreferenceHelper
|
||||||
|
|
|
@ -2,25 +2,37 @@ package com.wbrawner.releasehelper
|
||||||
|
|
||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
import org.gradle.api.file.RegularFileProperty
|
import org.gradle.api.file.RegularFileProperty
|
||||||
|
import org.gradle.api.internal.provider.Providers
|
||||||
import org.gradle.api.model.ObjectFactory
|
import org.gradle.api.model.ObjectFactory
|
||||||
|
import org.gradle.api.provider.Property
|
||||||
|
import org.gradle.api.provider.ProviderFactory
|
||||||
|
import org.gradle.api.tasks.Input
|
||||||
import org.gradle.api.tasks.OutputFile
|
import org.gradle.api.tasks.OutputFile
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
private const val CHANGELOG_PATH = "src/play/play/release-notes/en-US/default.txt"
|
private const val CHANGELOG_PATH = "src/play/play/release-notes/en-US/production.txt"
|
||||||
|
|
||||||
abstract class ChangelogTask @Inject constructor(objectFactory: ObjectFactory) : DefaultTask() {
|
abstract class ChangelogTask @Inject constructor(
|
||||||
|
objectFactory: ObjectFactory,
|
||||||
|
providers: ProviderFactory,
|
||||||
|
) : DefaultTask() {
|
||||||
@get:OutputFile
|
@get:OutputFile
|
||||||
val changelogFile: RegularFileProperty = objectFactory.fileProperty()
|
val changelogFile: RegularFileProperty = objectFactory.fileProperty()
|
||||||
|
|
||||||
|
@get:Input
|
||||||
|
@Suppress("UnstableApiUsage")
|
||||||
|
val latestTag: String = providers.exec {
|
||||||
|
commandLine("git" , "describe", "--tags", "--abbrev=0")
|
||||||
|
}.standardOutput.asText.get()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
changelogFile.set(project.layout.projectDirectory.file(CHANGELOG_PATH))
|
changelogFile.set(project.layout.projectDirectory.file(CHANGELOG_PATH))
|
||||||
}
|
}
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun execute() {
|
fun execute() {
|
||||||
val latestTag = "git describe --tags --abbrev=0".execute()
|
val changelog = "git log --format=\"%B\" ${latestTag.trim()}..".execute()
|
||||||
val changelog = "git log --format=\"%B\" ${latestTag.first().trim()}..".execute()
|
|
||||||
logger.info("Latest tag: $latestTag")
|
logger.info("Latest tag: $latestTag")
|
||||||
logger.info("Changelog: ${changelog.joinToString("\n")}")
|
logger.info("Changelog: ${changelog.joinToString("\n")}")
|
||||||
changelogFile.get().asFile.writer().use { writer ->
|
changelogFile.get().asFile.writer().use { writer ->
|
||||||
|
|
|
@ -41,14 +41,18 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "11"
|
||||||
}
|
}
|
||||||
lint {
|
lint {
|
||||||
disable += listOf("AndroidGradlePluginVersion", "GradleDependency")
|
disable += listOf(
|
||||||
|
"AndroidGradlePluginVersion",
|
||||||
|
"GradleDependency",
|
||||||
|
"ObsoleteLintCustomCheck"
|
||||||
|
)
|
||||||
warningsAsErrors = true
|
warningsAsErrors = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,14 +27,18 @@ android {
|
||||||
compose = true
|
compose = true
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "11"
|
||||||
}
|
}
|
||||||
lint {
|
lint {
|
||||||
disable += listOf("AndroidGradlePluginVersion", "GradleDependency")
|
disable += listOf(
|
||||||
|
"AndroidGradlePluginVersion",
|
||||||
|
"GradleDependency",
|
||||||
|
"ObsoleteLintCustomCheck"
|
||||||
|
)
|
||||||
warningsAsErrors = true
|
warningsAsErrors = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +1,34 @@
|
||||||
[versions]
|
[versions]
|
||||||
acra = "5.11.4"
|
acra = "5.12.0"
|
||||||
activityKtx = "1.9.2"
|
activityKtx = "1.9.3"
|
||||||
animationCore = "1.7.2"
|
animationCore = "1.7.5"
|
||||||
appcompat = "1.7.0"
|
appcompat = "1.7.0"
|
||||||
billing = "7.1.0"
|
billing = "7.1.1"
|
||||||
browser = "1.8.0"
|
browser = "1.8.0"
|
||||||
commonMarkVersion = "0.23.0"
|
commonMarkVersion = "0.24.0"
|
||||||
composeBom = "2024.08.00"
|
composeBom = "2024.10.01"
|
||||||
core = "1.6.1"
|
core = "1.6.1"
|
||||||
coreKtx = "1.13.1"
|
coreKtx = "1.15.0"
|
||||||
coreSplashscreen = "1.0.1"
|
coreSplashscreen = "1.0.1"
|
||||||
coroutines = "1.9.0"
|
coroutines = "1.9.0"
|
||||||
dependencyAnalysis = "2.1.0"
|
dependencyAnalysis = "2.4.2"
|
||||||
espressoVersion = "3.6.1"
|
espressoVersion = "3.6.1"
|
||||||
fladle = "0.17.5"
|
fladle = "0.17.5"
|
||||||
googleServices = "4.4.2"
|
googleServices = "4.4.2"
|
||||||
firebaseCrashlyticsGradle = "3.0.2"
|
firebaseCrashlyticsGradle = "3.0.2"
|
||||||
androidGradlePlugin = "8.5.2"
|
androidGradlePlugin = "8.7.2"
|
||||||
hamcrestCore = "1.3"
|
|
||||||
junit = "4.13.2"
|
junit = "4.13.2"
|
||||||
kotlin = "2.0.20"
|
kotlin = "2.0.21"
|
||||||
lifecycleViewmodelKtx = "2.8.6"
|
lifecycleViewmodelKtx = "2.8.7"
|
||||||
material = "1.12.0"
|
material = "1.12.0"
|
||||||
material3WindowSizeClassAndroid = "1.3.0"
|
material3WindowSizeClassAndroid = "1.3.1"
|
||||||
materialIconsCore = "1.7.2"
|
materialIconsCore = "1.7.5"
|
||||||
maxSdk = "35"
|
maxSdk = "35"
|
||||||
minSdk = "23"
|
minSdk = "23"
|
||||||
monitor = "1.7.2"
|
monitor = "1.7.2"
|
||||||
navigationCommon = "2.7.7"
|
navigation = "2.8.3"
|
||||||
navigationRuntimeKtx = "2.7.7"
|
orchestrator = "1.5.1"
|
||||||
navigationVersion = "2.7.7"
|
play = "2.0.2"
|
||||||
orchestrator = "1.5.0"
|
|
||||||
play = "2.0.1"
|
|
||||||
preferenceKtx = "1.2.1"
|
preferenceKtx = "1.2.1"
|
||||||
robolectric = "4.13"
|
robolectric = "4.13"
|
||||||
runner = "1.6.2"
|
runner = "1.6.2"
|
||||||
|
@ -65,9 +62,9 @@ androidx-material-icons-extended = { module = "androidx.compose.material:materia
|
||||||
androidx-material3 = { module = "androidx.compose.material3:material3" }
|
androidx-material3 = { module = "androidx.compose.material3:material3" }
|
||||||
androidx-material3-windowsizeclass = { module = "androidx.compose.material3:material3-window-size-class-android", version.ref = "material3WindowSizeClassAndroid" }
|
androidx-material3-windowsizeclass = { module = "androidx.compose.material3:material3-window-size-class-android", version.ref = "material3WindowSizeClassAndroid" }
|
||||||
androidx-monitor = { module = "androidx.test:monitor", version.ref = "monitor" }
|
androidx-monitor = { module = "androidx.test:monitor", version.ref = "monitor" }
|
||||||
androidx-navigation-common = { module = "androidx.navigation:navigation-common", version.ref = "navigationCommon" }
|
androidx-navigation-common = { module = "androidx.navigation:navigation-common", version.ref = "navigation" }
|
||||||
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationVersion" }
|
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigation" }
|
||||||
androidx-navigation-runtime-ktx = { module = "androidx.navigation:navigation-runtime-ktx", version.ref = "navigationRuntimeKtx" }
|
androidx-navigation-runtime-ktx = { module = "androidx.navigation:navigation-runtime-ktx", version.ref = "navigation" }
|
||||||
androidx-orchestrator = { module = "androidx.test:orchestrator", version.ref = "orchestrator" }
|
androidx-orchestrator = { module = "androidx.test:orchestrator", version.ref = "orchestrator" }
|
||||||
androidx-preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preferenceKtx" }
|
androidx-preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preferenceKtx" }
|
||||||
androidx-runner = { module = "androidx.test:runner", version.ref = "runner" }
|
androidx-runner = { module = "androidx.test:runner", version.ref = "runner" }
|
||||||
|
@ -92,7 +89,6 @@ commonmark-ext-yaml-front-matter = { module = "org.commonmark:commonmark-ext-yam
|
||||||
compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" }
|
compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" }
|
||||||
foundation = { module = "androidx.compose.foundation:foundation" }
|
foundation = { module = "androidx.compose.foundation:foundation" }
|
||||||
foundation-layout = { module = "androidx.compose.foundation:foundation-layout" }
|
foundation-layout = { module = "androidx.compose.foundation:foundation-layout" }
|
||||||
hamcrest-core = { module = "org.hamcrest:hamcrest-core", version.ref = "hamcrestCore" }
|
|
||||||
junit = { module = "junit:junit", version.ref = "junit" }
|
junit = { module = "junit:junit", version.ref = "junit" }
|
||||||
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
|
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
|
||||||
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
|
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
|
||||||
|
|
|
@ -2,3 +2,4 @@ storePassword=
|
||||||
keyPassword=
|
keyPassword=
|
||||||
keyAlias=
|
keyAlias=
|
||||||
storeFile=
|
storeFile=
|
||||||
|
publishCredentialsFile=
|
|
@ -24,17 +24,21 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
compose = true
|
compose = true
|
||||||
}
|
}
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "11"
|
||||||
}
|
}
|
||||||
lint {
|
lint {
|
||||||
disable += listOf("AndroidGradlePluginVersion", "GradleDependency")
|
disable += listOf(
|
||||||
|
"AndroidGradlePluginVersion",
|
||||||
|
"GradleDependency",
|
||||||
|
"ObsoleteLintCustomCheck"
|
||||||
|
)
|
||||||
warningsAsErrors = true
|
warningsAsErrors = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue