Skip to content

Commit

Permalink
issue #93 allow volume control using hardware buttons
Browse files Browse the repository at this point in the history
  • Loading branch information
tobexyz committed Jan 27, 2024
1 parent 6d79de0 commit 1f39588
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 47 deletions.
69 changes: 44 additions & 25 deletions yaacc/src/main/java/de/yaacc/browser/TabBrowserActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;

Expand Down Expand Up @@ -106,6 +107,7 @@ public class TabBrowserActivity extends AppCompatActivity implements OnClickList


private Intent serverService = null;
private Toast volumeToast = null;

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
Expand Down Expand Up @@ -246,8 +248,9 @@ private PlayableItem createPlayableItem(Uri uri) {
}
String uriString = uri.toString();
final String title = "shared with yaacc with ♥";
try (MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever()) {

//auto closeable requires Android code level 29 current min level is 27
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
try {
try {
metaRetriever.setDataSource(uriString);
String duration = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
Expand All @@ -272,6 +275,8 @@ private PlayableItem createPlayableItem(Uri uri) {
}
item.setUri(uri);
item.setTitle(title);
} finally {
metaRetriever.close();
}
return item;
}
Expand Down Expand Up @@ -411,41 +416,55 @@ public void onClick(View view) {

}

private Toast createVolumeToast(Drawable icon) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.toast_custom));
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
layout.setBackgroundColor(typedValue.data);
ImageView imageView = (ImageView) layout.findViewById(R.id.customToastImageView);
imageView.setImageDrawable(icon);
TextView text = (TextView) layout.findViewById(R.id.customToastTextView);
text.setText("");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
return toast;
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (KeyEvent.KEYCODE_VOLUME_UP == keyCode || KeyEvent.KEYCODE_VOLUME_DOWN == keyCode) {
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());
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.toast_custom));
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
layout.setBackgroundColor(typedValue.data);
ImageView imageView = (ImageView) layout.findViewById(R.id.customToastImageView);
imageView.setImageDrawable(icon);
TextView text = (TextView) layout.findViewById(R.id.customToastTextView);
text.setText("");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
toast.show();
}
upnpClient.getCurrentPlayers().forEach(p -> {
if (p.hasActionGetVolume())
upnpClient.getReceiverDevices().forEach(d -> {
if (upnpClient.hasActionGetVolume(d))
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
if (p.getVolume() < 100) {
p.setVolume(p.getVolume() + 1);
if (upnpClient.getVolume(d) < 100) {
upnpClient.setVolume(d, upnpClient.getVolume(d) + 1);
}
break;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (p.getVolume() > 0) {
p.setVolume(p.getVolume() - 1);
if (upnpClient.getVolume(d) > 0) {
upnpClient.setVolume(d, upnpClient.getVolume(d) - 1);
}
break;
}
});
if (!upnpClient.getReceiverDevices().isEmpty()) {
if (KeyEvent.KEYCODE_VOLUME_UP == keyCode || KeyEvent.KEYCODE_VOLUME_DOWN == keyCode) {
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());
if (volumeToast != null) {
volumeToast.cancel();
}
volumeToast = createVolumeToast(icon);
volumeToast.show();
}
if (viewPager != null && tabLayout != null && tabLayout.getSelectedTabPosition() == BrowserTabs.RECEIVER.ordinal() && tabLayout.getTabAt(tabLayout.getSelectedTabPosition()).view != null) {
((RecyclerView) getSupportFragmentManager().getFragments().get(viewPager.getCurrentItem()).getView().findViewById(R.id.receiverList)).getAdapter().notifyDataSetChanged();
}
}


return super.onKeyDown(keyCode, event);
}
}
38 changes: 23 additions & 15 deletions yaacc/src/main/java/de/yaacc/player/AVTransportPlayerActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ public class AVTransportPlayerActivity extends AppCompatActivity implements Serv
private int playerId;

private AVTransportController player;
private Toast volumeToast;

public void onServiceConnected(ComponentName className, IBinder binder) {
if (binder instanceof PlayerService.PlayerServiceBinder) {
Expand Down Expand Up @@ -149,25 +150,32 @@ public boolean onKeyDown(int keyCode, KeyEvent event) {
}
SeekBar volumeSeekBar = (SeekBar) findViewById(R.id.avtransportPlayerActivityControlVolumeSeekBar);
volumeSeekBar.setProgress(getPlayer().getVolume());

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.toast_custom));
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
layout.setBackgroundColor(typedValue.data);
ImageView imageView = (ImageView) layout.findViewById(R.id.customToastImageView);
imageView.setImageDrawable(icon);
TextView text = (TextView) layout.findViewById(R.id.customToastTextView);
text.setText("" + getPlayer().getVolume());
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
toast.show();
if (volumeToast != null) {
volumeToast.cancel();
}
volumeToast = createVolumeToast(icon, getPlayer().getVolume());
volumeToast.show();
}
return super.onKeyDown(keyCode, event);
}

private Toast createVolumeToast(Drawable icon, int volume) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.toast_custom));
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
layout.setBackgroundColor(typedValue.data);
ImageView imageView = (ImageView) layout.findViewById(R.id.customToastImageView);
imageView.setImageDrawable(icon);
TextView text = (TextView) layout.findViewById(R.id.customToastTextView);
text.setText("" + volume);
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
return toast;
}

@Override
protected void onDestroy() {
super.onDestroy();
Expand Down
8 changes: 1 addition & 7 deletions yaacc/src/main/java/de/yaacc/upnp/UpnpClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -1005,13 +1005,7 @@ private void setReceiverDeviceIds(Set<String> receiverDeviceIds) {
*/
public Collection<Device<?, ?, ?>> getReceiverDevices() {
ArrayList<Device<?, ?, ?>> result = new ArrayList<>();
ArrayList<String> unknowsIds = new ArrayList<>(); // Maybe the the
// receiverDevice
// in the
// preferences
// isn't
// available any
// more
ArrayList<String> unknowsIds = new ArrayList<>();
Set<String> receiverDeviceIds = getReceiverDeviceIds();
for (String id : receiverDeviceIds) {
Device<?, ?, ?> receiver = this.getDevice(id);
Expand Down

0 comments on commit 1f39588

Please sign in to comment.