Skip to content

Commit

Permalink
Added d-pad functionalities to the ATV (#259)
Browse files Browse the repository at this point in the history
* Added functionality to the remote's play/pause button

Added forward and rewind from the d-pad buttons.

Added play/pause d pad support to the audio player.

* Added an exit pop-up when exitting the video player.

* Code refractoring

* Added android-19 in travis.yml
  • Loading branch information
octacode authored and cpg committed Aug 14, 2017
1 parent 4848139 commit 8aefb6f
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 59 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ android:
- platform-tools
- build-tools-25.0.2
- android-25
- android-19
- extra-android-support
- extra-android-m2repository
- extra-google-m2repository
Expand Down
26 changes: 21 additions & 5 deletions src/main/java/org/amahi/anywhere/tv/activity/MainTVActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.amahi.anywhere.activity.NavigationActivity;
import org.amahi.anywhere.server.model.Server;
import org.amahi.anywhere.tv.fragment.MainTVFragment;
import org.amahi.anywhere.util.Preferences;

import java.util.ArrayList;

Expand All @@ -37,19 +36,36 @@ public class MainTVActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_tv);
if(getServers()!=null)
getFragmentManager().beginTransaction().add(R.id.main_tv_fragment_container, new MainTVFragment()).commit();
else
startActivity(new Intent(this, NavigationActivity.class));
checkAndLaunch();
}

private void checkAndLaunch() {
if (getServers() != null) {
replaceFragment();
} else {
launchNav();
}
}

private ArrayList<Server> getServers() {
return getIntent().getParcelableArrayListExtra(getString(R.string.intent_servers));
}

private void replaceFragment() {
getFragmentManager().beginTransaction().add(R.id.main_tv_fragment_container, new MainTVFragment()).commit();
}

private void launchNav() {
startActivity(new Intent(this, NavigationActivity.class));
}

@Override
public void onBackPressed() {
super.onBackPressed();
startHomeIntent();
}

private void startHomeIntent() {
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.amahi.anywhere.server.model.ServerFile;
import org.amahi.anywhere.server.model.ServerShare;
import org.amahi.anywhere.tv.fragment.ServerFileTvFragment;
import org.amahi.anywhere.util.Fragments;
import org.amahi.anywhere.util.Intents;

import java.util.List;
Expand All @@ -47,16 +48,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
}

private void setFirstFragment() {
getFragmentManager().beginTransaction().add(R.id.server_file_tv_container, buildFirstTvFragment()).commit();
}

private Fragment buildFirstTvFragment() {
Fragment fragment = new ServerFileTvFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(Intents.Extras.SERVER_FILE, getServerFile());
bundle.putParcelable(Intents.Extras.SERVER_SHARE, getServerShare());
fragment.setArguments(bundle);
return fragment;
getFragmentManager().beginTransaction().add(R.id.server_file_tv_container, Fragments.Builder.buildFirstTvFragment(getServerFile(), getServerShare())).commit();
}

private ServerFile getServerFile() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import android.app.Activity;
import android.app.Fragment;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v17.leanback.widget.PlaybackControlsRow;
import android.view.KeyEvent;

import org.amahi.anywhere.AmahiApplication;
import org.amahi.anywhere.R;
Expand All @@ -17,42 +21,61 @@

import javax.inject.Inject;

import static org.amahi.anywhere.util.Fragments.Builder.buildAudioFragment;

public class TvPlaybackAudioActivity extends Activity {

@Inject
ServerClient serverClient;

Fragment fragment;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tv_audio_playback);
setUpInjections();
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, buildAudioFragment()).commit();
fragment = buildAudioFragment(getFile(), getShare(), getFiles());
replaceFragment();
}

private void setUpInjections() {
AmahiApplication.from(this).inject(this);
}

private Fragment buildAudioFragment(){
Fragment fragment = new TvPlaybackAudioFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(Intents.Extras.SERVER_SHARE,getShare());
bundle.putParcelable(Intents.Extras.SERVER_FILE,getFile());
bundle.putParcelableArrayList(Intents.Extras.SERVER_FILES,getFiles());
fragment.setArguments(bundle);
return fragment;
private void replaceFragment() {
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, fragment).commit();
}

