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