Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds cast feature for photos and images #269

Merged
merged 1 commit into from
Aug 27, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.amahi.anywhere"
android:installLocation="auto">

Expand Down
109 changes: 105 additions & 4 deletions src/main/java/org/amahi/anywhere/activity/ServerFileImageActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@
import android.view.Menu;
import android.view.MenuItem;

import com.google.android.gms.cast.MediaInfo;
import com.google.android.gms.cast.MediaMetadata;
import com.google.android.gms.cast.framework.CastButtonFactory;
import com.google.android.gms.cast.framework.CastContext;
import com.google.android.gms.cast.framework.CastSession;
import com.google.android.gms.cast.framework.SessionManagerListener;
import com.google.android.gms.cast.framework.media.RemoteMediaClient;
import com.squareup.otto.Subscribe;

import org.amahi.anywhere.AmahiApplication;
Expand Down Expand Up @@ -55,7 +62,9 @@
* Image activity. Shows images as a slide show.
* Backed up by {@link org.amahi.anywhere.view.TouchImageView}.
*/
public class ServerFileImageActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener
public class ServerFileImageActivity extends AppCompatActivity implements
ViewPager.OnPageChangeListener,
SessionManagerListener<CastSession>
{
private static final Set<String> SUPPORTED_FORMATS;

Expand All @@ -71,6 +80,9 @@ public class ServerFileImageActivity extends AppCompatActivity implements ViewPa

@Inject
ServerClient serverClient;
private CastSession mCastSession;
private CastContext mCastContext;
private int imagePosition;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -83,6 +95,8 @@ protected void onCreate(Bundle savedInstanceState) {

setUpImage();

setUpCast();

setUpFullScreen();
}

Expand Down Expand Up @@ -114,6 +128,18 @@ private void setUpImage() {
setUpImageListener();
}

private boolean isCastConnected() {
return mCastSession != null && mCastSession.isConnected();
}

private void setUpCast() {
mCastContext = CastContext.getSharedInstance(this);
mCastSession = mCastContext.getSessionManager().getCurrentCastSession();
if (isCastConnected()) {
loadRemoteMedia();
}
}

private void setUpImageTitle() {
setUpImageTitle(getFile());
}
Expand All @@ -139,7 +165,7 @@ private ServerShare getShare() {
}

private List<ServerFile> getImageFiles() {
List<ServerFile> imageFiles = new ArrayList<ServerFile>();
List<ServerFile> imageFiles = new ArrayList<>();

for (ServerFile file : getFiles()) {
if (SUPPORTED_FORMATS.contains(file.getMime())) {
Expand All @@ -155,7 +181,8 @@ private List<ServerFile> getFiles() {
}

private void setUpImagePosition() {
getImagePager().setCurrentItem(getImageFiles().indexOf(getFile()));
imagePosition = getImageFiles().indexOf(getFile());
getImagePager().setCurrentItem(imagePosition);
}

private void setUpImageListener() {
Expand All @@ -172,13 +199,18 @@ public void onPageScrollStateChanged(int state) {

@Override
public void onPageSelected(int position) {
this.imagePosition = position;
setUpImageTitle(getImageFiles().get(position));
if (isCastConnected()) {
loadRemoteMedia();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_bar_server_file_image, menu);

CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu,
R.id.media_route_menu_item);
return super.onCreateOptionsMenu(menu);
}

Expand Down Expand Up @@ -233,17 +265,86 @@ private void startFileSharingActivity(ServerFile file, Uri fileUri) {
protected void onResume() {
super.onResume();

mCastContext.getSessionManager().addSessionManagerListener(this, CastSession.class);
BusProvider.getBus().register(this);
}

@Override
protected void onPause() {
super.onPause();

mCastContext.getSessionManager().removeSessionManagerListener(this, CastSession.class);
BusProvider.getBus().unregister(this);
}

public static boolean supports(String mime_type) {
return SUPPORTED_FORMATS.contains(mime_type);
}

@Override
public void onSessionEnded(CastSession session, int error) {
onApplicationDisconnected();
}

@Override
public void onSessionResumed(CastSession session, boolean wasSuspended) {
onApplicationConnected(session);
}

@Override
public void onSessionResumeFailed(CastSession session, int error) {
onApplicationDisconnected();
}

@Override
public void onSessionStarted(CastSession session, String sessionId) {
onApplicationConnected(session);
}

@Override
public void onSessionStartFailed(CastSession session, int error) {
onApplicationDisconnected();
}

@Override
public void onSessionStarting(CastSession session) {}

@Override
public void onSessionEnding(CastSession session) {}

@Override
public void onSessionResuming(CastSession session, String sessionId) {}

@Override
public void onSessionSuspended(CastSession session, int reason) {}

private void onApplicationConnected(CastSession castSession) {
mCastSession = castSession;
invalidateOptionsMenu();
loadRemoteMedia();
}

private void onApplicationDisconnected() {
mCastSession = null;
invalidateOptionsMenu();
}

private void loadRemoteMedia() {
final RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
if (remoteMediaClient != null) {
remoteMediaClient.load(buildMediaInfo());
}
}

private MediaInfo buildMediaInfo() {
ServerFile file = getImageFiles().get(imagePosition);
MediaMetadata imageMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_PHOTO);
imageMetadata.putString(MediaMetadata.KEY_TITLE, file.getNameOnly());
String imageUrl = serverClient.getFileUri(getShare(), file).toString();
return new MediaInfo.Builder(imageUrl)
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType(file.getMime())
.setMetadata(imageMetadata)
.build();
}
}
9 changes: 9 additions & 0 deletions src/main/res/menu/action_bar_server_file_image.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,16 @@
<item
android:id="@+id/menu_share"
android:icon="@drawable/ic_menu_share"
android:orderInCategory="100"
android:title="@string/menu_share"
app:showAsAction="always" />


<item
android:id="@+id/media_route_menu_item"
android:orderInCategory="101"
android:title="@string/media_route_menu_item"
app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
app:showAsAction="always"/>

</menu>