private ServerShare getShare(){
private ServerShare getShare() {
return getIntent().getParcelableExtra(Intents.Extras.SERVER_SHARE);
}

private ServerFile getFile(){
private ServerFile getFile() {
return getIntent().getParcelableExtra(Intents.Extras.SERVER_FILE);
}

private ArrayList<ServerFile> getFiles(){
private ArrayList<ServerFile> getFiles() {
return getIntent().getParcelableArrayListExtra(Intents.Extras.SERVER_FILES);
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
PlaybackControlsRow.PlayPauseAction playPauseAction = ((TvPlaybackAudioFragment) fragment).getmPlayPauseAction();
((TvPlaybackAudioFragment) fragment).togglePlayPause(playPauseAction.getIndex() == PlaybackControlsRow.PlayPauseAction.PAUSE);
break;

case KeyEvent.KEYCODE_MEDIA_REWIND:
((TvPlaybackAudioFragment) fragment).rewind();
break;

case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
((TvPlaybackAudioFragment) fragment).fastForward();
break;
}
return super.onKeyDown(keyCode, event);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,30 @@
package org.amahi.anywhere.tv.activity;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.Intent;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v17.leanback.widget.PlaybackControlsRow;
import android.view.KeyEvent;

import org.amahi.anywhere.AmahiApplication;
import org.amahi.anywhere.R;
import org.amahi.anywhere.server.client.ServerClient;
import org.amahi.anywhere.server.model.ServerFile;
import org.amahi.anywhere.server.model.ServerShare;
import org.amahi.anywhere.tv.fragment.TvPlaybackAudioFragment;
import org.amahi.anywhere.tv.fragment.TvPlaybackVideoFragment;
import org.amahi.anywhere.util.Intents;

import java.util.ArrayList;

import javax.inject.Inject;

import static org.amahi.anywhere.util.Fragments.Builder.buildVideoFragment;

public class TvPlaybackVideoActivity extends Activity {

@Inject
Expand All @@ -51,54 +56,86 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tv_video_playback);
setUpInjections();
fragment = buildAudioFragment();
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, fragment).commit();
fragment = buildVideoFragment(getFile(), getShare(), getFiles());
replaceFragment();
}

private void setUpInjections() {
AmahiApplication.from(this).inject(this);
}

private Fragment buildAudioFragment(){
Fragment fragment = new TvPlaybackVideoFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(Intents.Extras.SERVER_SHARE,getShare());
bundle.putParcelable(Intents.Extras.SERVER_FILE,getFile());
bundle.putParcelableArrayList(Intents.Extras.SERVER_FILES,getFiles());
fragment.setArguments(bundle);
return fragment;
private void replaceFragment() {
getFragmentManager().beginTransaction().replace(R.id.playback_controls_fragment_container, fragment).commit();
}

private ServerShare getShare(){
private ServerShare getShare() {
return getIntent().getParcelableExtra(Intents.Extras.SERVER_SHARE);
}

private ServerFile getFile(){
private ServerFile getFile() {
return getIntent().getParcelableExtra(Intents.Extras.SERVER_FILE);
}

private ArrayList<ServerFile> getFiles(){
private ArrayList<ServerFile> getFiles() {
return getIntent().getParcelableArrayListExtra(Intents.Extras.SERVER_FILES);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode){
case KeyEvent.KEYCODE_MEDIA_REWIND:
((TvPlaybackVideoFragment)fragment).rewind();
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
Object savedState = ((TvPlaybackVideoFragment) fragment).getmSavedState();
if (savedState instanceof PlaybackControlsRow.RewindAction)
((TvPlaybackVideoFragment) fragment).rewind();
break;
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
((TvPlaybackVideoFragment)fragment).fastForward();

case KeyEvent.KEYCODE_DPAD_RIGHT:
savedState = ((TvPlaybackVideoFragment) fragment).getmSavedState();
if (savedState instanceof PlaybackControlsRow.FastForwardAction)
((TvPlaybackVideoFragment) fragment).fastForward();
break;
case KeyEvent.KEYCODE_MEDIA_NEXT:
((TvPlaybackVideoFragment)fragment).skipNext();

case KeyEvent.KEYCODE_MEDIA_REWIND:
((TvPlaybackVideoFragment) fragment).rewind();
break;
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
((TvPlaybackVideoFragment)fragment).skipPrevious();

case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
playPause();
break;

default:
break;
}
return super.onKeyDown(keyCode, event);
}
}

private void playPause() {
PlaybackControlsRow.PlayPauseAction pauseAction = ((TvPlaybackVideoFragment) fragment).getmPlayPauseAction();
((TvPlaybackVideoFragment) fragment).togglePlayPause(pauseAction.getIndex() == PlaybackControlsRow.PlayPauseAction.PAUSE);
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onBackPressed() {
AlertDialog.Builder builder;
builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Dialog_Alert);

if (((TvPlaybackVideoFragment) fragment).getmPlayPauseAction().getIndex() == PlaybackControlsRow.PlayPauseAction.PAUSE)
playPause();

builder.setTitle(getString(R.string.exit_title))
.setMessage(getString(R.string.exit_message))
.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
TvPlaybackVideoActivity.super.onBackPressed();
}
})
.setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@
public class ConnectionFragment extends GuidedStepFragment {

private static final int OPTION_CHECK_SET_ID = 10;
private static final int ACTION_BACK = 1;
private ArrayList<String> OPTION_NAMES = new ArrayList<>();
private ArrayList<String> OPTION_DESCRIPTIONS = new ArrayList<>();
private ArrayList<Boolean> OPTION_CHECKED = new ArrayList<>();

private Context mContext;
private SharedPreferences preference;
private String initialSelected;
Expand All @@ -70,7 +70,6 @@ public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
ContextCompat.getDrawable(getActivity(), R.drawable.ic_app_logo_shadowless));
}


@Override
public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
setTitle(actions);
Expand All @@ -86,7 +85,6 @@ public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedIns
markSelected(selected);

setCheckedActionButtons(actions);

}

private void setTitle(List<GuidedAction> actions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ private void prepareAudio(){
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void togglePlayPause(boolean isPaused) {
public void togglePlayPause(boolean isPaused) {
if (isPaused) {
mediaPlayer.pause();
} else {
Expand All @@ -206,14 +206,14 @@ private void togglePlayPause(boolean isPaused) {
playbackStateChanged();
}

private void rewind() {
public void rewind() {
if (mediaPlayer.getCurrentPosition() - (10 * 1000) > 0) {
mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() - (10 * 1000));
mPlaybackControlsRow.setCurrentTime(mediaPlayer.getCurrentPosition());
}
}

private void fastForward() {
public void fastForward() {
if (mediaPlayer.getCurrentPosition() + (10 * 1000) <= mediaPlayer.getDuration()) {
mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() + (10 * 1000));
mPlaybackControlsRow.setCurrentTime(mediaPlayer.getCurrentPosition());
Expand Down Expand Up @@ -415,4 +415,8 @@ public void onDestroy() {
mediaPlayer.release();
mediaPlayer = null;
}

public PlaybackControlsRow.PlayPauseAction getmPlayPauseAction() {
return mPlayPauseAction;
}
}
Loading

0 comments on commit 8aefb6f

Please sign in to comment.