Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
ba59daa
Update ObjectivesPlugin.kt
Dti-1 Mar 5, 2026
4412960
Update ObjectivesPlugin.kt
Dti-1 Mar 5, 2026
598a4ed
Update ObjectivesPlugin.kt
Dti-1 Mar 5, 2026
e6d00ff
Create main.yml
Dti-1 Mar 5, 2026
2cfebf2
Update ObjectivesPlugin.kt
Dti-1 Mar 5, 2026
4c90a8f
Update Objective5.kt
Dti-1 Mar 5, 2026
a49d25a
Update Objective7.kt
Dti-1 Mar 5, 2026
636e425
Update Objective8.kt
Dti-1 Mar 5, 2026
76929a0
Update Objective9.kt
Dti-1 Mar 5, 2026
b6b4ebc
Update ObjectivesPlugin.kt
Dti-1 Mar 5, 2026
31cfa46
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
e07e2d7
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
296a3d0
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
87be2b5
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
e24fc70
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
6aa5838
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
331efda
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
bb5108b
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
cbe8b04
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
89af498
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
f2834aa
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
e53275b
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
2119654
Update ObjectivesFragment.kt
Dti-1 Mar 6, 2026
f42caa7
Update ObjectivesPlugin.kt
Dti-1 Mar 6, 2026
f3eab15
Update ObjectivesFragment.kt
Dti-1 Mar 6, 2026
cd3ca3c
Update LoopPlugin.kt
Dti-1 Mar 6, 2026
f3b7e0d
Update LoopPlugin.kt
Dti-1 Mar 6, 2026
c85f5c1
Update ObjectivesFragment.kt
Dti-1 Mar 6, 2026
671e2cf
Update Objective.kt
Dti-1 Mar 6, 2026
0201224
Update LoopPlugin.kt
Dti-1 Mar 7, 2026
93784bb
Update ObjectivesFragment.kt
Dti-1 Mar 7, 2026
f53870d
feat(aps): add BetaCellPlugin β-cell pancreas model v1.5
Dti-1 Mar 10, 2026
3fa4eb5
fix(keys): remove duplicate BetaCell entries in DoubleKey
Dti-1 Mar 10, 2026
bb8638e
fix(keys): add missing BetaCell entries in BooleanKey and IntKey
Dti-1 Mar 10, 2026
c474955
fix(betacell): remove getGlucoseStatusData override — causes infinite…
Dti-1 Mar 10, 2026
44d3a20
fix(betacell): getGlucoseStatusData returns null — avoids infinite loop
Dti-1 Mar 10, 2026
4cee876
fix(betacell): pass allowOldData=false to getGlucoseStatusData
Dti-1 Mar 10, 2026
257e493
fix(betacell): compute GlucoseStatus directly from IobCobCalculator —…
Dti-1 Mar 10, 2026
d610681
fix(betacell): use GlucoseStatusCalculatorSMB to get CGM data — same …
Dti-1 Mar 10, 2026
561ac13
fix(betacell): use apsResultProvider.get().with(RT) — fixes ClassCast…
Dti-1 Mar 10, 2026
ce879fb
debug(betacell): log prefs snapshot at each invoke
Dti-1 Mar 11, 2026
b0a8970
fix(betacell): send EventOpenAPSUpdateGui + EventAPSCalculationFinish…
Dti-1 Mar 11, 2026
b45a2cb
feat(betacell): add predictive hypo guard — slope + IOB based prevention
Dti-1 Mar 11, 2026
69fe304
feat(betacell): add hypoAlertMargin + hypoRapidSlope keys for predict…
Dti-1 Mar 11, 2026
4cdedd0
feat(betacell): improved predictive hypo guard — projection + basalFa…
Dti-1 Mar 11, 2026
879ed27
fix(betacell): smoothed slope 3pts, IOB basal+bolus, gradient basalFa…
Dti-1 Mar 11, 2026
7241d39
fix(betacell): update buildReason signature with iobTotal
Dti-1 Mar 11, 2026
8fe3b84
refactor(betacell): remove redundant iob param from calcBetaSecretion…
Dti-1 Mar 11, 2026
9a814c6
refactor(betacell): remove redundant iob param, SMB gated by iobTotal…
Dti-1 Mar 11, 2026
15b2014
feat(betacell): add hypoAlertMargin + hypoRapidSlope to preference sc…
Dti-1 Mar 11, 2026
7ce6db1
fix(betacell): remove requiredKey filter — show all preferences in menu
Dti-1 Mar 11, 2026
678f43a
feat(betacell): add hypoAlertMargin + hypoRapidSlope to pref_betacell…
Dti-1 Mar 11, 2026
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
291 changes: 291 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
name: AAPS CI

