Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
d7c1722
Enhance import preview with merge strategy, icon backup, and rich ana…
May 15, 2026
2bc553b
Fix several security bugs and update flutter version
May 16, 2026
bdbd111
Support custom theme
May 16, 2026
8728ebd
Support ios
May 16, 2026
df075fc
Fix macos bugs
May 16, 2026
afa2011
Fix build errors
May 16, 2026
2de27b3
Fix ci failures
May 17, 2026
5412b7f
Fix macos close error
May 17, 2026
4275e64
Fix android errors
May 17, 2026
36d86b0
feat: Update Chewie localization files and add markdown_widget depend…
Robert-Stackflow May 17, 2026
b774ea0
Refactor dependencies and clean up unused packages
May 17, 2026
8ab6295
feat: Update macOS codesigning configuration and upgrade compileSdkVe…
May 17, 2026
eaec986
feat: Update sqflite_android dependency to version 2.4.0 and fix macO…
May 17, 2026
6fb7fc5
feat: Integrate LaunchAtLogin package and update macOS project settings
May 17, 2026
e696456
fix: Update macOS codesigning script and enhance Podfile to remove SQ…
May 17, 2026
45b8dac
refactor: Enhance SQLCipher.bundle removal process and improve secure…
May 17, 2026
2292ad3
fix: Update code signing entitlements in release workflow and improve…
May 17, 2026
62d016f
feat: Update iOS build process and enhance backup log navigation in s…
May 17, 2026
8c3dd22
feat: Add .ipa files to .gitignore
May 17, 2026
ac085f6
feat: Enhance biometric authentication and UI improvements
May 18, 2026
3beb69f
feat: Implement CoachMarkManager for guided tours and add localizatio…
May 19, 2026
1404c55
feat: Enhance backup log functionality with historical log loading an…
May 20, 2026
0af92a9
Refactor backup bottom sheets and improve UI consistency
May 20, 2026
b4fdecd
feat: Add search query parser and enhance token filtering with tags a…
May 20, 2026
7f9abba
feat: Add auto backup on launch and periodic backup functionality wit…
May 21, 2026
87dd900
Refactor UI components and improve localization
May 21, 2026
9f5839b
chore: Update version to 4.0.0+400 in pubspec.yaml
May 22, 2026
d2353ca
feat(localization): update English, Japanese, Chinese, and Traditiona…
May 23, 2026
0432143
feat: Enhance export functionality and UI improvements across various…
May 23, 2026
efcb624
feat: Update UI components for improved user experience and functiona…
May 23, 2026
9caeb53
feat: Update border styling to use responsive borders across various …
Robert-Stackflow May 23, 2026
89844d9
feat: Add ink parameter to CheckboxItem and update related screens
Robert-Stackflow May 23, 2026
0993313
feat: Enhance Slidable actions with auto-trigger functionality and im…
May 24, 2026
d6f2a6f
feat: Implement modal sheet functionality and enhance UI components a…
May 24, 2026
9cf3a45
feat: Update icons and enhance UI components across various screens
Robert-Stackflow May 24, 2026
971a217
feat: Comment out Linux-arm build steps in release workflow
Robert-Stackflow May 24, 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
96 changes: 71 additions & 25 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,33 +37,33 @@ jobs:
artifact_path: |
build/linux/*.deb
build/linux/*.tar.gz
- target: Linux-arm
os: ubuntu-22.04-arm
artifact_name: release-Linux-arm
artifact_path: |
build/linux/*.deb
build/linux/*.tar.gz
# - target: iOS
# os: macos-latest
# cache_pod_key: ios-pods
# cache_pod_path: ios/Pods
# cache_pod_restore_keys_hash_file: ios/Podfile.lock
# artifact_name: release-iOS
# artifact_path: build/**/*.ipa
# - target: MacOS
# os: macos-latest
# cache_pod_key: macos-pods
# cache_pod_path: macos/Pods
# cache_pod_restore_keys_hash_file: macos/Podfile.lock
# artifact_name: release-MacOS
# artifact_path: /Users/runner/work/CloudOTP/CloudOTP/*.dmg
# - target: Linux-arm
# os: ubuntu-22.04-arm
# artifact_name: release-Linux-arm
# artifact_path: |
# build/linux/*.deb
# build/linux/*.tar.gz
- target: iOS
os: macos-latest
cache_pod_key: ios-pods
cache_pod_path: ios/Pods
cache_pod_restore_keys_hash_file: ios/Podfile.lock
artifact_name: release-iOS
artifact_path: build/ios/ipa/*.ipa
- target: macOS
os: macos-latest
cache_pod_key: macos-pods
cache_pod_path: macos/Pods
cache_pod_restore_keys_hash_file: macos/Podfile.lock
artifact_name: release-macOS
artifact_path: build/macos/*.dmg
outputs:
version: ${{ steps.get_version.outputs.version }}
date: ${{ steps.get_version.outputs.date}}
arch: ${{ steps.get_version.outputs.arch}}
runs-on: ${{ matrix.os }}
env:
FLUTTER_VERSION: 3.27.2
FLUTTER_VERSION: 3.41.9
steps:
# Checkout branch
- name: Checkout
Expand All @@ -78,10 +78,10 @@ jobs:

# Setup Flutter
- name: Setup Flutter
uses: subosito/flutter-action@v2.21.0
uses: subosito/flutter-action@v2.23.0
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'master'
channel: 'stable'
cache: true

# Setup JDK
Expand All @@ -93,6 +93,20 @@ jobs:
java-version: '17'
cache: gradle

# Cache CocoaPods
- name: Cache CocoaPods
if: matrix.cache_pod_key != ''
uses: actions/cache@v4
with:
path: ${{ matrix.cache_pod_path }}
key: ${{ matrix.cache_pod_key }}-${{ hashFiles(matrix.cache_pod_restore_keys_hash_file) }}
restore-keys: ${{ matrix.cache_pod_key }}-

# Update CocoaPods repo
- name: Update CocoaPods repo
if: matrix.target == 'iOS' || matrix.target == 'macOS'
run: pod repo update

# Flutter Pub Get
- name: Flutter Pub Get
run: |
Expand Down Expand Up @@ -188,6 +202,36 @@ jobs:
dpkg-deb --build --root-owner-group CloudOTP-${{ steps.get_version.outputs.version }}-linux-${{ steps.get_version.outputs.arch }}
tar -zcvf CloudOTP-${{ steps.get_version.outputs.version }}-linux-${{ steps.get_version.outputs.arch }}.tar.gz -C CloudOTP-${{ steps.get_version.outputs.version }}-linux-${{ steps.get_version.outputs.arch }} .

# Build iOS .ipa (no codesign)
- name: Build iOS
if: matrix.target == 'iOS'
run: |
flutter build ipa --release --no-codesign
mkdir -p build/ios/ipa
cd build/ios/archive/Runner.xcarchive/Products/Applications
mkdir -p Payload
mv Runner.app Payload/ 2>/dev/null || mv CloudOTP.app Payload/ 2>/dev/null || true
zip -r ../../../../../../build/ios/ipa/CloudOTP-${{ steps.get_version.outputs.version }}-ios.ipa Payload

# Build macOS .app & .dmg
- name: Disable macOS codesigning
if: matrix.target == 'macOS'
run: |
sed -i '' 's/"CODE_SIGN_IDENTITY\[sdk=macosx\*\]" = "Apple Development"/CODE_SIGN_IDENTITY = "-"/g' macos/Runner.xcodeproj/project.pbxproj
sed -i '' 's/CODE_SIGN_STYLE = Automatic/CODE_SIGN_STYLE = Manual/g' macos/Runner.xcodeproj/project.pbxproj
sed -i '' 's/DEVELOPMENT_TEAM = 9CAPQ7Q4W8/DEVELOPMENT_TEAM = ""/g' macos/Runner.xcodeproj/project.pbxproj
sed -i '' 's/CODE_SIGN_ENTITLEMENTS = Runner\/Release.entitlements/CODE_SIGN_ENTITLEMENTS = ""/g' macos/Runner.xcodeproj/project.pbxproj
sed -i '' 's/CODE_SIGN_ENTITLEMENTS = Runner\/DebugProfile.entitlements/CODE_SIGN_ENTITLEMENTS = ""/g' macos/Runner.xcodeproj/project.pbxproj
- name: Build macOS
if: matrix.target == 'macOS'
run: |
flutter build macos --release
APP_PATH="build/macos/Build/Products/Release/CloudOTP.app"
codesign --force --deep -s - "$APP_PATH"
DMG_NAME="CloudOTP-${{ steps.get_version.outputs.version }}-macos-universal.dmg"
mkdir -p build/macos
hdiutil create -volname CloudOTP -srcfolder "$APP_PATH" -ov -format UDZO "build/macos/$DMG_NAME"

# Upload Artifacts
- name: Upload Artifacts
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -223,8 +267,10 @@ jobs:
mv /tmp/artifacts/release-Windows/*.exe /tmp/artifacts/final/
mv /tmp/artifacts/release-Linux/*.deb /tmp/artifacts/final/
mv /tmp/artifacts/release-Linux/*.tar.gz /tmp/artifacts/final/
mv /tmp/artifacts/release-Linux-arm/*.deb /tmp/artifacts/final/
mv /tmp/artifacts/release-Linux-arm/*.tar.gz /tmp/artifacts/final/
# mv /tmp/artifacts/release-Linux-arm/*.deb /tmp/artifacts/final/
# mv /tmp/artifacts/release-Linux-arm/*.tar.gz /tmp/artifacts/final/
mv /tmp/artifacts/release-iOS/*.ipa /tmp/artifacts/final/ 2>/dev/null || true
mv /tmp/artifacts/release-macOS/*.dmg /tmp/artifacts/final/ 2>/dev/null || true

cd /tmp/artifacts/final
for file in *; do
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/

# IntelliJ related
Expand All @@ -30,7 +32,8 @@ migrate_working_dir/
.packages
.pub-cache/
.pub/
/build/
**/build/
**/.plugin_symlinks/

