Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 23 additions & 5 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ permissions:
jobs:
build:
runs-on: ubuntu-latest
env:
ZENZ_MODEL_CACHE_DIR: ${{ github.workspace }}/.zenz-model-cache

steps:
- name: Checkout code
Expand Down Expand Up @@ -40,6 +42,12 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-

- name: Cache Zenz model
uses: actions/cache@v4
with:
path: .zenz-model-cache
key: ${{ runner.os }}-zenz-model-v1-a728931c8b4867a53ca33d1ff3fe7360b0f15cd5-Q5_K_M-ggml-model-Q5_K_M.gguf

- name: Decode JKS from Base64
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > my-release-key.jks
Expand All @@ -58,14 +66,24 @@ jobs:
echo "KEY_PASSWORD=${{ secrets.KEY_PASSWORD }}" >> local.properties

- name: Build Release Variants
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
run: |
./gradlew clean \
assembleFullStandardRelease \
assembleLiteStandardRelease \
:app:assembleFullStandardRelease \
-PsplitApks \
--stacktrace \
--no-daemon \
--max-workers=1
./gradlew :app:assembleLiteStandardRelease \
-PsplitApks \
--stacktrace
./gradlew assembleLiteFdroidRelease \
--stacktrace
--stacktrace \
--no-daemon \
--max-workers=1
./gradlew :app:assembleLiteFdroidRelease \
--stacktrace \
--no-daemon \
--max-workers=1

- name: Create Release and Upload APK
uses: softprops/action-gh-release@v2
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ android {
applicationId "com.kazumaproject.markdownhelperkeyboard"
minSdk 24
targetSdk 36
versionCode 780
versionName "1.7.87"
versionCode 782
versionName "1.7.89"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -950,6 +950,8 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
private var keyboardTouchEffectQualityPreference: String = KeyboardTouchEffectQuality.HIGH
private var keyboardTouchEffectColorModePreference: String = "random"
private var keyboardTouchEffectPalettePreference: String = SprayPaintSettings.PALETTE_PAINT_SPLASH
private var liquidInkDensityPreference: Int = 100
private var auroraInkDensityPreference: Int = 100

@ColorInt
private var keyboardTouchEffectColorPreference: Int = Color.rgb(17, 17, 17)
Expand Down Expand Up @@ -1913,6 +1915,8 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
keyboardTouchEffectColorModePreference = preferences.keyboardTouchEffectColorModePreference
keyboardTouchEffectColorPreference = preferences.keyboardTouchEffectColorPreference
keyboardTouchEffectPalettePreference = preferences.keyboardTouchEffectPalettePreference
liquidInkDensityPreference = preferences.liquidInkDensityPreference
auroraInkDensityPreference = preferences.auroraInkDensityPreference
cinematicWaveColorModePreference =
CinematicWaveSettings.normalizeColorMode(preferences.cinematicWaveColorModePreference)
cinematicWavePrimaryColorPreference = preferences.cinematicWavePrimaryColorPreference
Expand Down Expand Up @@ -2345,10 +2349,30 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
mainView: MainLayoutBinding,
floatingView: FloatingKeyboardLayoutBinding?
) {
refreshFluidInkDensityPreferences()
setupMainKeyboardTouchEffect(mainView)
floatingView?.let { setupFloatingKeyboardTouchEffect(it) }
}

private fun refreshFluidInkDensityPreferences() {
liquidInkDensityPreference =
appPreference.keyboard_touch_effect_liquid_ink_density_preference
auroraInkDensityPreference =
appPreference.keyboard_touch_effect_aurora_ink_density_preference
}

private fun resolveFluidInkDensityPercent(effectType: String): Int {
return when {
KeyboardTouchEffectType.isLiquidInk(effectType) ->
liquidInkDensityPreference.coerceIn(50, 300)

KeyboardTouchEffectType.isAuroraInk(effectType) ->
auroraInkDensityPreference.coerceIn(50, 300)

else -> 100
}
}

