Skip to content
Draft
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
27 changes: 24 additions & 3 deletions android/app/src/main/java/dev/openstream/app/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class MainActivity : Activity() {
private lateinit var btnScreenOff: TextView
private lateinit var btnTorch: TextView
private lateinit var btnSettings: TextView
private lateinit var btnStart: TextView
private lateinit var btnStop: TextView
private lateinit var screenOffOverlay: View
private lateinit var identifyOverlay: TextView
Expand Down Expand Up @@ -452,6 +453,7 @@ class MainActivity : Activity() {
btnScreenOff = findViewById(R.id.btnScreenOff)
btnTorch = findViewById(R.id.btnTorch)
btnSettings = findViewById(R.id.btnSettings)
btnStart = findViewById(R.id.btnStart)
btnStop = findViewById(R.id.btnStop)
screenOffOverlay = findViewById(R.id.screenOffOverlay)
identifyOverlay = findViewById(R.id.identifyOverlay)
Expand Down Expand Up @@ -505,6 +507,13 @@ class MainActivity : Activity() {
@Suppress("DEPRECATION")
startActivityForResult(intent, SETTINGS_REQUEST_CODE)
}
btnStart.setOnClickListener {
if (!OperatorActionPolicy.canStart(phoneServerRunning, uiState is OpenStreamUiState.Live)) {
return@setOnClickListener
}
startPreviewIfAllowed()
startPhoneServerIfAllowed()
}
btnStop.setOnClickListener {
stopPhoneServer(clearReservation = true)
disarmRemoteOperation()
Expand All @@ -515,7 +524,7 @@ class MainActivity : Activity() {
btnExposurePanel.setOnClickListener { showCameraPalette(CameraPalette.Exposure) }
btnFocusPanel.setOnClickListener { showCameraPalette(CameraPalette.Focus) }
btnColorPanel.setOnClickListener { showCameraPalette(CameraPalette.Color) }
btnLensPanel.setOnClickListener { showCameraPalette(CameraPalette.Lens) }
btnLensPanel.setOnClickListener { selectNextLens() }
hudFps.setOnClickListener { showCameraPalette(CameraPalette.Exposure) }
hudShutter.setOnClickListener { showCameraPalette(CameraPalette.Exposure) }
hudIso.setOnClickListener { showCameraPalette(CameraPalette.Exposure) }
Expand Down Expand Up @@ -902,6 +911,7 @@ class MainActivity : Activity() {
paletteHelp.text = "Choose a physical lens, frame with zoom, then select stabilization supported by this camera."
lensSelectorRow.visibility = View.VISIBLE
buildLensButtons()
btnLensPanel.text = "LENS ${currentLens.shortLabel}"
setupModes("Off", "EIS", "OIS")
selectMode(when (state.settings.stabilizationMode) {
StabilizationMode.Off -> 0
Expand Down Expand Up @@ -1041,7 +1051,11 @@ class MainActivity : Activity() {
btnArmRemote.text = getString(if (remoteArmed) R.string.remote_armed else R.string.remote_disarmed)
btnArmRemote.isSelected = remoteArmed
btnArmRemote.setTextColor(getColor(if (remoteArmed) R.color.os_black else R.color.os_text_primary))
btnStop.visibility = if (remoteArmed || uiState is OpenStreamUiState.Live) View.VISIBLE else View.GONE
btnStop.visibility = if (OperatorActionPolicy.shouldShowStop(remoteArmed, uiState is OpenStreamUiState.Live)) {
View.VISIBLE
} else {
View.GONE
}
}

private fun formatShutter(shutterNs: Long): String {
Expand Down Expand Up @@ -1127,6 +1141,13 @@ class MainActivity : Activity() {
mainHandler.postDelayed(restart, LENS_RESTART_DELAY_MS)
}
buildLensButtons()
btnLensPanel.text = "LENS ${currentLens.shortLabel}"
}

private fun selectNextLens() {
if (availableLenses.size < 2) return
val currentIndex = availableLenses.indexOf(currentLens).coerceAtLeast(0)
selectLens(availableLenses[(currentIndex + 1) % availableLenses.size])
}

private fun cancelLensRestart() {
Expand Down Expand Up @@ -1739,7 +1760,7 @@ class MainActivity : Activity() {
val dismissBtn = dialog.findViewById<TextView>(R.id.dialogUpdateDismiss)

title.text = "OpenStream ready"
message.text = "You are running OpenStream v$versionName.\nFuture updates can be checked from Settings."
message.text = "You are running OpenStream v$versionName. Updates are checked automatically."
progress.visibility = View.GONE
progressText.visibility = View.GONE
actionBtn.text = "GOT IT"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package dev.openstream.app

/** Keeps the minimal operator surface from starting duplicate listener sessions. */
object OperatorActionPolicy {
fun canStart(phoneServerRunning: Boolean, isLive: Boolean): Boolean =
!phoneServerRunning && !isLive

fun shouldShowStop(remoteArmed: Boolean, isLive: Boolean): Boolean =
remoteArmed || isLive
}
45 changes: 0 additions & 45 deletions android/app/src/main/java/dev/openstream/app/SettingsActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package dev.openstream.app

import android.app.Activity
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.WindowInsets
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
Expand All @@ -21,10 +18,6 @@ class SettingsActivity : Activity() {
private lateinit var btnSave: TextView
private lateinit var btnSaveAndConnect: TextView
private lateinit var btnBack: TextView
private lateinit var btnCheckUpdates: TextView
private lateinit var btnToggleAdvanced: TextView
private lateinit var advancedSettingsPanel: View
private lateinit var versionInfo: TextView
private lateinit var appUpdater: AppUpdater

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -38,27 +31,15 @@ class SettingsActivity : Activity() {
btnSave = findViewById(R.id.btnSaveSettings)
btnSaveAndConnect = findViewById(R.id.btnSaveAndConnect)
btnBack = findViewById(R.id.btnBackSettings)
btnCheckUpdates = findViewById(R.id.btnCheckUpdates)
btnToggleAdvanced = findViewById(R.id.btnToggleAdvanced)
advancedSettingsPanel = findViewById(R.id.advancedSettingsPanel)
versionInfo = findViewById(R.id.settingsVersionInfo)

appUpdater = AppUpdater(this)
appUpdater.register()

loadSettings()
showVersionInfo()
renderAdvancedVisibility(manualSettingsInUse())

btnSave.setOnClickListener { saveSettings(connectAfterSave = false) }
btnSaveAndConnect.setOnClickListener { saveSettings(connectAfterSave = true) }
btnBack.setOnClickListener { finish() }
btnCheckUpdates.setOnClickListener {
appUpdater.checkForUpdates(showAlreadyCurrent = true)
}
btnToggleAdvanced.setOnClickListener {
renderAdvancedVisibility(advancedSettingsPanel.visibility != View.VISIBLE)
}
}

override fun onResume() {
Expand Down Expand Up @@ -148,32 +129,6 @@ class SettingsActivity : Activity() {
inputListeningPort.error = null
}

private fun showVersionInfo() {
runCatching {
val info = packageManager.getPackageInfo(packageName, 0)
val code = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
info.longVersionCode
} else {
@Suppress("DEPRECATION")
info.versionCode.toLong()
}
versionInfo.text = "OpenStream v${info.versionName} (${code})"
}
}

private fun manualSettingsInUse(): Boolean {
val prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
return !prefs.getString(KEY_OBS_HOST, "").isNullOrBlank() ||
prefs.getInt(KEY_OBS_PORT, ConnectionTarget.DEFAULT_PORT) != ConnectionTarget.DEFAULT_PORT ||
prefs.getInt(KEY_LATENCY, ConnectionTarget.DEFAULT_LATENCY_MS) != ConnectionTarget.DEFAULT_LATENCY_MS ||
prefs.getInt(KEY_LISTENING_PORT, ConnectionTarget.DEFAULT_PORT) != ConnectionTarget.DEFAULT_PORT
}

private fun renderAdvancedVisibility(visible: Boolean) {
advancedSettingsPanel.visibility = if (visible) View.VISIBLE else View.GONE
btnToggleAdvanced.setText(if (visible) R.string.settings_hide_advanced else R.string.settings_show_advanced)
}

companion object {
const val PREFS_NAME = "openstream_settings"
const val KEY_OBS_HOST = "obs_host"
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/res/drawable/bg_btn_ghost.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
android:shape="rectangle">
<corners android:radius="999dp" />
<solid android:color="#00000000" />
<stroke android:width="1dp" android:color="#33FFFFFF" />
<stroke android:width="1dp" android:color="#66FFFFFF" />
</shape>
6 changes: 3 additions & 3 deletions android/app/src/main/res/drawable/bg_camera_palette.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#F20B0F14" />
<stroke android:width="1dp" android:color="@color/os_glass_border" />
<corners android:topLeftRadius="22dp" android:bottomLeftRadius="22dp" />
<solid android:color="@color/os_surface_card" />
<stroke android:width="1dp" android:color="@color/os_hairline" />
<corners android:topLeftRadius="8dp" android:bottomLeftRadius="8dp" />
</shape>
6 changes: 3 additions & 3 deletions android/app/src/main/res/drawable/bg_card.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp" />
<solid android:color="#1AFFFFFF" />
<stroke android:width="1dp" android:color="#33FFFFFF" />
<corners android:radius="8dp" />
<solid android:color="@color/os_surface_card" />
<stroke android:width="1dp" android:color="@color/os_hairline" />
</shape>
4 changes: 2 additions & 2 deletions android/app/src/main/res/drawable/bg_chip.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="999dp" />
<solid android:color="#26FFFFFF" />
<stroke android:width="1dp" android:color="#33FFFFFF" />
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="#66FFFFFF" />
</shape>
2 changes: 1 addition & 1 deletion android/app/src/main/res/drawable/bg_focus_reticle.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<stroke android:width="2dp" android:color="@color/os_accent" />
<corners android:radius="8dp" />
<corners android:radius="0dp" />
</shape>
6 changes: 3 additions & 3 deletions android/app/src/main/res/drawable/bg_hud_chip.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#D9141920" />
<stroke android:width="1dp" android:color="@color/os_glass_border" />
<corners android:radius="10dp" />
<solid android:color="@color/os_surface_card" />
<stroke android:width="1dp" android:color="@color/os_hairline" />
<corners android:radius="8dp" />
</shape>
2 changes: 1 addition & 1 deletion android/app/src/main/res/drawable/bg_minimal_btn_ghost.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
android:shape="rectangle">
<corners android:radius="999dp" />
<solid android:color="#00000000" />
<stroke android:width="1dp" android:color="#33FFFFFF" />
<stroke android:width="1dp" android:color="#66FFFFFF" />
</shape>
6 changes: 3 additions & 3 deletions android/app/src/main/res/drawable/bg_minimal_input.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp" />
<solid android:color="#1AFFFFFF" />
<stroke android:width="1dp" android:color="#4DFFFFFF" />
<corners android:radius="8dp" />
<solid android:color="@color/os_surface_soft" />
<stroke android:width="1dp" android:color="@color/os_hairline" />
</shape>
6 changes: 3 additions & 3 deletions android/app/src/main/res/drawable/bg_minimal_panel.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="24dp" />
<solid android:color="#26FFFFFF" />
<stroke android:width="1dp" android:color="#33FFFFFF" />
<corners android:radius="8dp" />
<solid android:color="@color/os_surface_card" />
<stroke android:width="1dp" android:color="@color/os_hairline" />
</shape>
4 changes: 2 additions & 2 deletions android/app/src/main/res/drawable/bg_minimal_pill.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="999dp" />
<solid android:color="#26FFFFFF" />
<stroke android:width="1dp" android:color="#33FFFFFF" />
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="#66FFFFFF" />
</shape>
52 changes: 36 additions & 16 deletions android/app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,28 @@
android:paddingStart="20dp"
android:paddingTop="18dp"
android:paddingEnd="20dp"
android:paddingBottom="34dp">
android:paddingBottom="34dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="40dp"
android:gravity="center_vertical"
android:text="OPERATOR"
android:textColor="@color/os_text_primary"
android:textSize="12sp"
android:fontFamily="monospace"
android:letterSpacing="0.12" />

<TextView
android:id="@+id/tallyBadge"
style="@style/OpenStream.HudStatus"
android:layout_marginStart="8dp"
android:text="PROGRAM"
android:visibility="gone" />

Expand Down Expand Up @@ -105,7 +116,8 @@
android:id="@+id/authorityBadge"
style="@style/OpenStream.HudStatus"
android:layout_marginStart="8dp"
android:text="COLLABORATIVE" />
android:text="COLLABORATIVE"
android:visibility="gone" />

<TextView
android:id="@+id/streamInfoChip"
Expand Down Expand Up @@ -145,14 +157,14 @@
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView android:id="@+id/hudFps" style="@style/OpenStream.HudControl" android:text="FPS 60" />
<TextView android:id="@+id/hudShutter" style="@style/OpenStream.HudControl" android:text="SHUTTER AUTO" />
<TextView android:id="@+id/hudIso" style="@style/OpenStream.HudControl" android:text="ISO AUTO" />
<TextView android:id="@+id/hudWb" style="@style/OpenStream.HudControl" android:text="WB AUTO" />
<TextView android:id="@+id/hudFocus" style="@style/OpenStream.HudControl" android:text="AF-C" />
<TextView android:id="@+id/hudFps" style="@style/OpenStream.HudControl" android:text="FPS 60" android:visibility="gone" />
<TextView android:id="@+id/hudShutter" style="@style/OpenStream.HudControl" android:text="SHUTTER AUTO" android:visibility="gone" />
<TextView android:id="@+id/hudIso" style="@style/OpenStream.HudControl" android:text="ISO AUTO" android:visibility="gone" />
<TextView android:id="@+id/hudWb" style="@style/OpenStream.HudControl" android:text="WB AUTO" android:visibility="gone" />
<TextView android:id="@+id/hudFocus" style="@style/OpenStream.HudControl" android:text="AF-C" android:visibility="gone" />
<TextView android:id="@+id/hudBattery" style="@style/OpenStream.HudStatus" android:layout_marginEnd="8dp" android:text="BAT --%" />
<TextView android:id="@+id/hudThermal" style="@style/OpenStream.HudStatus" android:layout_marginEnd="8dp" android:text="THERMAL --" />
<TextView android:id="@+id/hudNetwork" style="@style/OpenStream.HudStatus" android:layout_marginEnd="8dp" android:text="NETWORK --" />
<TextView android:id="@+id/hudNetwork" style="@style/OpenStream.HudStatus" android:layout_marginEnd="8dp" android:text="NETWORK --" android:visibility="gone" />
<TextView android:id="@+id/btnFrameGuides" style="@style/OpenStream.HudControl" android:contentDescription="@string/frame_guides_description" android:text="GUIDES 3×3" />
<TextView android:id="@+id/btnZebra" style="@style/OpenStream.HudControl" android:contentDescription="@string/zebra_description" android:text="ZEBRA 95" />
</LinearLayout>
Expand Down Expand Up @@ -185,7 +197,8 @@
android:text="@string/status_ready"
android:textColor="@color/os_text_primary"
android:textSize="20sp"
android:textStyle="bold" />
android:fontFamily="sans-serif"
android:letterSpacing="-0.02" />

<TextView
android:id="@+id/statusDetail"
Expand All @@ -203,11 +216,11 @@
android:gravity="center"
android:orientation="horizontal">

<TextView android:id="@+id/btnExposurePanel" style="@style/OpenStream.Control" android:text="Exposure" />
<TextView android:id="@+id/btnFocusPanel" style="@style/OpenStream.Control" android:text="Focus" />
<TextView android:id="@+id/btnColorPanel" style="@style/OpenStream.Control" android:text="Color" />
<TextView android:id="@+id/btnExposurePanel" style="@style/OpenStream.Control" android:text="Exposure" android:visibility="gone" />
<TextView android:id="@+id/btnFocusPanel" style="@style/OpenStream.Control" android:text="Focus" android:visibility="gone" />
<TextView android:id="@+id/btnColorPanel" style="@style/OpenStream.Control" android:text="Color" android:visibility="gone" />
<TextView android:id="@+id/btnLensPanel" style="@style/OpenStream.Control" android:text="Lens" />
<TextView android:id="@+id/btnArmRemote" style="@style/OpenStream.Control" android:text="Arm remote" />
<TextView android:id="@+id/btnArmRemote" style="@style/OpenStream.Control" android:text="Arm remote" android:visibility="gone" />
</LinearLayout>

<LinearLayout
Expand All @@ -217,8 +230,14 @@
android:gravity="center"
android:orientation="horizontal">

<TextView android:id="@+id/btnTorch" style="@style/OpenStream.Control" android:text="@string/control_torch" />
<TextView android:id="@+id/btnScreenOff" style="@style/OpenStream.Control" android:text="Screen off" />
<TextView android:id="@+id/btnTorch" style="@style/OpenStream.Control" android:text="@string/control_torch" android:visibility="gone" />
<TextView android:id="@+id/btnScreenOff" style="@style/OpenStream.Control" android:text="Screen off" android:visibility="gone" />
<TextView
android:id="@+id/btnStart"
style="@style/OpenStream.Control"
android:background="@drawable/bg_minimal_btn"
android:text="Start"
android:textColor="@color/os_accent_on" />
<TextView android:id="@+id/btnSettings" style="@style/OpenStream.Control" android:text="Settings" />
<TextView
android:id="@+id/btnStop"
Expand Down Expand Up @@ -256,7 +275,8 @@
android:text="Exposure"
android:textColor="@color/os_text_primary"
android:textSize="22sp"
android:textStyle="bold" />
android:fontFamily="sans-serif"
android:letterSpacing="-0.02" />

<TextView
android:id="@+id/paletteClose"
Expand Down
Loading
Loading