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
36 changes: 36 additions & 0 deletions .github/workflows/build-ios-release-pullrequest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,9 @@ jobs:
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3 --quiet

- name: Set default network
run: ./scripts/set-network.sh signet

- name: Install Node Modules
run: npm ci --omit=dev --yes

Expand Down Expand Up @@ -290,6 +293,38 @@ jobs:
run: |
bundle exec fastlane ios setup_provisioning_profiles

- name: Build App (unsigned, non-master)
if: github.ref != 'refs/heads/master' && github.ref != 'refs/heads/2025-12-03-redwallet'
run: |
cd ios && pod install
mkdir -p build_logs
xcodebuild -workspace BlueWallet.xcworkspace \
-scheme BlueWallet \
-configuration Release \
-sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath build \
CODE_SIGNING_ALLOWED=NO \
build 2>&1 | tee build_logs/xcodebuild.log

- name: Upload unsigned app as artifact
if: github.ref != 'refs/heads/master' && github.ref != 'refs/heads/2025-12-03-redwallet'
uses: actions/upload-artifact@v4
with:
name: BlueWallet-unsigned-simulator
path: ios/build/Build/Products/Release-iphonesimulator/BlueWallet.app
retention-days: 7
if-no-files-found: error

- name: Upload build logs (non-master)
if: always() && github.ref != 'refs/heads/master' && github.ref != 'refs/heads/2025-12-03-redwallet'
uses: actions/upload-artifact@v4
with:
name: build_logs_pr
path: ios/build_logs/xcodebuild.log
retention-days: 7
if-no-files-found: error

- name: Build App
id: build_app
run: |
Expand Down Expand Up @@ -435,6 +470,7 @@ jobs:
name: build_logs
path: ./ios/build_logs/
retention-days: 7
if-no-files-found: warn

- name: Verify IPA File Before Upload
run: |
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/build-mac-catalyst.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ jobs:
ruby-version: 3.4.8
bundler-cache: true

- name: Set default network
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
run: ./scripts/set-network.sh signet

- name: Install Node modules
if: github.event_name == 'workflow_dispatch' || steps.labels.outputs.has_mac_dmg == 'true'
run: npm ci
Expand Down
83 changes: 66 additions & 17 deletions .github/workflows/build-release-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ jobs:
yes | sdkmanager --licenses
sdkmanager "platforms;android-36" "platform-tools" "build-tools;36.0.0" "ndk;27.1.12297006"

- name: Set default network
run: ./scripts/set-network.sh signet

- name: Install node_modules (include dev deps for patch-package)
run: npm ci --yes

Expand All @@ -82,9 +85,16 @@ jobs:
echo "NEW_BUILD_NUMBER=$NEW_BUILD_NUMBER" >> $GITHUB_ENV
echo "build_number=$NEW_BUILD_NUMBER" >> $GITHUB_OUTPUT

<<<<<<< HEAD
- name: Build and sign APK
id: build_and_sign_apk
run: bundle exec fastlane android build_release_apk
=======
- name: Build release AAB
if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/2025-12-03-redwallet'
id: build_release_aab
run: bundle exec fastlane android build_release_aab
>>>>>>> 81bdf7f92 (ci: automatically upload android builds to Play Store internal testing)
env:
BUILD_NUMBER: ${{ steps.build_number.outputs.build_number }}
KEYSTORE_FILE_HEX: ${{ secrets.KEYSTORE_FILE_HEX }}
Expand All @@ -103,29 +113,34 @@ jobs:
android/**/reports/**/*.log
if-no-files-found: warn

- name: Determine APK Filename and Path
id: determine_apk_path
- name: Build Debug APK (non-master branches)
if: github.ref != 'refs/heads/master' && github.ref != 'refs/heads/2025-12-03-redwallet'
run: |
cd android && ./gradlew assembleDebug --no-daemon

- name: Determine AAB Filename and Path
if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/2025-12-03-redwallet'
id: determine_aab_path
run: |
BUILD_NUMBER=${{ steps.build_number.outputs.build_number }}
VERSION_NAME=$(grep versionName android/app/build.gradle | awk '{print $2}' | tr -d '"')
BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF_NAME}}
BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/[^a-zA-Z0-9_-]/_/g')

if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then
EXPECTED_FILENAME="BlueWallet-${VERSION_NAME}-${BUILD_NUMBER}-${BRANCH_NAME}.apk"
EXPECTED_FILENAME="BlueWallet-${VERSION_NAME}-${BUILD_NUMBER}-${BRANCH_NAME}.aab"
else
EXPECTED_FILENAME="BlueWallet-${VERSION_NAME}-${BUILD_NUMBER}.apk"
EXPECTED_FILENAME="BlueWallet-${VERSION_NAME}-${BUILD_NUMBER}.aab"
fi

APK_PATH="android/app/build/outputs/apk/release/${EXPECTED_FILENAME}"
echo "EXPECTED_FILENAME=${EXPECTED_FILENAME}" >> $GITHUB_ENV
echo "APK_PATH=${APK_PATH}" >> $GITHUB_ENV
AAB_PATH="android/app/build/outputs/bundle/release/${EXPECTED_FILENAME}"
echo "AAB_PATH=${AAB_PATH}" >> $GITHUB_ENV

- name: Upload APK as artifact
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
- name: Upload signed AAB as artifact
if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/2025-12-03-redwallet'
uses: actions/upload-artifact@v4
with:
name: signed-apk
path: ${{ env.APK_PATH }}
name: signed-aab
path: ${{ env.AAB_PATH }}
if-no-files-found: error

browserstack:
Expand All @@ -146,20 +161,54 @@ jobs:
- name: Install dependencies with Bundler
run: bundle install --jobs 4 --retry 3

- name: Download APK artifact
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
- name: Download AAB artifact
uses: actions/download-artifact@v4
with:
name: signed-apk
name: signed-aab

- name: Set APK Path
run: |
APK_PATH=$(find ${{ github.workspace }} -name '*.apk')
APK_PATH=$(find ${{ github.workspace }} -name '*.aab')
echo "APK_PATH=$APK_PATH" >> $GITHUB_ENV

- name: Upload APK to BrowserStack and Post PR Comment
- name: Upload AAB to BrowserStack and Post PR Comment
env:
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: bundle exec fastlane upload_to_browserstack_and_comment

play-store-upload:
runs-on: ubuntu-latest
needs: buildReleaseApk
if: github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/2025-12-03-redwallet')

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

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 3.1.6
bundler-cache: true

- name: Install dependencies with Bundler
run: bundle install --jobs 4 --retry 3

- name: Download AAB artifact
uses: actions/download-artifact@v4
with:
name: signed-aab

- name: Set AAB Path
run: |
AAB_PATH=$(find ${{ github.workspace }} -name '*.aab')
echo "AAB_PATH=$AAB_PATH" >> $GITHUB_ENV

- name: Upload to Google Play Internal Testing
env:
GOOGLE_PLAY_JSON_KEY: ${{ secrets.GOOGLE_PLAY_JSON_KEY }}
AAB_PATH: ${{ env.AAB_PATH }}
run: bundle exec fastlane android deploy_to_play_store
19 changes: 17 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,10 @@ android {

namespace "io.bluewallet.bluewallet"
defaultConfig {
applicationId "io.bluewallet.bluewallet"
applicationId "com.layertwolabs.bluewallet"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionCode System.getenv("BUILD_NUMBER")?.toInteger() ?: (int)(System.currentTimeMillis() / 1000)
versionName "7.2.7"
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
Expand All @@ -105,11 +105,26 @@ android {
}
}

signingConfigs {
release {
def keystoreFile = file("${rootProject.projectDir}/../bluewallet-release-key.keystore")
if (keystoreFile.exists()) {
storeFile keystoreFile
storePassword System.getenv("KEYSTORE_PASSWORD") ?: ""
keyAlias "l2l dev"
keyPassword System.getenv("KEYSTORE_PASSWORD") ?: ""
}
}
}

buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro"
if (signingConfigs.release.storeFile != null && signingConfigs.release.storeFile.exists()) {
signingConfig signingConfigs.release
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion android/app/google-services.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"client_info": {
"mobilesdk_app_id": "1:993804676679:android:3e611cf30d58bac8b5cb62",
"android_client_info": {
"package_name": "io.bluewallet.bluewallet"
"package_name": "com.layertwolabs.bluewallet"
}
},
"oauth_client": [
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@
<!-- Settings Activity alias for System Settings -->
<activity-alias
android:name=".SettingsActivityAlias"
android:label="BlueWallet Settings"
android:label="RedWallet Settings"
android:exported="true"
android:targetActivity=".SettingsActivity">
<intent-filter>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class BitcoinPriceWidget : AppWidgetProvider() {

companion object {
private const val TAG = "BitcoinPriceWidget"
private const val SHARED_PREF_NAME = "group.io.bluewallet.bluewallet"
private const val SHARED_PREF_NAME = "group.com.layertwolabs.bluewallet"

fun updateNetworkStatus(context: Context, appWidgetIds: IntArray) {
val isNetworkAvailable = NetworkUtils.isNetworkAvailable(context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class MainActivity : ReactActivity() {
* This is used to schedule rendering of the component.
*/
override fun getMainComponentName(): String {
return "BlueWallet"
return "RedWallet"
}

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -42,7 +42,7 @@ class MainActivity : ReactActivity() {
}

private fun checkAndShowCacheClearedAlert() {
val sharedPref = getSharedPreferences("group.io.bluewallet.bluewallet", Context.MODE_PRIVATE)
val sharedPref = getSharedPreferences("group.com.layertwolabs.bluewallet", Context.MODE_PRIVATE)
val shouldShowAlert = sharedPref.getBoolean("shouldShowCacheClearedAlert", false)

if (shouldShowAlert) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class MainApplication : Application(), ReactApplication {

override fun onCreate() {
super.onCreate()
sharedPref = getSharedPreferences("group.io.bluewallet.bluewallet", Context.MODE_PRIVATE)
sharedPref = getSharedPreferences("group.com.layertwolabs.bluewallet", Context.MODE_PRIVATE)

// Handle clearFilesOnLaunch before registering listeners
clearFilesIfNeeded()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class MarketWidget : AppWidgetProvider() {

companion object {
private const val TAG = "MarketWidget"
private const val SHARED_PREF_NAME = "group.io.bluewallet.bluewallet"
private const val SHARED_PREF_NAME = "group.com.layertwolabs.bluewallet"
private const val DEFAULT_CURRENCY = "USD"
private const val KEY_LAST_ONLINE_STATUS = "market_widget_last_online_status"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class MarketWidgetUpdateWorker(context: Context, workerParams: WorkerParameters)
const val TAG = "MarketWidgetUpdateWorker"
const val WORK_NAME = "market_widget_update_work"
const val NETWORK_RETRY_WORK_NAME = "market_network_retry_work"
private const val SHARED_PREF_NAME = "group.io.bluewallet.bluewallet"
private const val SHARED_PREF_NAME = "group.com.layertwolabs.bluewallet"
private const val DEFAULT_CURRENCY = "USD"
private const val KEY_LAST_UPDATE_TIME = "market_widget_last_update_time"
private const val MIN_UPDATE_INTERVAL_MS = 15L * 60 * 1000
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class SettingsActivity : AppCompatActivity() {
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
// Set the SharedPreferences name to match the app's preferences
preferenceManager.sharedPreferencesName = "group.io.bluewallet.bluewallet"
preferenceManager.sharedPreferencesName = "group.com.layertwolabs.bluewallet"

// Load preferences from XML
setPreferencesFromResource(R.xml.settings_preferences, rootKey)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import io.bluewallet.bluewallet.NativeSettingsModuleSpec
class SettingsModule(reactContext: ReactApplicationContext) : NativeSettingsModuleSpec(reactContext) {

private val sharedPref: SharedPreferences = reactContext.getSharedPreferences(
"group.io.bluewallet.bluewallet",
"group.com.layertwolabs.bluewallet",
Context.MODE_PRIVATE
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.content.res.Configuration
import androidx.appcompat.app.AppCompatDelegate

object ThemeHelper {
private const val SHARED_PREF_NAME = "group.io.bluewallet.bluewallet"
private const val SHARED_PREF_NAME = "group.com.layertwolabs.bluewallet"
private const val KEY_FORCE_DARK_MODE = "force_dark_mode"

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class WidgetUpdateWorker(context: Context, workerParams: WorkerParameters) : Cor
const val WORK_NAME = "bitcoin_price_widget_update_work"
const val NETWORK_RETRY_WORK_NAME = "bitcoin_price_network_retry_work"
const val REPEAT_INTERVAL_MINUTES = 15L
private const val SHARED_PREF_NAME = "group.io.bluewallet.bluewallet"
private const val SHARED_PREF_NAME = "group.com.layertwolabs.bluewallet"
private const val DEFAULT_CURRENCY = "USD"
private const val NETWORK_RETRY_DELAY_SECONDS = 30L

Expand Down
Binary file modified android/app/src/main/res/drawable-mdpi/splash_icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/drawable-xhdpi/splash_icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/drawable-xxhdpi/splash_icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion android/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<resources>
<string name="app_name">BlueWallet</string>
<string name="app_name">RedWallet</string>
<string name="loading">Loading...</string>
<string name="last_updated">Last Updated</string>
<string name="from">From</string>
Expand Down
2 changes: 1 addition & 1 deletion android/settings.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") }
plugins { id("com.facebook.react.settings") }
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
rootProject.name = 'BlueWallet'
rootProject.name = 'RedWallet'
include ':app'
includeBuild('../node_modules/@react-native/gradle-plugin')
include ':detox'
Expand Down
Loading
Loading