private fun clearAndPauseKeyboardTouchEffects() {
mainLayoutBinding?.suminagashiInkView?.apply {
clearInk()
Expand Down Expand Up @@ -2418,6 +2442,7 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
} else {
FluidInkTransportMode.PHYSICAL
}
val inkDensityPercent = resolveFluidInkDensityPercent(effectType)
val liquidRippleEnabled =
mainSurfaceActive && KeyboardTouchEffectType.isLiquidRipple(effectType)
val sprayPaintEnabled =
Expand All @@ -2433,7 +2458,8 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
colorMode = keyboardTouchEffectColorModePreference,
fixedColor = keyboardTouchEffectColorPreference,
quality = keyboardTouchEffectQualityPreference,
transportMode = inkTransportMode
transportMode = inkTransportMode,
densityPercent = inkDensityPercent
)
mainView.liquidRippleEffectView.configure(
enabled = liquidRippleEnabled,
Expand Down Expand Up @@ -2542,6 +2568,7 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
} else {
FluidInkTransportMode.PHYSICAL
}
val inkDensityPercent = resolveFluidInkDensityPercent(effectType)
val liquidRippleEnabled =
floatingSurfaceActive && KeyboardTouchEffectType.isLiquidRipple(effectType)
val sprayPaintEnabled =
Expand All @@ -2557,7 +2584,8 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
colorMode = keyboardTouchEffectColorModePreference,
fixedColor = keyboardTouchEffectColorPreference,
quality = keyboardTouchEffectQualityPreference,
transportMode = inkTransportMode
transportMode = inkTransportMode,
densityPercent = inkDensityPercent
)
floatingView.floatingLiquidRippleEffectView.configure(
enabled = liquidRippleEnabled,
Expand Down Expand Up @@ -3931,6 +3959,8 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
keyboardTouchEffectColorModePreference = "random"
keyboardTouchEffectColorPreference = Color.rgb(17, 17, 17)
keyboardTouchEffectPalettePreference = SprayPaintSettings.PALETTE_PAINT_SPLASH
liquidInkDensityPreference = 100
auroraInkDensityPreference = 100
cinematicWaveColorModePreference = CinematicWaveSettings.COLOR_MODE_CINEMATIC_RANDOM
cinematicWavePrimaryColorPreference = CinematicWaveSettings.DEFAULT_PRIMARY_COLOR
cinematicWaveSecondaryColorPreference = CinematicWaveSettings.DEFAULT_SECONDARY_COLOR
Expand Down Expand Up @@ -10040,22 +10070,34 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
configureFlickKeyboardView(mainView.customLayoutDefault, mainView, isFloatingView = false)
}

private fun popupBackgroundColorOrNull(): Int? =
if (appPreference.key_popup_use_custom_color) appPreference.key_popup_background_color else null

private fun popupTextColorOrNull(): Int? =
if (appPreference.key_popup_use_custom_color) appPreference.key_popup_text_color else null

private fun currentTenKeyPopupViewStyle(): PopupViewStyle {
return PopupViewStyle(
sizeScalePercent = appPreference.tenkey_popup_size_scale_percent ?: 100,
textSizeSp = appPreference.tenkey_popup_text_size_sp ?: 28.0f
textSizeSp = appPreference.tenkey_popup_text_size_sp ?: 28.0f,
backgroundColor = popupBackgroundColorOrNull(),
textColor = popupTextColorOrNull()
)
}

