mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Move media session related code out of MainActivity
This commit is contained in:
parent
dd63ba425f
commit
0bbacdda0c
2 changed files with 151 additions and 117 deletions
|
@ -7,16 +7,9 @@ package org.mozilla.servo;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.NotificationChannel;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.system.ErrnoException;
|
import android.system.ErrnoException;
|
||||||
import android.system.Os;
|
import android.system.Os;
|
||||||
|
@ -30,6 +23,7 @@ import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.mozilla.servo.MediaSession;
|
||||||
import org.mozilla.servoview.ServoView;
|
import org.mozilla.servoview.ServoView;
|
||||||
import org.mozilla.servoview.Servo;
|
import org.mozilla.servoview.Servo;
|
||||||
|
|
||||||
|
@ -37,24 +31,7 @@ import java.io.File;
|
||||||
|
|
||||||
public class MainActivity extends Activity implements Servo.Client {
|
public class MainActivity extends Activity implements Servo.Client {
|
||||||
|
|
||||||
private class NotificationID {
|
|
||||||
private int lastID = 0;
|
|
||||||
public int getNext() {
|
|
||||||
lastID++;
|
|
||||||
return lastID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int get() {
|
|
||||||
return lastID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String LOGTAG = "MainActivity";
|
private static final String LOGTAG = "MainActivity";
|
||||||
private static final String MEDIA_CHANNEL_ID = "MediaNotificationChannel";
|
|
||||||
private static final String KEY_MEDIA_PAUSE = "org.mozilla.servoview.MainActivity.pause";
|
|
||||||
private static final String KEY_MEDIA_PREV = "org.mozilla.servoview.MainActivity.prev";
|
|
||||||
private static final String KEY_MEDIA_NEXT = "org.mozilla.servoview.MainActivity.next";
|
|
||||||
private static final String KEY_MEDIA_STOP = "org.mozilla.servoview.MainActivity.stop";
|
|
||||||
|
|
||||||
ServoView mServoView;
|
ServoView mServoView;
|
||||||
Button mBackButton;
|
Button mBackButton;
|
||||||
|
@ -65,8 +42,7 @@ public class MainActivity extends Activity implements Servo.Client {
|
||||||
ProgressBar mProgressBar;
|
ProgressBar mProgressBar;
|
||||||
TextView mIdleText;
|
TextView mIdleText;
|
||||||
boolean mCanGoBack;
|
boolean mCanGoBack;
|
||||||
NotificationID mNotificationID;
|
MediaSession mMediaSession;
|
||||||
BroadcastReceiver mMediaSessionActionReceiver;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -109,16 +85,12 @@ public class MainActivity extends Activity implements Servo.Client {
|
||||||
mServoView.loadUri(intent.getData());
|
mServoView.loadUri(intent.getData());
|
||||||
}
|
}
|
||||||
setupUrlField();
|
setupUrlField();
|
||||||
|
|
||||||
mNotificationID = new NotificationID();
|
|
||||||
createMediaNotificationChannel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
Log.d("SERVOMEDIA", "onDestroy");
|
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
hideMediaSessionControls();
|
mMediaSession.hideMediaSessionControls();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupUrlField() {
|
private void setupUrlField() {
|
||||||
|
@ -257,103 +229,25 @@ public class MainActivity extends Activity implements Servo.Client {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMediaSessionMetadata(String title, String artist, String album) {
|
public void onMediaSessionMetadata(String title, String artist, String album) {
|
||||||
|
if (mMediaSession == null) {
|
||||||
|
mMediaSession = new MediaSession(mServoView, this, getApplicationContext());
|
||||||
|
}
|
||||||
Log.d("SERVOMEDIA", "METADATA");
|
Log.d("SERVOMEDIA", "METADATA");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMediaSessionPlaybackStateChange(int state) {
|
public void onMediaSessionPlaybackStateChange(int state) {
|
||||||
|
if (mMediaSession == null) {
|
||||||
|
mMediaSession = new MediaSession(mServoView, this, getApplicationContext());
|
||||||
|
}
|
||||||
Log.d("SERVOMEDIA", "PLAYBACK STATE CHANGED " + state);
|
Log.d("SERVOMEDIA", "PLAYBACK STATE CHANGED " + state);
|
||||||
if (state == 1 /* none */) {
|
if (state == 1 /* none */) {
|
||||||
hideMediaSessionControls();
|
mMediaSession.hideMediaSessionControls();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (state == 2 /* playing */) {
|
if (state == 2 /* playing */) {
|
||||||
showMediaSessionControls();
|
mMediaSession.showMediaSessionControls();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createMediaNotificationChannel() {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
CharSequence name = getString(R.string.media_channel_name);
|
|
||||||
String description = getString(R.string.media_channel_description);
|
|
||||||
int importance = NotificationManager.IMPORTANCE_DEFAULT;
|
|
||||||
NotificationChannel channel = new NotificationChannel(MEDIA_CHANNEL_ID, name, importance);
|
|
||||||
channel.setDescription(description);
|
|
||||||
NotificationManager notificationManager = getSystemService(NotificationManager.class);
|
|
||||||
notificationManager.createNotificationChannel(channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showMediaSessionControls() {
|
|
||||||
Context context = getApplicationContext();
|
|
||||||
|
|
||||||
IntentFilter filter = new IntentFilter();
|
|
||||||
filter.addAction(KEY_MEDIA_PAUSE);
|
|
||||||
filter.addAction(KEY_MEDIA_STOP);
|
|
||||||
filter.addAction(KEY_MEDIA_PREV);
|
|
||||||
filter.addAction(KEY_MEDIA_NEXT);
|
|
||||||
|
|
||||||
mMediaSessionActionReceiver = new BroadcastReceiver() {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
if (intent.getAction().equals(KEY_MEDIA_PAUSE)) {
|
|
||||||
Log.d("SERVOMEDIA", "PAUSE");
|
|
||||||
} else if (intent.getAction().equals(KEY_MEDIA_STOP)) {
|
|
||||||
Log.d("SERVOMEDIA", "STOP");
|
|
||||||
} else if (intent.getAction().equals(KEY_MEDIA_NEXT)) {
|
|
||||||
Log.d("SERVOMEDIA", "NEXT");
|
|
||||||
} else if (intent.getAction().equals(KEY_MEDIA_PREV)) {
|
|
||||||
Log.d("SERVOMEDIA", "PREV");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
registerReceiver(mMediaSessionActionReceiver, filter);
|
|
||||||
|
|
||||||
Intent pauseIntent = new Intent(KEY_MEDIA_PAUSE);
|
|
||||||
Notification.Action pauseAction =
|
|
||||||
new Notification.Action(R.drawable.media_session_pause, "Pause",
|
|
||||||
PendingIntent.getBroadcast(context, 0, pauseIntent, 0));
|
|
||||||
|
|
||||||
Intent nextIntent = new Intent(KEY_MEDIA_NEXT);
|
|
||||||
Notification.Action nextAction =
|
|
||||||
new Notification.Action(R.drawable.media_session_next, "Next",
|
|
||||||
PendingIntent.getBroadcast(context, 0, nextIntent, 0));
|
|
||||||
|
|
||||||
Intent prevIntent = new Intent(KEY_MEDIA_PREV);
|
|
||||||
Notification.Action prevAction =
|
|
||||||
new Notification.Action(R.drawable.media_session_prev, "Previous",
|
|
||||||
PendingIntent.getBroadcast(context, 0, prevIntent, 0));
|
|
||||||
|
|
||||||
Intent stopIntent = new Intent(KEY_MEDIA_STOP);
|
|
||||||
Notification.Action stopAction =
|
|
||||||
new Notification.Action(R.drawable.media_session_stop, "Stop",
|
|
||||||
PendingIntent.getBroadcast(context, 0, stopIntent, 0));
|
|
||||||
|
|
||||||
Notification.Builder builder = new Notification.Builder(context, this.MEDIA_CHANNEL_ID);
|
|
||||||
builder
|
|
||||||
.setSmallIcon(R.drawable.media_session_icon)
|
|
||||||
.setContentTitle("This is the notification title")
|
|
||||||
.setVisibility(Notification.VISIBILITY_PUBLIC)
|
|
||||||
.addAction(prevAction)
|
|
||||||
.addAction(pauseAction)
|
|
||||||
.addAction(nextAction)
|
|
||||||
.addAction(stopAction)
|
|
||||||
.setStyle(new Notification.MediaStyle()
|
|
||||||
.setShowActionsInCompactView(1 /* pause button */ )
|
|
||||||
.setShowActionsInCompactView(3 /* stop button */));
|
|
||||||
|
|
||||||
NotificationManager notificationManager = getSystemService(NotificationManager.class);
|
|
||||||
notificationManager.notify(mNotificationID.getNext(), builder.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void hideMediaSessionControls() {
|
|
||||||
Log.d("SERVOMEDIA", "hideMediaSessionControls");
|
|
||||||
NotificationManager notificationManager = getSystemService(NotificationManager.class);
|
|
||||||
notificationManager.cancel(mNotificationID.get());
|
|
||||||
unregisterReceiver(mMediaSessionActionReceiver);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.servo;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.mozilla.servoview.ServoView;
|
||||||
|
|
||||||
|
public class MediaSession {
|
||||||
|
private class NotificationID {
|
||||||
|
private int lastID = 0;
|
||||||
|
public int getNext() {
|
||||||
|
lastID++;
|
||||||
|
return lastID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int get() {
|
||||||
|
return lastID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String MEDIA_CHANNEL_ID = "MediaNotificationChannel";
|
||||||
|
private static final String KEY_MEDIA_PAUSE = "org.mozilla.servoview.MainActivity.pause";
|
||||||
|
private static final String KEY_MEDIA_PREV = "org.mozilla.servoview.MainActivity.prev";
|
||||||
|
private static final String KEY_MEDIA_NEXT = "org.mozilla.servoview.MainActivity.next";
|
||||||
|
private static final String KEY_MEDIA_STOP = "org.mozilla.servoview.MainActivity.stop";
|
||||||
|
|
||||||
|
ServoView mView;
|
||||||
|
MainActivity mActivity;
|
||||||
|
Context mContext;
|
||||||
|
NotificationID mNotificationID;
|
||||||
|
BroadcastReceiver mMediaSessionActionReceiver;
|
||||||
|
|
||||||
|
public MediaSession(ServoView view, MainActivity activity, Context context) {
|
||||||
|
mView = view;
|
||||||
|
mActivity = activity;
|
||||||
|
mContext = context;
|
||||||
|
mNotificationID = new NotificationID();
|
||||||
|
createMediaNotificationChannel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createMediaNotificationChannel() {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
CharSequence name =
|
||||||
|
mContext.getResources().getString(R.string.media_channel_name);
|
||||||
|
String description =
|
||||||
|
mContext.getResources().getString(R.string.media_channel_description);
|
||||||
|
int importance = NotificationManager.IMPORTANCE_DEFAULT;
|
||||||
|
NotificationChannel channel =
|
||||||
|
new NotificationChannel(MEDIA_CHANNEL_ID, name, importance);
|
||||||
|
channel.setDescription(description);
|
||||||
|
NotificationManager notificationManager =
|
||||||
|
mContext.getSystemService(NotificationManager.class);
|
||||||
|
notificationManager.createNotificationChannel(channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showMediaSessionControls() {
|
||||||
|
IntentFilter filter = new IntentFilter();
|
||||||
|
filter.addAction(KEY_MEDIA_PAUSE);
|
||||||
|
filter.addAction(KEY_MEDIA_STOP);
|
||||||
|
filter.addAction(KEY_MEDIA_PREV);
|
||||||
|
filter.addAction(KEY_MEDIA_NEXT);
|
||||||
|
|
||||||
|
mMediaSessionActionReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
if (intent.getAction().equals(KEY_MEDIA_PAUSE)) {
|
||||||
|
Log.d("SERVOMEDIA", "PAUSE");
|
||||||
|
} else if (intent.getAction().equals(KEY_MEDIA_STOP)) {
|
||||||
|
Log.d("SERVOMEDIA", "STOP");
|
||||||
|
} else if (intent.getAction().equals(KEY_MEDIA_NEXT)) {
|
||||||
|
Log.d("SERVOMEDIA", "NEXT");
|
||||||
|
} else if (intent.getAction().equals(KEY_MEDIA_PREV)) {
|
||||||
|
Log.d("SERVOMEDIA", "PREV");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
mContext.registerReceiver(mMediaSessionActionReceiver, filter);
|
||||||
|
|
||||||
|
Intent pauseIntent = new Intent(KEY_MEDIA_PAUSE);
|
||||||
|
Notification.Action pauseAction =
|
||||||
|
new Notification.Action(R.drawable.media_session_pause, "Pause",
|
||||||
|
PendingIntent.getBroadcast(mContext, 0, pauseIntent, 0));
|
||||||
|
|
||||||
|
Intent nextIntent = new Intent(KEY_MEDIA_NEXT);
|
||||||
|
Notification.Action nextAction =
|
||||||
|
new Notification.Action(R.drawable.media_session_next, "Next",
|
||||||
|
PendingIntent.getBroadcast(mContext, 0, nextIntent, 0));
|
||||||
|
|
||||||
|
Intent prevIntent = new Intent(KEY_MEDIA_PREV);
|
||||||
|
Notification.Action prevAction =
|
||||||
|
new Notification.Action(R.drawable.media_session_prev, "Previous",
|
||||||
|
PendingIntent.getBroadcast(mContext, 0, prevIntent, 0));
|
||||||
|
|
||||||
|
Intent stopIntent = new Intent(KEY_MEDIA_STOP);
|
||||||
|
Notification.Action stopAction =
|
||||||
|
new Notification.Action(R.drawable.media_session_stop, "Stop",
|
||||||
|
PendingIntent.getBroadcast(mContext, 0, stopIntent, 0));
|
||||||
|
|
||||||
|
Notification.Builder builder = new Notification.Builder(mContext, this.MEDIA_CHANNEL_ID);
|
||||||
|
builder
|
||||||
|
.setSmallIcon(R.drawable.media_session_icon)
|
||||||
|
.setContentTitle("This is the notification title")
|
||||||
|
.setVisibility(Notification.VISIBILITY_PUBLIC)
|
||||||
|
.addAction(prevAction)
|
||||||
|
.addAction(pauseAction)
|
||||||
|
.addAction(nextAction)
|
||||||
|
.addAction(stopAction)
|
||||||
|
.setStyle(new Notification.MediaStyle()
|
||||||
|
.setShowActionsInCompactView(1 /* pause button */ )
|
||||||
|
.setShowActionsInCompactView(3 /* stop button */));
|
||||||
|
|
||||||
|
NotificationManager notificationManager =
|
||||||
|
mContext.getSystemService(NotificationManager.class);
|
||||||
|
notificationManager.notify(mNotificationID.getNext(), builder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideMediaSessionControls() {
|
||||||
|
Log.d("SERVOMEDIA", "hideMediaSessionControls");
|
||||||
|
NotificationManager notificationManager =
|
||||||
|
mContext.getSystemService(NotificationManager.class);
|
||||||
|
notificationManager.cancel(mNotificationID.get());
|
||||||
|
mContext.unregisterReceiver(mMediaSessionActionReceiver);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue