1 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- 2 * vim: ts=4 sw=4 expandtab: 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 package org.mozilla.gecko; 8 9 import org.json.JSONObject; 10 import org.json.JSONException; 11 12 import org.json.JSONObject; 13 import org.mozilla.gecko.AppConstants.Versions; 14 import org.mozilla.gecko.GeckoAppShell; 15 import org.mozilla.gecko.PresentationView; 16 import org.mozilla.gecko.R; 17 import org.mozilla.gecko.ScreenManagerHelper; 18 import org.mozilla.gecko.annotation.JNITarget; 19 import org.mozilla.gecko.annotation.ReflectionTarget; 20 import org.mozilla.gecko.annotation.WrapForJNI; 21 import org.mozilla.gecko.gfx.LayerView; 22 import org.mozilla.gecko.util.EventCallback; 23 import org.mozilla.gecko.util.NativeEventListener; 24 import org.mozilla.gecko.util.NativeJSObject; 25 26 import com.google.android.gms.cast.CastMediaControlIntent; 27 import com.google.android.gms.cast.CastPresentation; 28 import com.google.android.gms.cast.CastRemoteDisplayLocalService; 29 import com.google.android.gms.common.ConnectionResult; 30 import com.google.android.gms.common.GooglePlayServicesUtil; 31 32 import android.app.Activity; 33 import android.content.Context; 34 import android.os.Bundle; 35 import android.support.v4.app.Fragment; 36 import android.support.v7.media.MediaControlIntent; 37 import android.support.v7.media.MediaRouteSelector; 38 import android.support.v7.media.MediaRouter.RouteInfo; 39 import android.support.v7.media.MediaRouter; 40 import android.util.DisplayMetrics; 41 import android.util.Log; 42 import android.view.Display; 43 import android.view.ViewGroup.LayoutParams; 44 import android.view.WindowManager; 45 import android.widget.RelativeLayout; 46 47 import java.util.HashMap; 48 import java.util.Map; 49 50 /* 51 * Service to keep the remote display running even when the app goes into the background 52 */ 53 public class RemotePresentationService extends CastRemoteDisplayLocalService { 54 55 private static final String LOGTAG = "RemotePresentationService"; 56 private CastPresentation presentation; 57 private String deviceId; 58 private int screenId; 59 setDeviceId(String deviceId)60 public void setDeviceId(String deviceId) { 61 this.deviceId = deviceId; 62 } 63 getDeviceId()64 public String getDeviceId() { 65 return deviceId; 66 } 67 68 @Override onCreatePresentation(Display display)69 public void onCreatePresentation(Display display) { 70 createPresentation(); 71 } 72 73 @Override onDismissPresentation()74 public void onDismissPresentation() { 75 dismissPresentation(); 76 } 77 dismissPresentation()78 private void dismissPresentation() { 79 if (presentation != null) { 80 presentation.dismiss(); 81 presentation = null; 82 ScreenManagerHelper.removeDisplay(screenId); 83 MediaPlayerManager.getInstance().setPresentationMode(false); 84 } 85 } 86 createPresentation()87 private void createPresentation() { 88 dismissPresentation(); 89 90 MediaPlayerManager.getInstance().setPresentationMode(true); 91 92 DisplayMetrics metrics = new DisplayMetrics(); 93 getDisplay().getMetrics(metrics); 94 screenId = ScreenManagerHelper.addDisplay(ScreenManagerHelper.DISPLAY_VIRTUAL, 95 metrics.widthPixels, 96 metrics.heightPixels, 97 metrics.density); 98 99 VirtualPresentation virtualPresentation = new VirtualPresentation(this, getDisplay()); 100 virtualPresentation.setDeviceId(deviceId); 101 virtualPresentation.setScreenId(screenId); 102 presentation = (CastPresentation) virtualPresentation; 103 104 try { 105 presentation.show(); 106 } catch (WindowManager.InvalidDisplayException ex) { 107 Log.e(LOGTAG, "Unable to show presentation, display was removed.", ex); 108 dismissPresentation(); 109 } 110 } 111 } 112 113 class VirtualPresentation extends CastPresentation { 114 private final String LOGTAG = "VirtualPresentation"; 115 private RelativeLayout layout; 116 private PresentationView view; 117 private String deviceId; 118 private int screenId; 119 VirtualPresentation(Context context, Display display)120 public VirtualPresentation(Context context, Display display) { 121 super(context, display); 122 } 123 setDeviceId(String deviceId)124 public void setDeviceId(String deviceId) { this.deviceId = deviceId; } setScreenId(int screenId)125 public void setScreenId(int screenId) { this.screenId = screenId; } 126 127 @Override onCreate(Bundle savedInstanceState)128 protected void onCreate(Bundle savedInstanceState) { 129 super.onCreate(savedInstanceState); 130 131 /* 132 * NOTICE: The context get from getContext() is different to the context 133 * of the application. Presentaion has its own context to get correct 134 * resources. 135 */ 136 137 // Create new PresentationView 138 view = new PresentationView(getContext(), deviceId, screenId); 139 view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 140 LayoutParams.MATCH_PARENT)); 141 142 // Create new layout to put the GeckoView 143 layout = new RelativeLayout(getContext()); 144 layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 145 LayoutParams.MATCH_PARENT)); 146 layout.addView(view); 147 148 setContentView(layout); 149 } 150 } 151