private fun currentQwertyPopupViewStyleSet(): QwertyPopupViewStyleSet {
return QwertyPopupViewStyleSet(
keyPreview = PopupViewStyle(
sizeScalePercent = appPreference.qwerty_key_preview_popup_size_scale_percent ?: 100,
textSizeSp = appPreference.qwerty_key_preview_popup_text_size_sp ?: 28.0f
textSizeSp = appPreference.qwerty_key_preview_popup_text_size_sp ?: 28.0f,
backgroundColor = popupBackgroundColorOrNull(),
textColor = popupTextColorOrNull()
),
variation = PopupViewStyle(
sizeScalePercent = appPreference.qwerty_variation_popup_size_scale_percent ?: 100,
textSizeSp = appPreference.qwerty_variation_popup_text_size_sp ?: 28.0f
textSizeSp = appPreference.qwerty_variation_popup_text_size_sp ?: 28.0f,
backgroundColor = popupBackgroundColorOrNull(),
textColor = popupTextColorOrNull()
)
)
}
Expand All @@ -10064,19 +10106,27 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
return FlickPopupViewStyleSet(
directional = PopupViewStyle(
sizeScalePercent = appPreference.flick_directional_popup_size_scale_percent ?: 100,
textSizeSp = appPreference.flick_directional_popup_text_size_sp ?: 28.0f
textSizeSp = appPreference.flick_directional_popup_text_size_sp ?: 28.0f,
backgroundColor = popupBackgroundColorOrNull(),
textColor = popupTextColorOrNull()
),
cross = PopupViewStyle(
sizeScalePercent = appPreference.flick_cross_popup_size_scale_percent ?: 100,
textSizeSp = appPreference.flick_cross_popup_text_size_sp ?: 18.0f
textSizeSp = appPreference.flick_cross_popup_text_size_sp ?: 18.0f,
backgroundColor = popupBackgroundColorOrNull(),
textColor = popupTextColorOrNull()
),
standard = PopupViewStyle(
sizeScalePercent = appPreference.flick_standard_popup_size_scale_percent ?: 100,
textSizeSp = appPreference.flick_standard_popup_text_size_sp ?: 19.0f
textSizeSp = appPreference.flick_standard_popup_text_size_sp ?: 19.0f,
backgroundColor = popupBackgroundColorOrNull(),
textColor = popupTextColorOrNull()
),
tfbi = PopupViewStyle(
sizeScalePercent = appPreference.flick_tfbi_popup_size_scale_percent ?: 100,
textSizeSp = appPreference.flick_tfbi_popup_text_size_sp ?: 20.0f
textSizeSp = appPreference.flick_tfbi_popup_text_size_sp ?: 20.0f,
backgroundColor = popupBackgroundColorOrNull(),
textColor = popupTextColorOrNull()
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@ data class ImePreferencesSnapshot(
val keyboardTouchEffectColorModePreference: String,
val keyboardTouchEffectColorPreference: Int,
val keyboardTouchEffectPalettePreference: String,
val liquidInkDensityPreference: Int,
val auroraInkDensityPreference: Int,
val cinematicWaveColorModePreference: String,
val cinematicWavePrimaryColorPreference: Int,
val cinematicWaveSecondaryColorPreference: Int,
Expand Down Expand Up @@ -535,6 +537,10 @@ data class ImePreferencesSnapshot(
keyboardTouchEffectColorPreference = appPreference.keyboard_touch_effect_color_preference,
keyboardTouchEffectPalettePreference =
appPreference.keyboard_touch_effect_palette_preference,
liquidInkDensityPreference =
appPreference.keyboard_touch_effect_liquid_ink_density_preference,
auroraInkDensityPreference =
appPreference.keyboard_touch_effect_aurora_ink_density_preference,
cinematicWaveColorModePreference =
appPreference.keyboard_touch_effect_cinematic_wave_color_mode_preference,
cinematicWavePrimaryColorPreference =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,16 @@ open class FluidInkEffectView @JvmOverloads constructor(
colorMode: String,
@ColorInt fixedColor: Int,
quality: String = KeyboardTouchEffectQuality.HIGH,
transportMode: FluidInkTransportMode = FluidInkTransportMode.PHYSICAL
transportMode: FluidInkTransportMode = FluidInkTransportMode.PHYSICAL,
densityPercent: Int = FluidInkSettings.DEFAULT_DENSITY_PERCENT
) {
currentSettings = FluidInkSettings(
enabled = enabled,
colorMode = colorMode,
fixedColor = FluidInkSettings.withoutTransparentAlpha(fixedColor),
quality = KeyboardTouchEffectQuality.normalize(quality),
transportMode = transportMode
transportMode = transportMode,
densityPercent = densityPercent
)

if (!enabled) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ internal class FluidInkRenderer(
paused = true
return@postOnRenderer
}
simulation?.setInkDensityPercent(settings.normalizedDensityPercent)
if (qualityChanged && surfaceWidth > 0 && surfaceHeight > 0 && simulation != null) {
simulation?.resizeSurface(
surfaceWidth = surfaceWidth,
Expand All @@ -80,6 +81,7 @@ internal class FluidInkRenderer(
if (egl == null) {
egl = EglEnvironment(surfaceTexture)
simulation = simulationFactory()
simulation?.setInkDensityPercent(settings.normalizedDensityPercent)
simulation?.initialize(
surfaceWidth = width,
surfaceHeight = height,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,21 @@ internal data class FluidInkSettings(
val colorMode: String,
@ColorInt val fixedColor: Int,
val quality: String = KeyboardTouchEffectQuality.HIGH,
val transportMode: FluidInkTransportMode = FluidInkTransportMode.PHYSICAL
val transportMode: FluidInkTransportMode = FluidInkTransportMode.PHYSICAL,
val densityPercent: Int = DEFAULT_DENSITY_PERCENT
) {
val normalizedColorMode: String =
if (colorMode == COLOR_MODE_FIXED) COLOR_MODE_FIXED else COLOR_MODE_RANDOM
val normalizedQuality: String = KeyboardTouchEffectQuality.normalize(quality)
val normalizedDensityPercent: Int =
densityPercent.coerceIn(MIN_DENSITY_PERCENT, MAX_DENSITY_PERCENT)

companion object {
const val COLOR_MODE_RANDOM = "random"
const val COLOR_MODE_FIXED = "fixed"
const val MIN_DENSITY_PERCENT = 50
const val MAX_DENSITY_PERCENT = 300
const val DEFAULT_DENSITY_PERCENT = 100

@ColorInt
const val DEFAULT_INK_COLOR: Int = 0xFF111111.toInt()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ internal class FluidSimulation(
private var velocityDiffusionSource: RenderTarget? = null
private var renderTargetFormat = FluidRenderTargetFormat.HalfFloat
private var waterPhaseSeconds = 0f
private var inkDensityMultiplier = 1f
private var maxDyeDensity = DEFAULT_MAX_DYE_DENSITY

private var copyProgram = 0
private var splatProgram = 0
Expand Down Expand Up @@ -152,6 +154,21 @@ internal class FluidSimulation(
resizeTargets(nextGrid = nextGrid, preserveExistingDye = true)
}

fun setInkDensityPercent(percent: Int) {
val clamped = percent.coerceIn(
FluidInkSettings.MIN_DENSITY_PERCENT,
FluidInkSettings.MAX_DENSITY_PERCENT
)
inkDensityMultiplier = clamped / 100f
maxDyeDensity = if (clamped <= FluidInkSettings.DEFAULT_DENSITY_PERCENT) {
DEFAULT_MAX_DYE_DENSITY
} else {
val t = ((clamped - FluidInkSettings.DEFAULT_DENSITY_PERCENT).toFloat() / 200f)
.coerceIn(0f, 1f)
DEFAULT_MAX_DYE_DENSITY + (1f - DEFAULT_MAX_DYE_DENSITY) * t
}
}

fun render(
inputCommands: List<FluidInputCommand>,
dtSeconds: Float,
Expand Down Expand Up @@ -395,6 +412,8 @@ internal class FluidSimulation(
uniform1f(splatProgram, "uRadius", radius)
uniform1f(splatProgram, "uAspect", grid.width.toFloat() / grid.height.toFloat())
uniform1f(splatProgram, "uIsDye", if (isDye) 1f else 0f)
uniform1f(splatProgram, "uInkDensity", inkDensityMultiplier)
uniform1f(splatProgram, "uMaxDyeDensity", maxDyeDensity)
uniformEncoding(splatProgram, "uTargetEncoded", source)
uniformEncoding(splatProgram, "uOutputEncoded", destination)
uniform1f(splatProgram, "uSignedRange", SIGNED_FIELD_RANGE)
Expand Down Expand Up @@ -748,6 +767,7 @@ internal class FluidSimulation(
private const val MIN_DT_SECONDS = 1f / 120f
private const val MAX_DT_SECONDS = 1f / 24f
private const val WATER_PHASE_WRAP_SECONDS = 10_000f
private const val DEFAULT_MAX_DYE_DENSITY = 0.84f

private val QUAD = floatArrayOf(
-1f, -1f,
Expand Down Expand Up @@ -789,6 +809,8 @@ internal class FluidSimulation(
uniform float uRadius;
uniform float uAspect;
uniform float uIsDye;
uniform float uInkDensity;
uniform float uMaxDyeDensity;
uniform float uTargetEncoded;
uniform float uOutputEncoded;
uniform float uSignedRange;
Expand All @@ -806,12 +828,16 @@ internal class FluidSimulation(
float radiusSquared = radius * radius;
float falloff = exp(-dot(delta, delta) / radiusSquared);
if (uIsDye > 0.5) {
const float MAX_DYE_DENSITY = 0.84;
const float INK_DEPOSIT_STRENGTH = 0.52;
vec4 base = texture(uTarget, vUv);
vec3 baseColor = base.a > 0.0001 ? base.rgb / base.a : uValue;
float deposit = clamp(uAlpha * falloff * INK_DEPOSIT_STRENGTH, 0.0, 0.42);
float remainingCapacity = max(MAX_DYE_DENSITY - base.a, 0.0);
float depositLimit = min(1.0, 0.42 * uInkDensity);
float deposit = clamp(
uAlpha * falloff * INK_DEPOSIT_STRENGTH * uInkDensity,
0.0,
depositLimit
);
float remainingCapacity = max(uMaxDyeDensity - base.a, 0.0);
float nextAlpha = base.a + min(deposit, remainingCapacity);
float colorWeight = clamp(deposit / (base.a + deposit + 0.0001), 0.0, 0.24);
vec3 mixedColor = mix(baseColor, uValue, colorWeight);
Expand Down
Loading
Loading