on:
workflow_dispatch:
inputs:
buildVariant:
description: 'Select Build Variant'
required: true
default: 'fullRelease'
type: choice
options:
- fullRelease
- fullDebug
- aapsclientRelease
- aapsclientDebug
- aapsclient2Release
- aapsclient2Debug
- pumpcontrolRelease
- pumpcontrolDebug

jobs:
build:
name: Build AAPS
runs-on: ubuntu-latest
steps:
- name: Decode Secrets Keystore Set and Oauth2 to Env
run: |
if [ -n "${{ secrets.KEYSTORE_SET }}" ]; then
echo "🔐 Decoding KEYSTORE_SET..."
DECODED=$(echo "${{ secrets.KEYSTORE_SET }}" | base64 -d)

KEYSTORE_BASE64=$(echo "$DECODED" | cut -d'|' -f1)
KEYSTORE_PASSWORD=$(echo "$DECODED" | cut -d'|' -f2)
KEY_ALIAS=$(echo "$DECODED" | cut -d'|' -f3)
KEY_PASSWORD=$(echo "$DECODED" | cut -d'|' -f4)

echo "KEYSTORE_BASE64=$KEYSTORE_BASE64" >> $GITHUB_ENV
echo "KEYSTORE_PASSWORD=$KEYSTORE_PASSWORD" >> $GITHUB_ENV
echo "KEY_ALIAS=$KEY_ALIAS" >> $GITHUB_ENV
echo "KEY_PASSWORD=$KEY_PASSWORD" >> $GITHUB_ENV

echo "::add-mask::$KEYSTORE_BASE64"
echo "::add-mask::$KEYSTORE_PASSWORD"
echo "::add-mask::$KEY_ALIAS"
echo "::add-mask::$KEY_PASSWORD"

echo "✅ Keystore parameters extracted from KEYSTORE_SET"
else
echo "ℹ️ KEYSTORE_SET not provided, using separate secrets."
echo "KEYSTORE_BASE64=${{ secrets.KEYSTORE_BASE64 }}" >> $GITHUB_ENV
echo "KEYSTORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> $GITHUB_ENV
echo "KEY_ALIAS=${{ secrets.KEY_ALIAS }}" >> $GITHUB_ENV
echo "KEY_PASSWORD=${{ secrets.KEY_PASSWORD }}" >> $GITHUB_ENV
fi
echo "GDRIVE_OAUTH2=${{ secrets.GDRIVE_OAUTH2 }}" >> $GITHUB_ENV

- name: Check Secrets
run: |
echo "🔍 Checking required secrets..."
MISSING=0

check_secret() {
if [ -z "$1" ]; then
echo "❌ Missing secret: $2"
MISSING=1
fi
}

# Check secrets
check_secret "$GDRIVE_OAUTH2" "GDRIVE_OAUTH2"

check_secret "$KEYSTORE_BASE64" "KEYSTORE_BASE64"
check_secret "$KEYSTORE_PASSWORD" "KEYSTORE_PASSWORD"
check_secret "$KEY_ALIAS" "KEY_ALIAS"
check_secret "$KEY_PASSWORD" "KEY_PASSWORD"

