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
29 changes: 24 additions & 5 deletions .github/workflows/sideload-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ run-name: Build sideloadable debug APK
on:
workflow_dispatch:
push:
branches: [dive-3575-apk]
branches: [dive-3578-rebrand]

concurrency:
group: sideload-apk-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read
contents: write

jobs:
apk:
Expand All @@ -29,9 +29,28 @@ jobs:
run: just mobile-build-android
- name: Show APK output
run: ls -la mobile/build/app/outputs/flutter-apk/
- name: Upload APK
- name: Name the APK for the phone
run: |
set -euo pipefail
cp mobile/build/app/outputs/flutter-apk/app-debug.apk 5dive-${{ github.run_number }}.apk
ls -la 5dive-*.apk
- name: Upload APK (CI artifact, needs a GitHub login to fetch)
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: buzz-debug-apk
path: mobile/build/app/outputs/flutter-apk/*.apk
name: fivedive-debug-apk
path: 5dive-*.apk
if-no-files-found: error
# A CI artifact link is useless on a phone (it 302s to a login). Publish the
# same bytes as a prerelease asset so the download is anonymous.
- name: Publish as a prerelease asset
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
tag="mobile-sideload-5dive-${{ github.run_number }}"
gh release create "$tag" "5dive-${{ github.run_number }}.apk" \
--repo "${{ github.repository }}" \
--prerelease \
--title "5dive mobile (sideload debug) - $tag" \
--notes "Debug APK of the 5dive-branded mobile app. Android only. applicationId com.fivedive.app - installs alongside any existing Buzz app."
gh release view "$tag" --repo "${{ github.repository }}" --json assets --jq '.assets[].url'
2 changes: 1 addition & 1 deletion mobile/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ cd mobile && flutter run

Debug builds produced from a git worktree get a unique app identifier keyed
to the **worktree directory name** (`com.buzz.buzzMobile.<slug>` on iOS,
`xyz.block.buzz.mobile.<slug>` on Android) plus a display-only branch label
`com.fivedive.app.<slug>` on Android) plus a display-only branch label
in the app name (`Buzz (my-branch)`, or a short SHA when the worktree is
detached). Because the identifier follows the directory rather than the
branch, one worktree keeps exactly one installed app — and its login state —
Expand Down
6 changes: 3 additions & 3 deletions mobile/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,15 @@ android {
}

defaultConfig {
applicationId = "xyz.block.buzz.mobile"
applicationId = "com.fivedive.app"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
resValue("string", "app_name", "Buzz")
resValue("string", "app_name", "5dive")
}

signingConfigs {
Expand All @@ -113,7 +113,7 @@ android {
applicationIdSuffix = worktreeIdSuffix
}
if (worktreeLabel != null) {
resValue("string", "app_name", "Buzz ($worktreeLabel)")
resValue("string", "app_name", "5dive ($worktreeLabel)")
}
}
release {
Expand Down
Binary file modified mobile/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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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 mobile/android/app/src/main/res/mipmap-hdpi/launch_image.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 mobile/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.
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 mobile/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 mobile/android/app/src/main/res/mipmap-mdpi/launch_image.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 mobile/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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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 mobile/android/app/src/main/res/mipmap-xhdpi/launch_image.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 mobile/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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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 mobile/android/app/src/main/res/mipmap-xxhdpi/launch_image.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 mobile/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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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 mobile/android/app/src/main/res/mipmap-xxxhdpi/launch_image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#000</color>
<color name="ic_launcher_background">#1A1A1F</color>
</resources>
Binary file added mobile/assets/images/5dive-mark.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 mobile/ios/Flutter/Debug.xcconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
// `mobile/ios/Flutter/AppOverrides.xcconfig` containing
// `BUNDLE_IDENTIFIER = your.app.id` (gitignored).
BUNDLE_IDENTIFIER = com.buzz.buzzMobile
APP_DISPLAY_NAME = Buzz
APP_DISPLAY_NAME = 5dive

// Worktree-aware debug identity (gitignored, written by
// scripts/mobile-worktree-overrides.sh): a per-worktree bundle identifier
Expand Down
2 changes: 1 addition & 1 deletion mobile/ios/Flutter/Release.xcconfig
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// enterprise-signed distribution) override these without patching tracked
// files by writing `mobile/ios/Flutter/AppOverrides.xcconfig` (gitignored).
BUNDLE_IDENTIFIER = com.buzz.buzzMobile
APP_DISPLAY_NAME = Buzz
APP_DISPLAY_NAME = 5dive
CODE_SIGN_STYLE = Automatic
CODE_SIGN_IDENTITY = iPhone Developer
#include? "AppOverrides.xcconfig"
2 changes: 1 addition & 1 deletion mobile/ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Buzz</string>
<string>5dive</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
Expand Down
4 changes: 2 additions & 2 deletions mobile/lib/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ class App extends HookConsumerWidget {
});

return MaterialApp(
title: 'Buzz',
title: '5dive',
theme: AppTheme.light(
colorScheme: lightScheme,
topSectionGradient: buzzLightGradient,
Expand Down Expand Up @@ -162,7 +162,7 @@ class _SplashScreen extends StatelessWidget {
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: BuzzLoadingIndicator(size: 56, semanticLabel: 'Starting Buzz'),
child: BuzzLoadingIndicator(size: 56, semanticLabel: 'Starting 5dive'),
),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ String _cameraErrorMessage(Object error) {
return switch (error.code) {
'CameraAccessDenied' ||
'CameraAccessDeniedWithoutPrompt' ||
'CameraAccessRestricted' => 'Camera access is turned off for Buzz.',
'CameraAccessRestricted' => 'Camera access is turned off for 5dive.',
'no-cameras' => 'Camera isn’t available on this device.',
_ => 'Camera couldn’t start. Try again.',
};
Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/features/channels/photo_library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class PhotoLibraryAccessException implements Exception {
const PhotoLibraryAccessException();

@override
String toString() => 'Photo access is turned off for Buzz.';
String toString() => 'Photo access is turned off for 5dive.';
}

/// Provides the device photo library. Tests can override this with fixtures.
Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/features/invites/invite_join_sheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class InviteJoinSheet extends ConsumerWidget {
Icon(LucideIcons.userPlus, size: 40, color: context.colors.primary),
const SizedBox(height: Grid.sm),
Text(
'Join this Buzz community?',
'Join this 5dive community?',
style: context.textTheme.titleLarge,
),
const SizedBox(height: Grid.xxs),
Expand Down
6 changes: 3 additions & 3 deletions mobile/lib/features/pairing/pairing_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import 'package:lucide_icons_flutter/lucide_icons.dart';
import '../../shared/security/sensitive_action_authorizer.dart';
import '../../shared/theme/theme.dart';
import '../../shared/widgets/buzz_loading_indicator.dart';
import '../../shared/widgets/tappable_flapping_bee.dart';
import '../../shared/widgets/fivedive_mark.dart';
import 'pairing_provider.dart';
import 'pairing_qr_scanner.dart';

Expand Down Expand Up @@ -279,8 +279,8 @@ class _SasVerificationView extends StatelessWidget {

Text(
sendsIdentityToDesktop
? 'This sends your full Buzz identity to the desktop\nand grants it permanent access. Only confirm a\ndesktop you trust and a recovery you started.'
: 'You are about to transfer your Buzz identity\nto this device. Only confirm if you initiated\nthis pairing from your desktop.',
? 'This sends your full 5dive identity to the desktop\nand grants it permanent access. Only confirm a\ndesktop you trust and a recovery you started.'
: 'You are about to transfer your 5dive identity\nto this device. Only confirm if you initiated\nthis pairing from your desktop.',
textAlign: TextAlign.center,
style: context.textTheme.bodySmall?.copyWith(
color: context.colors.onSurfaceVariant,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,11 @@ class _PairingWelcomeView extends StatelessWidget {
shape: BoxShape.circle,
color: Color(0x4DFFFFFF),
),
child: const TappableFlappingBee(
width: 76,
color: _onboardingInk,
),
child: const FiveDiveMark(height: 72, color: _onboardingInk),
),
const SizedBox(height: Grid.sm),
Text(
'Welcome to Buzz',
'Welcome to 5dive',
textAlign: TextAlign.center,
style: context.textTheme.headlineSmall?.copyWith(
color: _onboardingInk,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class _ConnectionSection extends ConsumerWidget {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'Buzz did not return to the foreground. Try again.',
'5dive did not return to the foreground. Try again.',
),
),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class LocalSensitiveActionAuthorizer implements SensitiveActionAuthorizer {
Future<DeviceAuthResult> authorizeIdentityAction({
required bool biometricOnly,
}) => _authorize(
localizedReason: 'Confirm sending your Buzz identity to desktop',
localizedReason: 'Confirm sending your 5dive identity to desktop',
biometricOnly: biometricOnly,
);

Expand Down
29 changes: 29 additions & 0 deletions mobile/lib/shared/widgets/fivedive_mark.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';

/// The 5dive mark, painted as a solid silhouette in [color].
///
/// The asset is an alpha mask cut from the same source art the launcher icons
/// are generated from, so the home screen and the onboarding hero show one
/// mark. It replaces upstream's tap-to-flutter bee on the welcome screen; the
/// bee itself still drives the pull-to-refresh indicator.
class FiveDiveMark extends StatelessWidget {
/// The rendered height of the mark.
///
/// Width follows from the mark's 342:512 aspect ratio.
final double height;

/// The color used for the mark's silhouette.
final Color color;

const FiveDiveMark({required this.height, required this.color, super.key});

@override
Widget build(BuildContext context) {
return Image.asset(
'assets/images/5dive-mark.png',
height: height,
color: color,
semanticLabel: '5dive',
);
}
}
1 change: 1 addition & 0 deletions mobile/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ flutter:
uses-material-design: true
assets:
- assets/images/buzz-icon.png
- assets/images/5dive-mark.png
# Generated by `just mobile-emoji-data` from the same emoji-mart dataset
# desktop uses. Do not hand-edit.
- assets/emoji/emoji-data.json
Expand Down
10 changes: 5 additions & 5 deletions mobile/test/features/channels/deep_link_dispatcher_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ void main() {

expect(storage.loadCalls, 1);
expect(pending.consumeCalls, 1);
expect(find.text('Join this Buzz community?'), findsOneWidget);
expect(find.text('Join this 5dive community?'), findsOneWidget);
});

testWidgets('waits for an invite modal before preparing the next invite', (
Expand Down Expand Up @@ -263,15 +263,15 @@ void main() {
expect(pending.consumeCalls, 1);
expect(pending.current, same(second));
expect(container.read(inviteJoinProvider).invite, same(first));
expect(find.text('Join this Buzz community?'), findsOneWidget);
expect(find.text('Join this 5dive community?'), findsOneWidget);

await tester.tap(find.widgetWithText(OutlinedButton, 'Cancel'));
await tester.pumpAndSettle();

expect(pending.consumeCalls, 2);
expect(pending.current, isNull);
expect(container.read(inviteJoinProvider).invite, same(second));
expect(find.text('Join this Buzz community?'), findsOneWidget);
expect(find.text('Join this 5dive community?'), findsOneWidget);
});

testWidgets('dispatches a queued channel after preparing an invite', (
Expand Down Expand Up @@ -308,7 +308,7 @@ void main() {

expect(pending.consumeCalls, 1);
expect(pending.current, same(channelLink));
expect(find.text('Join this Buzz community?'), findsOneWidget);
expect(find.text('Join this 5dive community?'), findsOneWidget);
expect(find.byType(_CapturedDestination), findsNothing);

await tester.tap(find.widgetWithText(OutlinedButton, 'Cancel'));
Expand Down Expand Up @@ -354,7 +354,7 @@ void main() {
);
await tester.pumpAndSettle();

expect(find.text('Join this Buzz community?'), findsOneWidget);
expect(find.text('Join this 5dive community?'), findsOneWidget);
expect(inviteContainer.read(pendingDeepLinkProvider), isNull);

final messageContainer = ProviderContainer(
Expand Down
8 changes: 4 additions & 4 deletions mobile/test/features/pairing/pairing_page_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import 'package:buzz/shared/community/community.dart';
import 'package:buzz/shared/security/sensitive_action_authorizer.dart';
import 'package:buzz/shared/theme/theme.dart';
import 'package:buzz/shared/widgets/buzz_loading_indicator.dart';
import 'package:buzz/shared/widgets/tappable_flapping_bee.dart';
import 'package:buzz/shared/widgets/fivedive_mark.dart';

import '../../helpers/widget_helpers.dart';

Expand All @@ -23,8 +23,8 @@ void main() {
WidgetHelpers.testable(child: const PairingPage()),
);

expect(find.byType(TappableFlappingBee), findsOneWidget);
expect(find.text('Welcome to Buzz'), findsOneWidget);
expect(find.byType(FiveDiveMark), findsOneWidget);
expect(find.text('Welcome to 5dive'), findsOneWidget);
expect(find.text('Scan a QR code'), findsOneWidget);
expect(find.text('Use pairing code'), findsOneWidget);
expect(find.text('Connect'), findsNothing);
Expand Down Expand Up @@ -340,7 +340,7 @@ void main() {
),
);

expect(find.textContaining('full Buzz identity'), findsOneWidget);
expect(find.textContaining('full 5dive identity'), findsOneWidget);
expect(find.textContaining('permanent access'), findsOneWidget);
expect(find.text('Codes Match'), findsOneWidget);
});
Expand Down
2 changes: 1 addition & 1 deletion mobile/test/features/settings/connection_section_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ void main() {
expect(pairing.resetCalls, 1);
expect(find.text('Identity recovery'), findsNothing);
expect(
find.text('Buzz did not return to the foreground. Try again.'),
find.text('5dive did not return to the foreground. Try again.'),
findsOneWidget,
);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ void main() {
expect(result, DeviceAuthResult.success);
verify(
() => authentication.authenticate(
localizedReason: 'Confirm sending your Buzz identity to desktop',
localizedReason: 'Confirm sending your 5dive identity to desktop',
authMessages: any(named: 'authMessages'),
biometricOnly: false,
sensitiveTransaction: true,
Expand Down
2 changes: 1 addition & 1 deletion mobile/test/widget_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ void main() {
),
);
await tester.pump();
expect(find.text('Welcome to Buzz'), findsOneWidget);
expect(find.text('Welcome to 5dive'), findsOneWidget);
});
}

Expand Down
4 changes: 2 additions & 2 deletions scripts/mobile-worktree-clean.sh
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
#!/usr/bin/env bash
# Uninstalls stale worktree-suffixed Buzz debug builds from booted iOS
# simulators and connected Android devices/emulators. Production installs
# (com.buzz.buzzMobile / xyz.block.buzz.mobile, no suffix) are never touched:
# (com.buzz.buzzMobile / com.fivedive.app, no suffix) are never touched:
# only identifiers with a worktree suffix appended after the production id
# are matched. Run `just mobile-clean` (or this script directly); pass
# --dry-run to list what would be removed without uninstalling.
set -euo pipefail

ios_prefix="com.buzz.buzzMobile."
android_prefix="xyz.block.buzz.mobile."
android_prefix="com.fivedive.app."

dry_run=0
if [[ "${1:-}" == "--dry-run" ]]; then
Expand Down
2 changes: 1 addition & 1 deletion scripts/mobile-worktree-overrides.sh
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ cat > "$ios_overrides" <<XCCONFIG
// Applies to Debug builds only (included from Flutter/Debug.xcconfig before
// AppOverrides.xcconfig, so a developer's app-specific overrides win).
BUNDLE_IDENTIFIER = ${ios_bundle_id}
APP_DISPLAY_NAME = Buzz (${label})
APP_DISPLAY_NAME = 5dive (${label})
XCCONFIG

cat > "$android_props" <<PROPERTIES
Expand Down
Loading
Loading