[mobile] support google cast - part 2

pull/123/head
FongMi 3 years ago
parent fd8f3a0b34
commit b55e8a7320
  1. 6
      app/src/main/java/com/fongmi/android/tv/bean/Device.java
  2. 2
      app/src/main/res/values/strings.xml
  3. 10
      app/src/main/res/values/styles.xml
  4. 50
      app/src/mobile/java/com/fongmi/android/tv/cast/CastDevice.java
  5. 24
      app/src/mobile/java/com/fongmi/android/tv/cast/CastOptionsProvider.java
  6. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  7. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/DeviceAdapter.java
  8. 2
      app/src/mobile/res/drawable/ic_cast_refresh.xml
  9. 2
      app/src/mobile/res/drawable/ic_cast_scan.xml
  10. 2
      app/src/mobile/res/drawable/ic_config_choose.xml
  11. 2
      app/src/mobile/res/drawable/ic_control_full.xml
  12. 2
      app/src/mobile/res/drawable/ic_control_lock_off.xml
  13. 2
      app/src/mobile/res/drawable/ic_control_lock_on.xml
  14. 2
      app/src/mobile/res/drawable/ic_view_grid.xml
  15. 2
      app/src/mobile/res/drawable/ic_view_list.xml
  16. 7
      app/src/mobile/res/layout/dialog_cast.xml
  17. 9
      app/src/mobile/res/layout/dialog_control.xml
  18. 5
      app/src/mobile/res/values/styles.xml