if [ "$MISSING" -eq 1 ]; then
echo "🛑 Missing required secrets. Stopping build."
exit 1
fi

echo "✅ All required secrets are present."

- name: Decode keystore file
run: |
mkdir -p "$RUNNER_TEMP/keystore"
echo "$KEYSTORE_BASE64" | base64 -d > "$RUNNER_TEMP/keystore/keystore.jks"

- name: Validating keystore, alias and password
run: |
set -x
echo "🔐 Validating keystore, alias and password"

# Create a dummy JAR file (quick method using zip)
echo "test" > dummy.txt
zip -q dummy.jar dummy.txt
rm dummy.txt

# Attempt to validate using jarsigner
JARSIGNER_LOG=$(mktemp)
if ! jarsigner \
-keystore "$RUNNER_TEMP/keystore/keystore.jks" \
-storepass "$KEYSTORE_PASSWORD" \
-keypass "$KEY_PASSWORD" \
dummy.jar "$KEY_ALIAS" > "$JARSIGNER_LOG" 2>&1; then
echo "❌ Either KEYSTORE_BASE64, KEYSTORE_PASSWORD, KEY_PASSWORD, or KEY_ALIAS is incorrect"
echo "🔍 jarsigner error output:"
cat "$JARSIGNER_LOG"
rm -f "$JARSIGNER_LOG" dummy.jar
exit 1
fi
rm -f "$JARSIGNER_LOG" dummy.jar
echo "✅ Keystore, alias, and key password are valid."

rm -f "$KEYTOOL_LOG"
echo "✅ Keystore and credentials validated."

- name: Decode GDrive OAuth2 secrets
run: |
echo "🔐 Decoding GDRIVE_OAUTH2..."
DECODED=$(echo "${{ secrets.GDRIVE_OAUTH2 }}" | base64 -d)

GDRIVE_CLIENT_ID=$(echo "$DECODED" | cut -d'|' -f1)
GDRIVE_REFRESH_TOKEN=$(echo "$DECODED" | cut -d'|' -f2)

echo "::add-mask::$GDRIVE_CLIENT_ID"
echo "::add-mask::$GDRIVE_REFRESH_TOKEN"

echo "GDRIVE_CLIENT_ID=$GDRIVE_CLIENT_ID" >> $GITHUB_ENV
echo "GDRIVE_REFRESH_TOKEN=$GDRIVE_REFRESH_TOKEN" >> $GITHUB_ENV

echo "✅ GDRIVE_CLIENT_ID and GDRIVE_REFRESH_TOKEN extracted from GDRIVE_OAUTH2"

- name: Retrieving Google Drive access token
run: |
echo "🔐 Getting Google OAuth2 access token..."
TOKEN_RESPONSE=$(curl -s -X POST https://oauth2.googleapis.com/token \
-d client_id="$GDRIVE_CLIENT_ID" \
-d refresh_token="$GDRIVE_REFRESH_TOKEN" \
-d grant_type=refresh_token)
ACCESS_TOKEN=$(echo "$TOKEN_RESPONSE" | jq -r .access_token)
echo "::add-mask::$ACCESS_TOKEN"
if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "null" ]; then
echo "❌ Failed to get access token."
echo "$TOKEN_RESPONSE"
exit 1
fi
echo "ACCESS_TOKEN=$ACCESS_TOKEN" >> $GITHUB_ENV
echo "✅ Access token obtained."

- name: Checkout source code
uses: actions/checkout@v4

- name: Set BUILD_VARIANT
run: |
BUILD_VARIANT="${{ github.event.inputs.buildVariant }}"
echo "BUILD_VARIANT=$BUILD_VARIANT" >> $GITHUB_ENV
VARIANT_FLAVOR=$(echo "$BUILD_VARIANT" | sed -E 's/(Release|Debug)$//' | tr '[:upper:]' '[:lower:]')
VARIANT_TYPE=$(echo "$BUILD_VARIANT" | grep -oE '(Release|Debug)$' | tr '[:upper:]' '[:lower:]')
echo "VARIANT_FLAVOR=$VARIANT_FLAVOR" >> $GITHUB_ENV
echo "VARIANT_TYPE=$VARIANT_TYPE" >> $GITHUB_ENV
VERSION_SUFFIX=""
if [[ "$VARIANT_FLAVOR" != "full" ]]; then VERSION_SUFFIX="$VARIANT_FLAVOR"; fi
if [[ "$VARIANT_TYPE" == "debug" ]]; then VERSION_SUFFIX="$VERSION_SUFFIX-debug"; fi
if [[ -n "$VERSION_SUFFIX" && "$VERSION_SUFFIX" != -* ]]; then VERSION_SUFFIX="-$VERSION_SUFFIX"; fi
echo "VERSION_SUFFIX=$VERSION_SUFFIX" >> $GITHUB_ENV

- name: Extract VERSION
run: |
BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
if echo "$BRANCH_NAME" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?$'; then
VERSION="$BRANCH_NAME"
else
VERSION=$(grep 'val appVersion' buildSrc/src/main/kotlin/Versions.kt | awk -F '"' '{print $2}')
fi
echo "VERSION=$VERSION" >> $GITHUB_ENV

- name: Set up JDK
uses: actions/setup-java@v4
with:
# When upgrading the JDK, please update this section accordingly as well.
java-version: 21
distribution: 'temurin'
cache: gradle

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build APKs
run: |
./gradlew :app:assemble${{ env.BUILD_VARIANT }} :wear:assemble${{ env.BUILD_VARIANT }} \
-Dorg.gradle.jvmargs="-Xmx8g -XX:+UseParallelGC -Xss1024m" \
-Dkotlin.daemon.jvm.options="-Xmx2g" \
-Dkotlin.compiler.execution.strategy="in-process" \
-Dorg.gradle.daemon=true \
-Dorg.gradle.workers.max=8 \
-Dorg.gradle.caching=true \
-Pandroid.injected.signing.store.file="$RUNNER_TEMP/keystore/keystore.jks" \
-Pandroid.injected.signing.store.password="$KEYSTORE_PASSWORD" \
-Pandroid.injected.signing.key.alias="$KEY_ALIAS" \
-Pandroid.injected.signing.key.password="$KEY_PASSWORD"

