oficina / meet Public

Merge branch 'fix/ui-name-and-scheme' into main

claude agent, operated by paul@keymail.dev bb364ca24549e4a689d8ad7ffe9d7ec5579df28f parent 4470a38parent f92de9f
11 files changed, +18 −18
  • README.md +1 −1
  • internal/calls/handlers_join.go +1 −1
  • internal/callstest/meeting_settings_test.go +1 −1
  • native/apple/Sources/CallsKit/CallsLobby.swift +1 −1
  • native/apple/Sources/CallsKit/CallsModel.swift +1 −1
  • native/apple/Sources/CallsKit/Media.swift +2 −2
  • native/apple/Tests/CallsKitTests/MeetingLinkTests.swift +5 −5
  • native/ios/project.yml +2 −2
  • native/scripts/bundle-mac.py +2 −2
  • native/scripts/generate-iphone-icon.swift +1 −1
  • test/browser/call.mjs +1 −1

CI passed — run details

diff --git a/README.md b/README.md
index 87bd1bb..5bd3d35 100644
--- a/README.md
+++ b/README.md
@@ -190,7 +190,7 @@ at entry; admitted participants keep their participation. Turning the waiting ro
admits queued guests up to the call capacity.
Invitation and browser holding pages offer **Join in the app**, using the
-`oficina-meet://join?url=…` URL scheme registered by the Mac and iOS bundles.
+`oficina-calls://join?url=…` URL scheme registered by the Mac and iOS bundles.
The app opens the meeting link in its lobby for review, then uses the existing
browser authorization flow (including anonymous guest sessions). Browser joining
remains available when the app is not installed.
diff --git a/internal/calls/handlers_join.go b/internal/calls/handlers_join.go
index d6aac7b..22365e2 100644
--- a/internal/calls/handlers_join.go
+++ b/internal/calls/handlers_join.go
@@ -94,5 +94,5 @@ func (a *app) holding(w http.ResponseWriter, r *http.Request) {
// Only app-constructed meeting URLs are promoted to the custom URL scheme.
func nativeJoinURL(meeting string) template.URL {
- return template.URL("oficina-meet://join?url=" + url.QueryEscape(meeting))
+ return template.URL("oficina-calls://join?url=" + url.QueryEscape(meeting))
}
diff --git a/internal/callstest/meeting_settings_test.go b/internal/callstest/meeting_settings_test.go
index 66fe97f..ce44cdc 100644
--- a/internal/callstest/meeting_settings_test.go
+++ b/internal/callstest/meeting_settings_test.go
@@ -53,7 +53,7 @@ func TestAnonymousGuestJoinsWithoutMemberPowers(t *testing.T) {
x, sqid, token := memberWithMeeting(t)
g := x.browser(t)
r := g.get("/j/" + token)
- if r.Code != 200 || !strings.Contains(r.Body.String(), "oficina-meet://join?") {
+ if r.Code != 200 || !strings.Contains(r.Body.String(), "oficina-calls://join?") {
t.Fatal("missing guest/app choice", r.Code)
}
if r := g.post("/j/"+token+"/guest", url.Values{"name": {" "}}); r.Code != 422 {
diff --git a/native/apple/Sources/CallsKit/CallsLobby.swift b/native/apple/Sources/CallsKit/CallsLobby.swift
index 182a696..f0e80c9 100644
--- a/native/apple/Sources/CallsKit/CallsLobby.swift
+++ b/native/apple/Sources/CallsKit/CallsLobby.swift
@@ -15,7 +15,7 @@ import SwiftUI
.font(.largeTitle).foregroundStyle(.tint)
.padding(18).background(.tint.opacity(0.1), in: RoundedRectangle(cornerRadius: 22))
.accessibilityHidden(true)
- Text("OFICINA MEET").font(.caption.bold()).tracking(2).foregroundStyle(.secondary)
+ Text("OFICINA CALLS").font(.caption.bold()).tracking(2).foregroundStyle(.secondary)
Text(heading).font(.largeTitle.bold()).fixedSize(horizontal: false, vertical: true)
Text(subheading).foregroundStyle(.secondary).fixedSize(horizontal: false, vertical: true)
}
diff --git a/native/apple/Sources/CallsKit/CallsModel.swift b/native/apple/Sources/CallsKit/CallsModel.swift
index e5a7a62..e6c088f 100644
--- a/native/apple/Sources/CallsKit/CallsModel.swift
+++ b/native/apple/Sources/CallsKit/CallsModel.swift
@@ -30,7 +30,7 @@ import Foundation
error = "Leave the current meeting before opening another."
return
}
- guard url.scheme == "oficina-meet", url.host == "join",
+ guard url.scheme == "oficina-calls", url.host == "join",
let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let target = components.queryItems?.first(where: { $0.name == "url" })?.value,
let meeting = URL(string: target), meeting.scheme == "https",
diff --git a/native/apple/Sources/CallsKit/Media.swift b/native/apple/Sources/CallsKit/Media.swift
index 1621062..12224f2 100644
--- a/native/apple/Sources/CallsKit/Media.swift
+++ b/native/apple/Sources/CallsKit/Media.swift
@@ -152,8 +152,8 @@ import WebRTC
with: configuration(ice),
constraints: RTCMediaConstraints(mandatoryConstraints: nil, optionalConstraints: nil),
delegate: self)
- if let audio = engine.localAudio { _ = pc?.add(audio, streamIds: ["meet"]) }
- if let video = engine.localVideo { _ = pc?.add(video, streamIds: ["meet"]) }
+ if let audio = engine.localAudio { _ = pc?.add(audio, streamIds: ["calls"]) }
+ if let video = engine.localVideo { _ = pc?.add(video, streamIds: ["calls"]) }
}
func close() {
closed = true
diff --git a/native/apple/Tests/CallsKitTests/MeetingLinkTests.swift b/native/apple/Tests/CallsKitTests/MeetingLinkTests.swift
index d3d2e07..b4dc91b 100644
--- a/native/apple/Tests/CallsKitTests/MeetingLinkTests.swift
+++ b/native/apple/Tests/CallsKitTests/MeetingLinkTests.swift
@@ -4,16 +4,16 @@ import XCTest
final class MeetingLinkTests: XCTestCase {
@MainActor func testInvitationOpensInLobbyWithoutJoiningOrStartingAuthentication() {
let model = CallsModel()
- model.openMeetingURL(URL(string: "oficina-meet://join?url=https%3A%2F%2Fmeet.example.com%2Fj%2Finvitation")!)
- XCTAssertEqual(model.address, "https://meet.example.com/j/invitation")
+ model.openMeetingURL(URL(string: "oficina-calls://join?url=https%3A%2F%2Fcalls.example.com%2Fj%2Finvitation")!)
+ XCTAssertEqual(model.address, "https://calls.example.com/j/invitation")
XCTAssertFalse(model.joining)
XCTAssertFalse(model.authenticating)
}
@MainActor func testRejectsUntrustedURLShapesAndDoesNotInterruptCall() {
let model = CallsModel()
- for target in ["file:///j/token", "https://user:secret@meet.example.com/j/token", "https://meet.example.com/settings"] {
- var link = URLComponents(string: "oficina-meet://join")!
+ for target in ["file:///j/token", "https://user:secret@calls.example.com/j/token", "https://calls.example.com/settings"] {
+ var link = URLComponents(string: "oficina-calls://join")!
link.queryItems = [URLQueryItem(name: "url", value: target)]
model.openMeetingURL(link.url!)
XCTAssertEqual(model.address, "")
@@ -21,7 +21,7 @@ final class MeetingLinkTests: XCTestCase {
}
model.joining = true
model.address = "current"
- model.openMeetingURL(URL(string: "oficina-meet://join?url=https%3A%2F%2Fmeet.example.com%2Fm%2Froom")!)
+ model.openMeetingURL(URL(string: "oficina-calls://join?url=https%3A%2F%2Fcalls.example.com%2Fm%2Froom")!)
XCTAssertEqual(model.address, "current")
XCTAssertTrue(model.joining)
}
diff --git a/native/ios/project.yml b/native/ios/project.yml
index 35e85b9..185319d 100644
--- a/native/ios/project.yml
+++ b/native/ios/project.yml
@@ -25,8 +25,8 @@ targets:
path: ../build/ios-info.plist
properties:
CFBundleURLTypes:
- - CFBundleURLName: net.amadan.oficina.meet.join
- CFBundleURLSchemes: [oficina-meet]
+ - CFBundleURLName: net.amadan.oficina.calls.join
+ CFBundleURLSchemes: [oficina-calls]
dependencies:
- package: CallsNative
product: CallsKit
diff --git a/native/scripts/bundle-mac.py b/native/scripts/bundle-mac.py
index f034c71..3df0828 100644
--- a/native/scripts/bundle-mac.py
+++ b/native/scripts/bundle-mac.py
@@ -27,8 +27,8 @@ for size in (16, 32, 128, 256, 512):
subprocess.run(['iconutil', '-c', 'icns', str(iconset), '-o',
str(bundle / 'Resources/CallsMac.icns')], check=True)
info = {
- 'CFBundleURLTypes': [{'CFBundleURLName': 'net.amadan.oficina.meet.join',
- 'CFBundleURLSchemes': ['oficina-meet']}],
+ 'CFBundleURLTypes': [{'CFBundleURLName': 'net.amadan.oficina.calls.join',
+ 'CFBundleURLSchemes': ['oficina-calls']}],
'CFBundleName': 'Calls', 'CFBundleDisplayName': 'Calls',
'CFBundleIdentifier': 'net.amadan.oficina.calls',
'CFBundleExecutable': 'CallsMac', 'CFBundlePackageType': 'APPL',
diff --git a/native/scripts/generate-iphone-icon.swift b/native/scripts/generate-iphone-icon.swift
index 62a8bcf..e647b87 100644
--- a/native/scripts/generate-iphone-icon.swift
+++ b/native/scripts/generate-iphone-icon.swift
@@ -1,7 +1,7 @@
import Foundation
// Export the approved Oficina artwork already held by the asset catalog.
-// Regenerate it from oficina/estilo with brand/distribute.py meet <checkout>.
+// Regenerate it from oficina/estilo with brand/distribute.py calls <checkout>.
let script = URL(fileURLWithPath: #filePath).standardizedFileURL
let native = script.deletingLastPathComponent().deletingLastPathComponent()
let source = native.appendingPathComponent("ios/Assets.xcassets/AppIcon.appiconset/AppIcon.png")
diff --git a/test/browser/call.mjs b/test/browser/call.mjs
index 08dab25..cf2cffe 100644
--- a/test/browser/call.mjs
+++ b/test/browser/call.mjs
@@ -1150,7 +1150,7 @@ const run = {
const guest = await newContext('anonymous guest');
const page = await guest.newPage();
await page.goto(origin + '/j/' + token);
- check((await page.getByRole('link', { name: 'Join in the app' }).getAttribute('href')).startsWith('oficina-meet://join?'), 'invitation offers the native app');
+ check((await page.getByRole('link', { name: 'Join in the app' }).getAttribute('href')).startsWith('oficina-calls://join?'), 'invitation offers the native app');
await page.getByLabel('Your name').fill('Visitor');
await Promise.all([
page.waitForURL('**/m/' + sqid + '/join'),