# Symbolication related
app.*.symbols
Expand All @@ -47,6 +50,7 @@ app.*.map.json
**/generated/

cloudotp.db
*.ipa

/assets/fonts/**

Expand Down
12 changes: 10 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ android {

defaultConfig {
applicationId "com.cloudchewie.cloudotp"
minSdkVersion 23
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
Expand Down Expand Up @@ -89,9 +89,17 @@ flutter {

dependencies {
implementation "androidx.core:core-splashscreen:1.0.1"
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.core:core-ktx:1.15.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.interpolator:interpolator:1.0.0"
implementation 'com.google.gms:google-services:4.2.0'

configurations.configureEach {
resolutionStrategy {
force 'androidx.core:core:1.15.0'
force 'androidx.core:core-ktx:1.15.0'
force 'androidx.browser:browser:1.8.0'
}
}
}
3 changes: 1 addition & 2 deletions android/app/src/main/res/xml/network_security_config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
</network-security-config>
4 changes: 2 additions & 2 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.0.2'
classpath 'com.android.tools.build:gradle:8.7.0'
// classpath 'com.android.tools:r8:1.6.82'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
Expand All @@ -22,7 +22,7 @@ rootProject.buildDir = '../build'
subprojects {
afterEvaluate {
android {
compileSdkVersion 34
compileSdkVersion 35
}
if (it.plugins.hasPlugin('com.android.library') || it.plugins.hasPlugin('com.android.application')) {
it.android {
Expand Down
2 changes: 1 addition & 1 deletion android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
2 changes: 1 addition & 1 deletion android/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ pluginManagement {

plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.0.2" apply false
id "com.android.application" version "8.7.0" apply false
id "org.jetbrains.kotlin.android" version "2.1.10" apply false
}

Expand Down
1 change: 1 addition & 0 deletions ios/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
build/
**/dgph
*.mode1v3
*.mode2v3
Expand Down
2 changes: 0 additions & 2 deletions ios/Flutter/AppFrameworkInfo.plist
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,5 @@
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict>
</plist>
67 changes: 55 additions & 12 deletions ios/Podfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '12.0'
platform :ios, '13.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
Expand Down Expand Up @@ -33,8 +33,6 @@ target 'Runner' do

flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))

pod 'SQLCipher', '~> 4.5'

target 'RunnerTests' do
inherit! :search_paths
end
Expand All @@ -43,11 +41,61 @@ end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end

# Aggressively remove all SQLCipher.bundle targets and references
pods_project = installer.pods_project

# Step 1: Identify bundle targets to remove
bundle_target_names = Set.new
pods_project.targets.to_a.each do |target|
if target.respond_to?(:product_type) && target.product_type == 'com.apple.product-type.bundle' && target.name.include?('SQLCipher')
bundle_target_names << target.name
end
end

# Step 2: Remove dependencies on bundle targets from all other targets
pods_project.targets.each do |target|
next if bundle_target_names.include?(target.name)
target.dependencies.to_a.each do |dep|
if dep.target && bundle_target_names.include?(dep.target.name)
dep.remove_from_project
end
end
end

# Step 3: Remove SQLCipher.bundle from ALL build phases of ALL targets
pods_project.targets.each do |target|
next if bundle_target_names.include?(target.name)
target.build_phases.each do |phase|
next unless phase.respond_to?(:files)
phase.files.to_a.each do |build_file|
name = build_file.display_name || ''
if name.include?('SQLCipher.bundle') || name.include?('SQLCipher-SQLCipher') || name.include?('FMDB-SQLCipher')
build_file.remove_from_project
end
end
end
end

# Step 4: Remove the bundle targets themselves
pods_project.targets.to_a.each do |target|
if bundle_target_names.include?(target.name)
target.remove_from_project
end
end

# Step 5: Remove all file references to SQLCipher.bundle
pods_project.files.to_a.each do |file_ref|
if file_ref.path && file_ref.path.include?('SQLCipher.bundle')
file_ref.remove_from_project
end
end

pods_project.save

installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
# You can remove unused permissions here
# for more information: https://github.com/BaseflowIT/flutter-permission-handler/blob/master/permission_handler/ios/Classes/PermissionHandlerEnums.h
# e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',

Expand Down Expand Up @@ -75,10 +123,6 @@ post_install do |installer|
## dart: PermissionGroup.photos
'PERMISSION_PHOTOS=1',

## The 'PERMISSION_LOCATION' macro enables the `locationWhenInUse` and `locationAlways` permission. If
## the application only requires `locationWhenInUse`, only specify the `PERMISSION_LOCATION_WHENINUSE`
## macro.
##
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=0',
'PERMISSION_LOCATION_WHENINUSE=0',
Expand All @@ -104,7 +148,6 @@ post_install do |installer|
## dart: PermissionGroup.criticalAlerts
'PERMISSION_ASSISTANT=0',
]

end
end
end
end
Loading
Loading