Skip to content

Commit d5b465c

Browse files
authored
Merge pull request #211 from tobexyz/issue207
Issue207
2 parents 56f1437 + 78a4710 commit d5b465c

19 files changed

Lines changed: 95 additions & 32 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
reports
12
.kiro
23
doxygen
34
.bundle

yaacc/src/main/java/de/yaacc/browser/ServerListFragment.java

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import android.content.SharedPreferences;
2323
import android.graphics.drawable.Drawable;
2424
import android.os.Bundle;
25-
import de.yaacc.util.YaaccLogger;
2625
import android.view.LayoutInflater;
2726
import android.view.View;
2827
import android.view.ViewGroup;
@@ -53,6 +52,7 @@
5352
import de.yaacc.util.FormatHelper;
5453
import de.yaacc.util.ShutdownTimerListener;
5554
import de.yaacc.util.ThemeHelper;
55+
import de.yaacc.util.YaaccLogger;
5656

5757
/**
5858
* Activity for browsing devices and folders. Represents the entrypoint for the whole application.
@@ -81,7 +81,7 @@ private SharedPreferences getPreferences() {
8181
@Override
8282
public void onCreate(Bundle savedInstanceState) {
8383
super.onCreate(savedInstanceState);
84-
84+
8585
// Register callback for MediaProjection stop events
8686
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
8787
de.yaacc.upnp.server.media.MediaProjectionHelper.setStopCallback(() -> {
@@ -90,17 +90,17 @@ public void onCreate(Bundle savedInstanceState) {
9090
getActivity().runOnUiThread(() -> {
9191
android.content.SharedPreferences prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(requireContext());
9292
prefs.edit()
93-
.putBoolean(getString(R.string.settings_local_server_serve_system_audio_chkbx), false)
94-
.putBoolean(getString(R.string.settings_local_server_serve_screen_cast_chkbx), false)
95-
.apply();
96-
93+
.putBoolean(getString(R.string.settings_local_server_serve_system_audio_chkbx), false)
94+
.putBoolean(getString(R.string.settings_local_server_serve_screen_cast_chkbx), false)
95+
.apply();
96+
9797
de.yaacc.browser.BrowseDeviceAdapter.setAudioStreaming(false);
9898
de.yaacc.browser.BrowseDeviceAdapter.setVideoStreaming(false);
99-
99+
100100
if (bDeviceAdapter != null) {
101101
bDeviceAdapter.notifyDataSetChanged();
102102
}
103-
103+
104104
YaaccLogger.i(getClass().getName(), "Streaming disabled - MediaProjection stopped");
105105
});
106106
}
@@ -192,6 +192,10 @@ public void receiverDeviceAdded(Device<?, ?, ?> device) {
192192
@Override
193193
public void onResume() {
194194
super.onResume();
195+
// Trigger UPnP discovery to find new devices
196+
if (upnpClient != null && upnpClient.isInitialized()) {
197+
upnpClient.searchDevices();
198+
}
195199
//refresh device list
196200
Thread thread = new Thread(this::populateDeviceList);
197201
thread.start();
@@ -345,21 +349,21 @@ public void setShutdownTimerRemainingTime(String s) {
345349
public void onTick(long millisUntilFinished) {
346350
setShutdownTimerRemainingTime(FormatHelper.parseMillisToTimeStringTo(millisUntilFinished));
347351
}
348-
352+
349353
@Override
350354
public void onActivityResult(int requestCode, int resultCode, android.content.Intent data) {
351355
super.onActivityResult(requestCode, resultCode, data);
352-
356+
353357
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q &&
354-
requestCode == de.yaacc.upnp.server.media.MediaProjectionHelper.REQUEST_CODE_MEDIA_PROJECTION) {
355-
358+
requestCode == de.yaacc.upnp.server.media.MediaProjectionHelper.REQUEST_CODE_MEDIA_PROJECTION) {
359+
356360
if (de.yaacc.upnp.server.media.MediaProjectionHelper.handlePermissionResult(requireContext(), resultCode, data)) {
357361
// Permission granted - enable only the button that requested it
358362
YaaccLogger.i(getClass().getName(), "MediaProjection permission granted");
359-
363+
360364
android.content.SharedPreferences prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(requireContext());
361365
android.content.SharedPreferences.Editor editor = prefs.edit();
362-
366+
363367
// Enable only the button that requested permission
364368
if (de.yaacc.browser.BrowseDeviceAdapter.isPendingAudioRequest()) {
365369
editor.putBoolean(getString(R.string.settings_local_server_serve_system_audio_chkbx), true);
@@ -370,26 +374,26 @@ public void onActivityResult(int requestCode, int resultCode, android.content.In
370374
de.yaacc.browser.BrowseDeviceAdapter.setVideoStreaming(true);
371375
}
372376
editor.apply();
373-
377+
374378
// Clear pending flags
375379
de.yaacc.browser.BrowseDeviceAdapter.clearPendingRequests();
376-
380+
377381
// Refresh the adapter to update button states
378382
if (bDeviceAdapter != null) {
379383
bDeviceAdapter.notifyDataSetChanged();
380384
}
381385
} else {
382386
// Permission denied - disable both and clear pending
383387
YaaccLogger.w(getClass().getName(), "MediaProjection permission denied");
384-
388+
385389
de.yaacc.browser.BrowseDeviceAdapter.clearPendingRequests();
386-
390+
387391
android.content.SharedPreferences prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(requireContext());
388392
prefs.edit()
389-
.putBoolean(getString(R.string.settings_local_server_serve_system_audio_chkbx), false)
390-
.putBoolean(getString(R.string.settings_local_server_serve_screen_cast_chkbx), false)
391-
.apply();
392-
393+
.putBoolean(getString(R.string.settings_local_server_serve_system_audio_chkbx), false)
394+
.putBoolean(getString(R.string.settings_local_server_serve_screen_cast_chkbx), false)
395+
.apply();
396+
393397
// Update adapter state
394398
if (bDeviceAdapter != null) {
395399
de.yaacc.browser.BrowseDeviceAdapter.setAudioStreaming(false);

yaacc/src/main/java/de/yaacc/upnp/server/YaaccUpnpServerService.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
import de.yaacc.upnp.server.media.SystemAudioCaptureService;
9898
import de.yaacc.upnp.server.renderingcontrol.YaaccAudioRenderingControlService;
9999
import de.yaacc.util.InterfaceResolutionHelper;
100+
import de.yaacc.util.InterfaceResolutionHelper.InterfaceHolder;
100101
import de.yaacc.util.NotificationId;
101102
import de.yaacc.util.SAFCacheManager;
102103
import de.yaacc.util.YaaccLogger;
@@ -230,6 +231,25 @@ public int onStartCommand(Intent intent, int flags, int startId) {
230231
// App is active when service starts
231232
networkDeviceListener.setAppInForeground(true);
232233

234+
// Trigger UPnP discovery when service starts
235+
YaaccLogger.d(getClass().getName(), "Triggering UPnP discovery on service start");
236+
if (networkDeviceListener.isInitalized()) {
237+
new Thread(() -> {
238+
try {
239+
Thread.sleep(1000); // Wait a bit for network to stabilize
240+
UpnpClient client = ((Yaacc) getApplicationContext()).getUpnpClient();
241+
if (client != null && client.isInitialized()) {
242+
client.searchDevices();
243+
YaaccLogger.d(getClass().getName(), "UPnP discovery triggered");
244+
}
245+
} catch (Exception e) {
246+
YaaccLogger.e(getClass().getName(), "Error triggering UPnP discovery", e);
247+
}
248+
}).start();
249+
} else {
250+
YaaccLogger.w(getClass().getName(), "NetworkDeviceListener not initialized, discovery will be triggered when network becomes available");
251+
}
252+
233253
locaDeviceUuid = preferences.getString(getApplicationContext().getString(R.string.settings_local_device_uuid_key), null);
234254
if (locaDeviceUuid == null) {
235255
locaDeviceUuid = UUID.randomUUID().toString();
@@ -332,6 +352,18 @@ private void showNotification() {
332352
statusBuilder.append("⚠ HTTP");
333353
}
334354

355+
// Network interface info
356+
if (networkDeviceListener != null && networkDeviceListener.isInitalized()) {
357+
try {
358+
InterfaceHolder iface = InterfaceResolutionHelper.getNetworkInterface(this);
359+
if (iface.inetAddress != null && iface.networkInterface != null) {
360+
statusBuilder.append(" | ").append(iface.networkInterface.getName()).append(":").append(iface.inetAddress.getHostAddress());
361+
}
362+
} catch (Exception e) {
363+
YaaccLogger.d(getClass().getName(), "Failed to get network interface info", e);
364+
}
365+
}
366+
335367
// Server/Renderer status
336368
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
337369
boolean serverEnabled = preferences.getBoolean(getString(R.string.settings_local_server_chkbx), false);
@@ -565,7 +597,7 @@ private void createUpnpDevice() {
565597
// Register BOTH devices as separate top-level devices
566598
registry.addDevice(serverDevice);
567599
registry.addDevice(rendererDevice);
568-
600+
569601
localDevice = serverDevice; // Track server device for reference
570602
} else {
571603
// Single device type
@@ -1259,7 +1291,7 @@ private void startCombinedCapture() {
12591291
return;
12601292
}
12611293

1262-
android.media.projection.MediaProjection projection = MediaProjectionHelper.getMediaProjection();
1294+
MediaProjection projection = MediaProjectionHelper.getMediaProjection();
12631295

12641296
if (projection == null) {
12651297
YaaccLogger.w(getClass().getName(), "Cannot start combined capture: no MediaProjection");

yaacc/src/main/java/de/yaacc/util/InterfaceResolutionHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public static String[] getIfAndIpAddress(Context context) {
103103
public static InterfaceHolder getNetworkInterface(Context context) {
104104
InterfaceHolder result = new InterfaceHolder();
105105
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
106-
List<String> interfaces = new ArrayList<>(List.of(preferences.getString(context.getString(R.string.settings_local_server_if_filter_key), "lo,dummy,rmnet,ccmni").split(",")));
106+
List<String> interfaces = new ArrayList<>(List.of(preferences.getString(context.getString(R.string.settings_upnp_if_filter_key), "lo,dummy,rmnet,ccmni,tun").split(",")));
107107
interfaces.remove(""); //remove empty string, if there, otherwise we got into trouble finding an network interface in code below
108108
try {
109109
for (Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); networkInterfaces.hasMoreElements(); ) {

yaacc/src/main/res/values-de/setting_strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<string name="settings_default_duration">Standardanzeigedauer</string>
4343
<string name="settings_silence_duration">Pausendauer</string>
4444
<string name="settings_local_server_title">Lokale Serverkonfiguration</string>
45+
<string name="settings_upnp_server_title">UPnP-Server und Netzwerk</string>
4546
<string name="settings_local_server_activation_title">Lokaler Serverstatus</string>
4647
<string name="settings_local_server_started">Lokaler server ist gestartet</string>
4748
<string name="settings_local_server_stopped">Lokaler server ist gestoppt</string>
@@ -111,4 +112,5 @@
111112
<string name="settings_local_server_serve_screen_cast_title">Screencast-Stream</string>
112113
<string name="settings_local_server_serve_screen_cast_off">Die Bildschirmübertragung ist deaktiviert.</string>
113114
<string name="settings_local_server_serve_screen_cast_on">Bildschirmübertragung ist aktiviert</string>
115+
<string name="settings_upnp_if_filter_names">Sperrliste für die UPnP-Netzwerkschnittstellenerkennung</string>
114116
</resources>

yaacc/src/main/res/values-de/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@
3838
<string name="error_upnp_generic">Während des Überfliegens ist ein Fehler aufgetreten </string>
3939
<string name="error_upnp_specific">Es ist folgender Fehler aufgetreten:</string>
4040
<string name="error_no_receiver_device_found">Kein Empfänger gefunden</string>
41+
<string name="error_no_receiver_selected">Es ist kein Empfängergerät ausgewählt. Bitte wählen Sie zuerst einen Empfänger im Reiter „Empfänger“ aus.</string>
4142
<string name="error_no_activity_found">Keine Aktivität zum Abspielen vom Typ \'%1$s\' gefunden</string>
4243
<string name="image_viewer_settings_duration">Dauer der Bildanzeige</string>
4344
<string name="no_valid_uri_data_found_to_display">Keine gültigen Uri-Informationen zum Anzeigen gefunden</string>
4445
<string name="play">spiele</string>
4546
<string name="stop">stoppe</string>
4647
<string name="pause">pausiere</string>
4748
<string name="previous">vorheriges</string>
49+
<string name="image_viewer_content_description">Bild</string>
4850
<string name="next">nächstes</string>
4951
<string name="exit">Beenden</string>
5052
<string name="musicActivityImageView">Albumbild</string>

yaacc/src/main/res/values-es/setting_strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<string name="settings_browse_load_threads_summ">Configure la cantidad de subprocesos utilizados para cargar contenido desde el servidor UPnP. Más subprocesos provocan una carga más rápida pero aumentan la posibilidad de errores. Los cambios entran en vigor después del reinicio de yaacc.</string>
5858
<string name="settings_no_content_found">no se encontró contenido para navegar</string>
5959
<string name="settings_local_server_title">configuración del servidor local</string>
60+
<string name="settings_upnp_server_title">Servidor UPnP y redes</string>
6061
<string name="settings_local_server_activation_title">estado del servidor local</string>
6162
<string name="settings_local_server_started">se inicia el servidor local</string>
6263
<string name="settings_local_server_stopped">el servidor local está detenido</string>
@@ -111,4 +112,5 @@
111112
<string name="settings_local_server_serve_screen_cast_title">transmisión de pantalla</string>
112113
<string name="settings_local_server_serve_screen_cast_off">La transmisión de pantalla está deshabilitada</string>
113114
<string name="settings_local_server_serve_screen_cast_on">La transmisión de pantalla está habilitada</string>
115+
<string name="settings_upnp_if_filter_names">Interfaces incluidas en la lista negra para la detección de interfaces de red UPnP</string>
114116
</resources>

yaacc/src/main/res/values-es/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
<string name="error_upnp_generic">Ocurrió un error desconocido mientras navegaba</string>
3939
<string name="error_upnp_specific">Se produjo el siguiente error:</string>
4040
<string name="error_no_receiver_device_found">No se encontró ningún dispositivo receptor</string>
41+
<string name="error_no_receiver_selected">No se ha seleccionado ningún dispositivo receptor. Seleccione primero un receptor en la pestaña Receptor.</string>
4142
<string name="error_no_activity_found">No se encontró actividad para jugar tipo MIME \'%1$s\'</string>
4243
<string name="image_viewer_settings_duration">Duración de la estancia de la foto</string>
4344
<string name="yaacc_menu_settings">Configuración de YAACC</string>
@@ -47,6 +48,7 @@
4748
<string name="stop">detener</string>
4849
<string name="pause">pausa</string>
4950
<string name="previous">Previo</string>
51+
<string name="image_viewer_content_description">Imagen</string>
5052
<string name="next">próximo</string>
5153
<string name="exit">Salida</string>
5254
<string name="title_activity_music_player">reproductor de música yaac</string>

yaacc/src/main/res/values-fr/setting_strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<string name="settings_browse_load_threads_summ">Configurez le nombre de threads utilisés pour charger le contenu à partir du serveur UPnP. Plus de threads entraînent un chargement plus rapide mais augmentent le risque d\'erreurs. Les modifications prennent effet après le redémarrage de yaacc.</string>
5858
<string name="settings_no_content_found">aucun contenu trouvé pour la navigation</string>
5959
<string name="settings_local_server_title">configuration du serveur local</string>
60+
<string name="settings_upnp_server_title">Serveur UPnP et réseau</string>
6061
<string name="settings_local_server_activation_title">état du serveur local</string>
6162
<string name="settings_local_server_started">le serveur local est démarré</string>
6263
<string name="settings_local_server_stopped">le serveur local est arrêté</string>
@@ -111,4 +112,5 @@
111112
<string name="settings_local_server_serve_screen_cast_title">flux de diffusion d\'écran</string>
112113
<string name="settings_local_server_serve_screen_cast_off">La diffusion d\'écran est désactivée.</string>
113114
<string name="settings_local_server_serve_screen_cast_on">La diffusion d\'écran est activée</string>
115+
<string name="settings_upnp_if_filter_names">interfaces mises sur liste noire pour la découverte d\'interfaces réseau UPnP</string>
114116
</resources>

yaacc/src/main/res/values-fr/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
<string name="error_upnp_generic">Une erreur inconnue s\'est produite lors de la navigation</string>
3939
<string name="error_upnp_specific">L\'erreur suivante s\'est produite :</string>
4040
<string name="error_no_receiver_device_found">Aucun appareil récepteur trouvé</string>
41+
<string name="error_no_receiver_selected">Aucun périphérique récepteur n\'est sélectionné. Veuillez d\'abord sélectionner un récepteur dans l\'onglet Récepteur.</string>
4142
<string name="error_no_activity_found">Aucune activité trouvée pour la lecture du type MIME \'%1$s\'</string>
4243
<string name="image_viewer_settings_duration">Durée du séjour photo</string>
4344
<string name="yaacc_menu_settings">Paramètres YAACC</string>
@@ -47,6 +48,7 @@
4748
<string name="stop">arrêt</string>
4849
<string name="pause">pause</string>
4950
<string name="previous">précédent</string>
51+
<string name="image_viewer_content_description">Image</string>
5052
<string name="next">suivant</string>
5153
<string name="exit">Sortie</string>
5254
<string name="title_activity_music_player">Lecteur de musique YAACC</string>

0 commit comments

Comments
 (0)