Skip to content

Commit 98abc79

Browse files
authored
Merge pull request #197 from tobexyz/feat/issue105
Feat/issue105
2 parents 44df45b + b41e6ec commit 98abc79

32 files changed

Lines changed: 2478 additions & 1074 deletions

yaacc/build.gradle

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ apply plugin: 'com.android.application'
1111

1212
dependencies {
1313

14+
configurations.all {
15+
resolutionStrategy {
16+
force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.10'
17+
force 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.10'
18+
force 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10'
19+
}
20+
}
21+
1422
testImplementation 'junit:junit:4.13.2'
1523
testImplementation 'org.mockito:mockito-core:4.11.0'
1624
testImplementation 'com.tngtech.junit.dataprovider:junit4-dataprovider:2.10'
@@ -24,6 +32,13 @@ dependencies {
2432
implementation 'androidx.appcompat:appcompat:1.5.1'
2533
implementation 'androidx.preference:preference:1.1.0'
2634
implementation 'androidx.media:media:1.6.0'
35+
implementation 'androidx.media3:media3-session:1.2.0'
36+
implementation 'androidx.media3:media3-exoplayer:1.2.0'
37+
implementation 'androidx.media3:media3-ui:1.2.0'
38+
implementation('androidx.mediarouter:mediarouter:1.6.0') {
39+
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
40+
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
41+
}
2742
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
2843
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1'
2944
implementation 'org.mp4parser:isoparser:1.9.56'
@@ -33,7 +48,7 @@ dependencies {
3348
}
3449

3550
android {
36-
compileSdk 33
51+
compileSdk 34
3752

3853

3954
sourceSets {

yaacc/src/main/AndroidManifest.xml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,15 @@
6161
</intent-filter>
6262
</activity>
6363

64-
6564
<service
6665
android:name=".player.PlayerService"
6766
android:enabled="true"
68-
android:exported="false" />
69-
<service
70-
android:name=".musicplayer.BackgroundMusicService"
71-
android:enabled="true" />
67+
android:exported="false"
68+
android:foregroundServiceType="mediaPlayback">
69+
<intent-filter>
70+
<action android:name="androidx.media3.session.MediaSessionService" />
71+
</intent-filter>
72+
</service>
7273
<service
7374
android:name=".upnp.server.YaaccUpnpServerService"
7475
android:enabled="true"

yaacc/src/main/java/de/yaacc/Yaacc.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import android.os.BatteryManager;
3131
import android.os.CountDownTimer;
3232
import android.os.PowerManager;
33-
import de.yaacc.util.YaaccLogger;
3433

3534
import androidx.appcompat.app.AppCompatDelegate;
3635
import androidx.core.app.NotificationCompat;
@@ -43,11 +42,9 @@
4342
import java.util.stream.Collectors;
4443

4544
import de.yaacc.browser.TabBrowserActivity;
46-
import de.yaacc.musicplayer.BackgroundMusicService;
4745
import de.yaacc.player.PlayerService;
4846
import de.yaacc.upnp.UpnpClient;
4947
import de.yaacc.upnp.server.YaaccUpnpServerService;
50-
import de.yaacc.upnp.server.renderingcontrol.YaaccAudioRenderingControlService;
5148
import de.yaacc.util.NotificationId;
5249
import de.yaacc.util.SafPermissionManager;
5350
import de.yaacc.util.ShutdownTimerListener;
@@ -92,9 +89,9 @@ public void onCreate() {
9289
// Always start with streaming disabled
9390
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
9491
preferences.edit()
95-
.putBoolean(getString(R.string.settings_local_server_serve_system_audio_chkbx), false)
96-
.putBoolean(getString(R.string.settings_local_server_serve_screen_cast_chkbx), false)
97-
.apply();
92+
.putBoolean(getString(R.string.settings_local_server_serve_system_audio_chkbx), false)
93+
.putBoolean(getString(R.string.settings_local_server_serve_screen_cast_chkbx), false)
94+
.apply();
9895
}
9996

10097
// Validate and cleanup SAF permissions on app startup
@@ -133,8 +130,6 @@ public void exit() {
133130
SharedPreferences.Editor editor = preferences.edit();
134131
proxyLinks.forEach(k -> editor.remove(k).commit());
135132
stopService(new Intent(this, PlayerService.class));
136-
stopService(new Intent(this, BackgroundMusicService.class));
137-
stopService(new Intent(this, YaaccAudioRenderingControlService.class));
138133
stopService(new Intent(this, YaaccUpnpServerService.class));
139134

140135

@@ -145,16 +140,26 @@ public void exit() {
145140
mNotificationManager.cancel(NotificationId.YAACC.getId());
146141
ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
147142
am.getAppTasks().stream().forEach(t -> t.finishAndRemoveTask());
143+
clearCache();
148144
Runtime.getRuntime().exit(0);
149145
}
150146

147+
private void clearCache() {
148+
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
149+
Set<String> tobeDeleted = preferences.getAll().keySet().stream().filter(k -> k.startsWith(getApplicationContext().getString(R.string.settings_duration_format_key))).collect(Collectors.toSet());
150+
SharedPreferences.Editor edit = preferences.edit();
151+
tobeDeleted.forEach(it -> edit.remove(it));
152+
edit.commit();
153+
}
154+
151155
public void createNotificationChannel() {
152156

153157
CharSequence name = getString(R.string.channel_name);
154158
String description = getString(R.string.channel_description);
155159
int importance = NotificationManager.IMPORTANCE_DEFAULT;
156160
NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance);
157161
channel.setDescription(description);
162+
channel.setSound(null, null);
158163

159164

160165
// Register the channel with the system; you can't change the importance

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,15 @@
1818
package de.yaacc.browser;
1919

2020
import android.content.Context;
21-
import android.view.View;
22-
import android.widget.ProgressBar;
2321
import android.content.SharedPreferences;
2422
import android.net.Uri;
2523
import android.os.AsyncTask;
26-
import de.yaacc.util.YaaccLogger;
2724
import android.view.LayoutInflater;
2825
import android.view.View;
2926
import android.view.ViewGroup;
3027
import android.widget.ImageButton;
3128
import android.widget.ImageView;
29+
import android.widget.ProgressBar;
3230
import android.widget.TextView;
3331
import android.widget.Toast;
3432

@@ -40,7 +38,6 @@
4038
import org.fourthline.cling.support.model.container.Container;
4139
import org.fourthline.cling.support.model.item.AudioItem;
4240
import org.fourthline.cling.support.model.item.ImageItem;
43-
import org.fourthline.cling.support.model.item.Item;
4441
import org.fourthline.cling.support.model.item.PlaylistItem;
4542
import org.fourthline.cling.support.model.item.TextItem;
4643
import org.fourthline.cling.support.model.item.VideoItem;
@@ -56,6 +53,7 @@
5653
import de.yaacc.Yaacc;
5754
import de.yaacc.upnp.UpnpClient;
5855
import de.yaacc.util.ThemeHelper;
56+
import de.yaacc.util.YaaccLogger;
5957
import de.yaacc.util.image.IconDownloadTask;
6058

6159
/**
@@ -133,6 +131,7 @@ public void addAll(Collection<? extends DIDLObject> newObjects) {
133131
YaaccLogger.d(getClass().getName(), "added objects; " + newObjects);
134132
int start = objects.size();
135133
List<DIDLObject> filteredObjects = newObjects.stream().filter(it -> !objects.contains(it)).collect(Collectors.toList());
134+
YaaccLogger.d(getClass().getName(), "Adding " + filteredObjects.size() + " new objects (filtered from " + newObjects.size() + " total)");
136135
objects.addAll(filteredObjects);
137136
notifyItemRangeInserted(start, filteredObjects.size());
138137
}
@@ -215,6 +214,7 @@ public void onBindViewHolder(final BrowseContentItemAdapter.ViewHolder holder, f
215214

216215
DIDLObject currentObject = (DIDLObject) getItem(listPosition);
217216
holder.name.setText(currentObject.getTitle());
217+
218218
IconDownloadTask iconDownloadTask = new IconDownloadTask(holder.icon,
219219
this);
220220
asyncTasks.add(iconDownloadTask);

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

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ public class TabBrowserActivity extends AppCompatActivity implements OnClickList
9696

9797

9898
private Intent serverService = null;
99-
private Toast volumeToast = null;
10099

101100
//https://developer.android.com/about/versions/14/changes/partial-photo-video-access
102101
private static String[] getPermissions() {
@@ -357,7 +356,6 @@ public void onResume() {
357356
long start = System.currentTimeMillis();
358357
super.onResume();
359358
viewPager.setUserInputEnabled(getPreferences().getBoolean(getString(R.string.settings_swipe_chkbx), true));
360-
setVolumeControlStream(-1000); //use an invalid audio stream to block controlling default streams
361359
boolean serverOn = getPreferences().getBoolean(
362360
getString(R.string.settings_local_server_chkbx), false);
363361
if (serverOn) {
@@ -445,63 +443,9 @@ public void onClick(View view) {
445443

446444
}
447445

448-
private Toast createVolumeToast(Drawable icon) {
449-
LayoutInflater inflater = getLayoutInflater();
450-
View layout = inflater.inflate(R.layout.custom_toast, findViewById(R.id.toast_custom));
451-
TypedValue typedValue = new TypedValue();
452-
getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
453-
layout.setBackgroundColor(typedValue.data);
454-
ImageView imageView = layout.findViewById(R.id.customToastImageView);
455-
imageView.setImageDrawable(icon);
456-
TextView text = layout.findViewById(R.id.customToastTextView);
457-
text.setText("");
458-
Toast toast = new Toast(getApplicationContext());
459-
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
460-
toast.setDuration(Toast.LENGTH_SHORT);
461-
toast.setView(layout);
462-
return toast;
463-
}
464-
465446
@Override
466447
public boolean onKeyDown(int keyCode, KeyEvent event) {
467-
upnpClient.getReceiverDevices().forEach(d -> {
468-
if (upnpClient.hasActionGetVolume(d))
469-
switch (keyCode) {
470-
case KeyEvent.KEYCODE_VOLUME_UP:
471-
if (upnpClient.getVolume(d) < 100) {
472-
upnpClient.setVolume(d, upnpClient.getVolume(d) + 1);
473-
}
474-
break;
475-
case KeyEvent.KEYCODE_VOLUME_DOWN:
476-
if (upnpClient.getVolume(d) > 0) {
477-
upnpClient.setVolume(d, upnpClient.getVolume(d) - 1);
478-
}
479-
break;
480-
}
481-
});
482-
if (!upnpClient.getReceiverDevices().isEmpty()) {
483-
if (KeyEvent.KEYCODE_VOLUME_UP == keyCode || KeyEvent.KEYCODE_VOLUME_DOWN == keyCode) {
484-
Drawable icon = keyCode == KeyEvent.KEYCODE_VOLUME_UP ? ThemeHelper.tintDrawable(getResources().getDrawable(R.drawable.ic_baseline_volume_up_96, getTheme()), getTheme()) : ThemeHelper.tintDrawable(getResources().getDrawable(R.drawable.ic_baseline_volume_down_96, getTheme()), getTheme());
485-
if (volumeToast != null) {
486-
volumeToast.cancel();
487-
}
488-
volumeToast = createVolumeToast(icon);
489-
volumeToast.show();
490-
if (viewPager != null && tabLayout != null && tabLayout.getSelectedTabPosition() == BrowserTabs.RECEIVER.ordinal() && tabLayout.getTabAt(tabLayout.getSelectedTabPosition()).view != null) {
491-
List<Fragment> fragments = getSupportFragmentManager().getFragments();
492-
if (fragments.size() > viewPager.getCurrentItem()) {
493-
RecyclerView view = fragments.get(viewPager.getCurrentItem()).getView().findViewById(R.id.receiverList);
494-
if (view != null && view.getAdapter() != null) {
495-
view.getAdapter().notifyDataSetChanged();
496-
}
497-
}
498-
}
499-
}
500-
}
501-
502-
448+
// Let system handle volume keys - shows standard Android volume UI
503449
return super.onKeyDown(keyCode, event);
504450
}
505-
506-
507451
}

yaacc/src/main/java/de/yaacc/musicplayer/BackgoundMusicServiceListener.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

yaacc/src/main/java/de/yaacc/musicplayer/BackgroundMusicBroadcastReceiver.java

Lines changed: 0 additions & 87 deletions
This file was deleted.

0 commit comments

Comments
 (0)