- name: Rename APKs with version
run: |
mv app/build/outputs/apk/${{ env.VARIANT_FLAVOR }}/${{ env.VARIANT_TYPE }}/*.apk aaps-${{ env.VERSION }}${{ env.VERSION_SUFFIX }}.apk
mv wear/build/outputs/apk/${{ env.VARIANT_FLAVOR }}/${{ env.VARIANT_TYPE }}/*.apk aaps-wear-${{ env.VERSION }}${{ env.VERSION_SUFFIX }}.apk

- name: Upload APKs to Google Drive
run: |
set -e
echo "🔐 Start uploading APKs to Google Drive..."

echo "📁 Checking or creating AAPS folder"
AAPS_FOLDER_ID=$(curl -s -X GET \
-H "Authorization: Bearer $ACCESS_TOKEN" \
"https://www.googleapis.com/drive/v3/files?q=name='AAPS'+and+mimeType='application/vnd.google-apps.folder'+and+trashed=false" \
| jq -r '.files[0].id')

if [ "$AAPS_FOLDER_ID" == "null" ] || [ -z "$AAPS_FOLDER_ID" ]; then
AAPS_FOLDER_ID=$(curl -s -X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "AAPS", "mimeType": "application/vnd.google-apps.folder"}' \
"https://www.googleapis.com/drive/v3/files" | jq -r '.id')
echo "📂 Created AAPS folder: $AAPS_FOLDER_ID"
else
echo "📂 Found AAPS folder: $AAPS_FOLDER_ID"
fi

echo "📁 Checking or creating version folder: $VERSION"
VERSION_FOLDER_ID=$(curl -s -X GET \
-H "Authorization: Bearer $ACCESS_TOKEN" \
"https://www.googleapis.com/drive/v3/files?q=name='${VERSION}'+and+mimeType='application/vnd.google-apps.folder'+and+'$AAPS_FOLDER_ID'+in+parents+and+trashed=false" \
| jq -r '.files[0].id')

if [ "$VERSION_FOLDER_ID" == "null" ] || [ -z "$VERSION_FOLDER_ID" ]; then
VERSION_FOLDER_ID=$(curl -s -X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"name\": \"${VERSION}\", \"mimeType\": \"application/vnd.google-apps.folder\", \"parents\": [\"$AAPS_FOLDER_ID\"]}" \
"https://www.googleapis.com/drive/v3/files" | jq -r '.id')
echo "📂 Created version folder: $VERSION_FOLDER_ID"
else
echo "📂 Found version folder: $VERSION_FOLDER_ID"
fi

upload_to_gdrive() {
FILE=$1
NAME=$2
if [ ! -f "$FILE" ]; then
echo "❌ File not found: $FILE"
exit 26
fi

echo "📄 Checking if file $NAME already exists in Google Drive..."
QUERY="name='${NAME}' and '${VERSION_FOLDER_ID}' in parents and trashed=false"
ENCODED_QUERY=$(python3 -c "import urllib.parse; print(urllib.parse.quote('''$QUERY'''))")
FILE_ID=$(curl -s \
-H "Authorization: Bearer $ACCESS_TOKEN" \
"https://www.googleapis.com/drive/v3/files?q=${ENCODED_QUERY}&fields=files(id)" \
| jq -r '.files[0].id')

if [[ -n "$FILE_ID" && "$FILE_ID" != "null" ]]; then
echo "🗑️ Deleting existing file with ID: $FILE_ID"
curl -s -X DELETE \
-H "Authorization: Bearer $ACCESS_TOKEN" \
"https://www.googleapis.com/drive/v3/files/${FILE_ID}"
fi

echo "⬆️ Uploading $FILE as $NAME to Google Drive..."
RESPONSE=$(curl -s -w "%{http_code}" -o /tmp/gdrive_response.json \
-X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-F "metadata={\"name\":\"$NAME\", \"parents\":[\"$VERSION_FOLDER_ID\"]};type=application/json;charset=UTF-8" \
-F "file=@$FILE;type=application/vnd.android.package-archive" \
"https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart")

HTTP_CODE="${RESPONSE: -3}"
if [[ "$HTTP_CODE" != "200" && "$HTTP_CODE" != "201" ]]; then
echo "❌ Upload failed with HTTP status: $HTTP_CODE"
cat /tmp/gdrive_response.json
exit 1
fi

echo "✅ Uploaded: $NAME"
}

upload_to_gdrive "aaps-${VERSION}${VERSION_SUFFIX}.apk" "aaps-${VERSION}${VERSION_SUFFIX}.apk"
upload_to_gdrive "aaps-wear-${VERSION}${VERSION_SUFFIX}.apk" "aaps-wear-${VERSION}${VERSION_SUFFIX}.apk"

echo "🎉 APKs successfully uploaded to Google Drive!"
18 changes: 0 additions & 18 deletions README.md

This file was deleted.

15 changes: 13 additions & 2 deletions app/src/main/kotlin/app/aaps/di/PluginsListModule.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package app.aaps.di

import app.aaps.plugins.aps.betacell.BetaCellPlugin
import app.aaps.core.interfaces.plugin.PluginBase
import app.aaps.plugins.aps.autotune.AutotunePlugin
import app.aaps.plugins.aps.loop.LoopPlugin
Expand Down Expand Up @@ -247,6 +248,16 @@ abstract class PluginsListModule {
@IntKey(220)
abstract fun bindOpenAPSSMBPlugin(plugin: OpenAPSSMBPlugin): PluginBase

// ── β-Cell Plugin ──────────────────────────────────────────────────────
@Binds
@AllConfigs
@IntoMap
@IntKey(222)
abstract fun bindBetaCellPlugin(plugin: BetaCellPlugin): PluginBase
// ──────────────────────────────────────────────────────────────────────



@Binds
@AllConfigs
@IntoMap
Expand Down Expand Up @@ -338,7 +349,7 @@ abstract class PluginsListModule {
abstract fun bindXdripPlugin(plugin: XdripPlugin): PluginBase

@Binds
@NotNSClient
@AllConfigs
@IntoMap
@IntKey(366)
abstract fun bindsOpenHumansPlugin(plugin: OpenHumansUploaderPlugin): PluginBase
Expand Down Expand Up @@ -501,4 +512,4 @@ abstract class PluginsListModule {

@Qualifier
annotation class Unfinished
}
}
4 changes: 4 additions & 0 deletions core/keys/src/main/kotlin/app/aaps/core/keys/BooleanKey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,8 @@ enum class BooleanKey(
SiteRotationManagePump("site_rotation_manage_pump", defaultValue = false),
SiteRotationManageCgm("site_rotation_manage_cgm", defaultValue = false),

// β-Cell Plugin
BetaCellSmbEnabled("betacell_smb_enabled", true),
BetaCellOpenLoop("betacell_open_loop_only", true),
BetaCellDebug("betacell_debug_mode", false),
}
15 changes: 15 additions & 0 deletions core/keys/src/main/kotlin/app/aaps/core/keys/DoubleKey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,19 @@ enum class DoubleKey(
ApsAutoIsfSmbDeliveryRatioMax("openapsama_smb_delivery_ratio_max", 0.5, 0.5, 1.0, defaultedBySM = true),
ApsAutoIsfSmbMaxRangeExtension("openapsama_smb_max_range_extension", 1.0, 1.0, 5.0, defaultedBySM = true),

// β-Cell Plugin
BetaCellTargetBg("betacell_target_bg", 110.0, 70.0, 160.0),
BetaCellHypo("betacell_hypo", 70.0, 55.0, 90.0),
BetaCellHyper("betacell_hyper", 180.0, 140.0, 300.0),
BetaCellBasalPhysio("betacell_basal_physio", 3.7, 0.5, 8.0),
BetaCellHepatic("betacell_hepatic_extraction", 0.5, 0.0, 0.8),
BetaCellIobTau("betacell_iob_tau", 90.0, 30.0, 240.0),
BetaCellIsfMin("betacell_isf_min", 25.0, 10.0, 50.0),
BetaCellIsfMax("betacell_isf_max", 70.0, 30.0, 120.0),
BetaCellSlopeBrakeT("betacell_slope_brake_threshold", -0.5, -3.0, -0.1),
BetaCellSlopeBrakeF("betacell_slope_brake_factor", 0.4, 0.1, 1.0),
BetaCellSmbMax("betacell_smb_max_units", 0.4, 0.05, 1.0),
BetaCellSmbOffset("betacell_smb_threshold_offset", 20.0, 5.0, 60.0),
BetaCellHypoAlertMargin("betacell_hypo_alert_margin", 20.0, 5.0, 50.0),
BetaCellHypoRapidSlope("betacell_hypo_rapid_slope", -2.0, -5.0, -0.5),
}
2 changes: 2 additions & 0 deletions core/keys/src/main/kotlin/app/aaps/core/keys/IntKey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,6 @@ enum class IntKey(
NsClientUrgentAlarmStaleData("ns_alarm_urgent_stale_data_value", 31, 30, 180),

SiteRotationUserProfile("site_rotation_user_profile", 0, 0, 2),
// β-Cell Plugin
BetaCellIsfWindowH("betacell_isf_window_hours", 8, 2, 24),
}
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@ android.nonTransitiveRClass=true
# org.gradle.unsafe.configuration-cache=true

android.nonFinalResIds=true

Loading
Loading