@ -100,16 +100,12 @@ public class Device {
return getType() == 2;
}
public boolean isCast() {
return getType() == 3;
}
public boolean isApp() {
return isLeanback() || isMobile();
}
public String getHost() {
return isDLNA() || isCast() ? getUuid() : Uri.parse(getIp()).getHost();
return isDLNA() ? getUuid() : Uri.parse(getIp()).getHost();
}
public Device save() {

@ -2,7 +2,7 @@
<!-- App -->
<string name="app_name">TV</string>
<string name="app_id">08955620</string>
<string name="app_id">EFAE7F9D</string>
<string name="app_exit">Press back again to exit</string>
<!-- Vod -->

@ -30,14 +30,4 @@
<item name="keep_content_on_player_reset">true</item>
</style>
<style name="ModalBottomSheetDialog" parent="Widget.Design.BottomSheet.Modal">
<item name="android:background">@drawable/shape_bottom_sheet</item>
</style>
<style name="ThemeOverlay.App.BottomSheetDialog" parent="Theme.MaterialComponents.DayNight.BottomSheetDialog">
<item name="bottomSheetStyle">@style/ModalBottomSheetDialog</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowIsFloating">false</item>
</style>
</resources>

@ -1,10 +1,5 @@
package com.fongmi.android.tv.cast;
import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaRouter;
import org.fourthline.cling.model.meta.Device;
import java.util.ArrayList;
@ -13,7 +8,6 @@ import java.util.List;
public class CastDevice {
private final List<Device<?, ?, ?>> devices;
private final List<MediaRouter.RouteInfo> routers;
private static class Loader {
static volatile CastDevice INSTANCE = new CastDevice();
@ -25,7 +19,6 @@ public class CastDevice {
public CastDevice() {
this.devices = new ArrayList<>();
this.routers = new ArrayList<>();
}
public boolean isEmpty() {
@ -40,39 +33,16 @@ public class CastDevice {
return device;
}
private com.fongmi.android.tv.bean.Device create(MediaRouter.RouteInfo item) {
com.fongmi.android.tv.bean.Device device = new com.fongmi.android.tv.bean.Device();
device.setName(item.getName());
device.setUuid(item.getId());
device.setType(3);
return device;
}
public List<com.fongmi.android.tv.bean.Device> getDLNA() {
public List<com.fongmi.android.tv.bean.Device> getAll() {
List<com.fongmi.android.tv.bean.Device> items = new ArrayList<>();
for (Device<?, ?, ?> item : devices) items.add(create(item));
return items;
}
public List<com.fongmi.android.tv.bean.Device> getCast() {
List<com.fongmi.android.tv.bean.Device> items = new ArrayList<>();
for (MediaRouter.RouteInfo item : routers) items.add(create(item));
return items;
}
public List<com.fongmi.android.tv.bean.Device> add(Device<?, ?, ?> item) {
devices.remove(item);
devices.add(item);
return getDLNA();
}
@SuppressLint("RestrictedApi")
public List<com.fongmi.android.tv.bean.Device> add(List<MediaRouter.RouteInfo> items) {
ArrayList<MediaRouter.RouteInfo> routes = new ArrayList<>(items);
onFilterRoutes(routes);
routers.clear();
routers.addAll(routes);
return getCast();
return getAll();
}
public com.fongmi.android.tv.bean.Device remove(Device<?, ?, ?> device) {
@ -80,22 +50,8 @@ public class CastDevice {
return create(device);
}
public Device<?, ?, ?> findDLNA(com.fongmi.android.tv.bean.Device item) {
public Device<?, ?, ?> find(com.fongmi.android.tv.bean.Device item) {
for (Device<?, ?, ?> device : devices) if (device.getIdentity().getUdn().getIdentifierString().equals(item.getUuid())) return device;
return null;
}
public MediaRouter.RouteInfo findCast(com.fongmi.android.tv.bean.Device item) {
for (MediaRouter.RouteInfo device : routers) if (device.getId().equals(item.getUuid())) return device;
return null;
}
private void onFilterRoutes(@NonNull List<MediaRouter.RouteInfo> routes) {
for (int i = routes.size(); i-- > 0; ) if (!onFilterRoute(routes.get(i))) routes.remove(i);
}
@SuppressLint("RestrictedApi")
private boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
return !route.isDefaultOrBluetooth() && route.isEnabled();
}
}

@ -6,7 +6,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.ui.activity.DetailActivity;
import com.fongmi.android.tv.ui.activity.MainActivity;
import com.google.android.gms.cast.LaunchOptions;
import com.google.android.gms.cast.MediaMetadata;
import com.google.android.gms.cast.framework.CastOptions;
@ -27,8 +27,8 @@ public class CastOptionsProvider implements OptionsProvider {
@NonNull
@Override
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder().setActions(Arrays.asList(MediaIntentReceiver.ACTION_SKIP_NEXT, MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK, MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{1, 2}).setTargetActivityClassName(DetailActivity.class.getName()).build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder().setImagePicker(new ImagePickerImpl()).setNotificationOptions(notificationOptions).setExpandedControllerActivityClassName(DetailActivity.class.getName()).build();
NotificationOptions notificationOptions = new NotificationOptions.Builder().setActions(Arrays.asList(MediaIntentReceiver.ACTION_SKIP_NEXT, MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK, MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{1, 2}).setTargetActivityClassName(MainActivity.class.getName()).build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder().setImagePicker(new ImagePickerImpl()).setNotificationOptions(notificationOptions).setExpandedControllerActivityClassName(MainActivity.class.getName()).build();
LaunchOptions launchOptions = new LaunchOptions.Builder().setAndroidReceiverCompatible(true).build();
return new CastOptions.Builder().setLaunchOptions(launchOptions).setReceiverApplicationId(context.getString(R.string.app_id)).setCastMediaOptions(mediaOptions).build();
}
@ -42,21 +42,9 @@ public class CastOptionsProvider implements OptionsProvider {
private static class ImagePickerImpl extends ImagePicker {
@Override
public WebImage onPickImage(MediaMetadata mediaMetadata, ImageHints hints) {
int type = hints.getType();
if ((mediaMetadata == null) || !mediaMetadata.hasImages()) {
return null;
}
List<WebImage> images = mediaMetadata.getImages();
if (images.size() == 1) {
return images.get(0);
} else {
if (type == ImagePicker.IMAGE_TYPE_MEDIA_ROUTE_CONTROLLER_DIALOG_BACKGROUND) {
return images.get(0);
} else {
return images.get(1);
}
}
public WebImage onPickImage(MediaMetadata mediaMetadata, @NonNull ImageHints hints) {
if (mediaMetadata == null || !mediaMetadata.hasImages()) return null;
return mediaMetadata.getImages().get(0);
}
}
}

@ -67,7 +67,6 @@ import com.fongmi.android.tv.utils.Prefers;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Traffic;
import com.fongmi.android.tv.utils.Utils;
import com.google.android.gms.cast.framework.CastContext;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.permissionx.guolindev.PermissionX;
@ -95,7 +94,6 @@ public class DetailActivity extends BaseActivity implements Clock.Callback, Cust
private ExecutorService mExecutor;
private SiteViewModel mViewModel;
private FlagAdapter mFlagAdapter;
private CastContext mCastContext;
private List<Dialog> mDialogs;
private PiPReceiver mReceiver;
private History mHistory;

@ -74,9 +74,7 @@ public class DeviceAdapter extends RecyclerView.Adapter<DeviceAdapter.ViewHolder
}
private int getIcon(Device item) {
if (item.isCast()) return R.drawable.ic_control_cast;
else if (item.isMobile()) return R.drawable.ic_cast_mobile;
return R.drawable.ic_cast_tv;
return item.isMobile() ? R.drawable.ic_cast_mobile : R.drawable.ic_cast_tv;
}
static class ViewHolder extends RecyclerView.ViewHolder {

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_500"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_500"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_500"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/white"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/white"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/white"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/white"
android:tint="#FFFFFF"
android:viewportWidth="960"
android:viewportHeight="960">
<path

@ -1,7 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/white"
android:tint="#FFFFFF"
android:viewportWidth="960"
android:viewportHeight="960">
<path

@ -23,6 +23,13 @@
android:textColor="?android:attr/textColorPrimary"
android:textSize="16sp" />
<androidx.mediarouter.app.MediaRouteButton
android:id="@+id/cast"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="20dp"
android:mediaRouteTypes="user" />
<ImageView
android:id="@+id/scan"
android:layout_width="wrap_content"

@ -19,14 +19,13 @@
android:id="@+id/speed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/accent"
android:stepSize="0.25"
android:valueFrom="1"
android:valueTo="5"
app:haloColor="@color/blue_500"
app:thumbColor="@color/blue_500"
app:tickColor="@color/transparent"
app:trackColorActive="@color/blue_500"
app:haloColor="@color/accent"
app:labelStyle="@style/Tooltip"
app:thumbColor="@color/accent"
app:trackColorActive="@color/accent"
app:trackColorInactive="@color/blue_50" />
<TextView

@ -16,7 +16,6 @@
<item name="android:windowBackground">@null</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="android:navigationBarColor">@color/transparent</item>
<item name="bottomSheetDialogTheme">@style/ThemeOverlay.App.BottomSheetDialog</item>
</style>
<style name="Control" />
@ -38,4 +37,8 @@
<item name="android:color">@color/indicator</item>
</style>
<style name="Tooltip" parent="Widget.Material3.Tooltip">
<item name="backgroundTint">@color/accent</item>
</style>
</resources>

Loading…
Cancel
Save