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
12 changes: 6 additions & 6 deletions Facett.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -419,10 +419,10 @@
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Facett/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography";
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Bluetooth is used to discover and connect to your GoPro cameras for remote control and settings management.";
INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Bluetooth is used to discover and connect to your GoPro cameras for remote control and settings management.";
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Bluetooth is used to discover and connect to your action cameras for remote control and settings management.";
INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Bluetooth is used to discover and connect to your action cameras for remote control and settings management.";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "Voice control allows you to start and stop recording by saying \"start\" or \"stop\".";
INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Speech recognition enables voice commands to control your GoPro cameras.";
INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Speech recognition enables voice commands to control your cameras.";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
Expand Down Expand Up @@ -458,10 +458,10 @@
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Facett/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography";
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Bluetooth is used to discover and connect to your GoPro cameras for remote control and settings management.";
INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Bluetooth is used to discover and connect to your GoPro cameras for remote control and settings management.";
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Bluetooth is used to discover and connect to your action cameras for remote control and settings management.";
INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Bluetooth is used to discover and connect to your action cameras for remote control and settings management.";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "Voice control allows you to start and stop recording by saying \"start\" or \"stop\".";
INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Speech recognition enables voice commands to control your GoPro cameras.";
INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "Speech recognition enables voice commands to control your cameras.";
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
Expand Down
83 changes: 83 additions & 0 deletions Facett/AboutView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import SwiftUI

struct AboutView: View {
@Environment(\.dismiss) private var dismiss

private var appVersion: String {
let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0"
let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "1"
return "\(version) (\(build))"
}

var body: some View {
NavigationView {
List {
Section {
VStack(spacing: 12) {
Image(systemName: "camera.on.rectangle.fill")
.font(.system(size: 48))
.foregroundColor(.blue)

Text("Facett")
.font(.title)
.fontWeight(.bold)

Text("Version \(appVersion)")
.font(.subheadline)
.foregroundColor(.secondary)
}
.frame(maxWidth: .infinity)
.padding(.vertical, 16)
.listRowBackground(Color.clear)
}

Section(header: Text("About")) {
Text("Facett is a multi-camera control app that connects to action cameras over Bluetooth Low Energy. Manage camera groups, synchronize settings, and start or stop recording across multiple cameras simultaneously.")
.font(.subheadline)
.foregroundColor(.secondary)
}

Section(header: Text("Compatibility")) {
Label {
VStack(alignment: .leading, spacing: 4) {
Text("GoPro\u{00AE} HERO10 Black")
.font(.subheadline)
Text("Tested with GoPro Labs firmware. Other models may work but are not officially supported.")
.font(.caption)
.foregroundColor(.secondary)
}
} icon: {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.green)
}

Label {
VStack(alignment: .leading, spacing: 4) {
Text("GoPro Labs Firmware Required")
.font(.subheadline)
Text("Install GoPro Labs firmware on your cameras for full BLE connectivity.")
.font(.caption)
.foregroundColor(.secondary)
}
} icon: {
Image(systemName: "exclamationmark.triangle.fill")
.foregroundColor(.orange)
}
}

Section(header: Text("Legal")) {
Text("This product and/or service is not affiliated with, endorsed by or in any way associated with GoPro Inc. or its products and services. GoPro, HERO and their respective logos are trademarks or registered trademarks of GoPro, Inc.")
.font(.caption)
.foregroundColor(.secondary)
}
}
.navigationTitle("About")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Done") { dismiss() }
}
}
}
}
}
Binary file modified Facett/Assets.xcassets/AppIcon.appiconset/icon1024 1.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 Facett/Assets.xcassets/AppIcon.appiconset/icon1024 2.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 Facett/Assets.xcassets/AppIcon.appiconset/icon1024.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 Facett/Assets.xcassets/LaunchImage.imageset/launch 1.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 Facett/Assets.xcassets/LaunchImage.imageset/launch 2.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 Facett/Assets.xcassets/LaunchImage.imageset/launch.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 6 additions & 1 deletion Facett/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ struct ContentView: View {
@State private var showingConfigManagement = false
@State private var showingVoiceNotificationSettings = false
@State private var showingBugReportForm = false
@State private var showingAbout = false
@State private var autoSyncTimer: Timer?
@State private var syncRotation: Double = 0
@State private var showModeMismatchModal = false
Expand Down Expand Up @@ -268,7 +269,8 @@ struct ContentView: View {
showingCameraGroupManagement: $showingCameraGroupManagement,
showingConfigManagement: $showingConfigManagement,
showingVoiceNotificationSettings: $showingVoiceNotificationSettings,
showingBugReportForm: $showingBugReportForm
showingBugReportForm: $showingBugReportForm,
showingAbout: $showingAbout
)

// QR Code Section - Prominent placement
Expand Down Expand Up @@ -303,6 +305,9 @@ struct ContentView: View {
.sheet(isPresented: $showingBugReportForm) {
BugReportView()
}
.sheet(isPresented: $showingAbout) {
AboutView()
}
.alert("Camera Mode Mismatch", isPresented: $showModeMismatchModal) {
Button("OK") {
showModeMismatchModal = false
Expand Down
11 changes: 11 additions & 0 deletions Facett/ManagementButtonsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ struct ManagementButtonsView: View {
@Binding var showingConfigManagement: Bool
@Binding var showingVoiceNotificationSettings: Bool
@Binding var showingBugReportForm: Bool
@Binding var showingAbout: Bool

var body: some View {
VStack(spacing: 12) {
Expand Down Expand Up @@ -113,6 +114,16 @@ struct ManagementButtonsView: View {
action: { showingBugReportForm = true }
)
}

HStack(spacing: 12) {
ManagementButton(
title: "About",
subtitle: "Info & Legal",
icon: "info.circle.fill",
color: .gray,
action: { showingAbout = true }
)
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion Facett/VoiceNotificationSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ struct VoiceNotificationSettingsView: View {
.disabled(!voiceNotificationManager.voiceNotificationsEnabled)

Button("Test Camera Connected") {
voiceNotificationManager.notifyCameraConnected(cameraName: "GoPro Hero 11")
voiceNotificationManager.notifyCameraConnected(cameraName: "Camera 1")
}
.disabled(!voiceNotificationManager.voiceNotificationsEnabled)
}
Expand Down