/*
* Copyright © 2016 TIBCO Software,Inc.All rights reserved.
* http://community.jaspersoft.com/project/jaspermobile-android
*
* Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
* the following license terms apply:
*
* This program is part of TIBCO Jaspersoft Mobile for Android.
*
* TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation,either version 3of the License,or
* (at your option)any later version.
*
* TIBCO Jaspersoft Mobile is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY;without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with TIBCO Jaspersoft Mobile for Android.If not,see
* <http://www.gnu.org/licenses/lgpl>.
*/
package com.jaspersoft.android.jaspermobile.ui.view.activity;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.MediaRouteActionProvider;
import android.support.v7.app.NotificationCompat;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.google.android.gms.cast.CastDevice;
import com.google.android.gms.cast.CastMediaControlIntent;
import com.google.android.gms.cast.CastRemoteDisplayLocalService;
import com.google.android.gms.common.api.Status;
import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.ui.component.activity.ComponentCacheActivity;
import com.jaspersoft.android.jaspermobile.util.cast.ResourceCastDialogFactory;
import com.jaspersoft.android.jaspermobile.util.cast.ResourcePresentationService;
import com.jaspersoft.android.sdk.service.data.server.ServerVersion;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsMenu;
import org.androidannotations.annotations.OptionsMenuItem;
/**
* @author Andrew Tivodar
* @since 2.3
*/
@EActivity
@OptionsMenu(R.menu.cast_menu)
public abstract class CastActivity extends ComponentCacheActivity {
@OptionsMenuItem(R.id.castReport)
protected MenuItem castAction;
private MediaRouter mMediaRouter;
private MediaRouteSelector mMediaRouteSelector;
private MediaRouter.Callback mMediaRouterCallback;
private boolean mCastAvailable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMediaRouter = MediaRouter.getInstance(getApplicationContext());
mMediaRouteSelector = new MediaRouteSelector.Builder()
.addControlCategory(CastMediaControlIntent.categoryForCast(getString(R.string.app_cast_id)))
.build();
mMediaRouterCallback = new BaseMediaRouterCallback();
}
@AfterViews
protected void init() {
String version = mServer.getVersion();
mCastAvailable = mServer.isProEdition() && ServerVersion.valueOf(version).greaterThanOrEquals(ServerVersion.v6);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
if (castAction != null && mCastAvailable) {
MediaRouteActionProvider mediaRouteActionProvider =
(MediaRouteActionProvider) MenuItemCompat.getActionProvider(castAction);
mediaRouteActionProvider.setRouteSelector(mMediaRouteSelector);
mediaRouteActionProvider.setDialogFactory(new ResourceCastDialogFactory());
return true;
}
return result;
}
@Override
protected void onStart() {
super.onStart();
mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
}
@Override
protected void onStop() {
mMediaRouter.removeCallback(mMediaRouterCallback);
super.onStop();
}
protected void onCastStarted() {
}
protected void onCastStopped() {
}
//---------------------------------------------------------------------
// Helper methods
//---------------------------------------------------------------------
private void startCastService(CastDevice castDevice) {
if (castDevice == null) return;
CastRemoteDisplayLocalService.NotificationSettings emptySettings =
new CastRemoteDisplayLocalService.NotificationSettings.Builder()
.setNotification(createCastNotification(castDevice.getFriendlyName()))
.build();
CastRemoteDisplayLocalService.startService(this, ResourcePresentationService.class, getString(R.string.app_cast_id),
castDevice, emptySettings, new CastServiceCallback());
}
private Notification createCastNotification(String castDeviceName) {
NotificationCompat.Builder castNotificationBuilder = new NotificationCompat.Builder(this);
castNotificationBuilder.setSmallIcon(R.drawable.im_logo_single)
.setContentTitle(getString(R.string.r_pd_initializing_msg))
.setContentText(castDeviceName)
.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(), 0))
.setWhen(0);
return castNotificationBuilder.build();
}
//---------------------------------------------------------------------
// Nested classes
//---------------------------------------------------------------------
private final class BaseMediaRouterCallback extends MediaRouter.Callback {
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteSelected(router, route);
CastDevice castDevice = CastDevice.getFromBundle(route.getExtras());
if (castDevice != null) {
startCastService(castDevice);
}
}
@Override
public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteUnselected(router, route);
CastRemoteDisplayLocalService.stopService();
onCastStopped();
}
}
private final class CastServiceCallback implements CastRemoteDisplayLocalService.Callbacks {
@Override
public void onServiceCreated(CastRemoteDisplayLocalService castRemoteDisplayLocalService) {
CastDevice castDevice = CastDevice.getFromBundle(mMediaRouter.getSelectedRoute().getExtras());
if (castDevice != null) {
((ResourcePresentationService) castRemoteDisplayLocalService).setCastDeviceName(castDevice.getFriendlyName());
}
onCastStarted();
}
@Override
public void onRemoteDisplaySessionStarted(CastRemoteDisplayLocalService castRemoteDisplayLocalService) {
}
@Override
public void onRemoteDisplaySessionError(Status status) {
Toast.makeText(CastActivity.this, "Error casting " + status, Toast.LENGTH_SHORT).show();
}
}
}