/* * Copyright 2008-2013, ETH Zürich, Samuel Welten, Michael Kuhn, Tobias Langner, * Sandro Affentranger, Lukas Bossard, Michael Grob, Rahul Jain, * Dominic Langenegger, Sonia Mayor Alonso, Roger Odermatt, Tobias Schlueter, * Yannick Stucki, Sebastian Wendland, Samuel Zehnder, Samuel Zihlmann, * Samuel Zweifel * * This file is part of Jukefox. * * Jukefox is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or any later version. Jukefox 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Jukefox. If not, see <http://www.gnu.org/licenses/>. */ package ch.ethz.dcg.pancho3.controller.eventhandlers; import java.util.Timer; import java.util.TimerTask; import android.content.Intent; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.ListView; import ch.ethz.dcg.jukefox.commons.utils.Log; import ch.ethz.dcg.jukefox.controller.Controller; import ch.ethz.dcg.jukefox.model.collection.BaseAlbum; import ch.ethz.dcg.jukefox.model.collection.BaseArtist; import ch.ethz.dcg.jukefox.model.collection.BaseSong; import ch.ethz.dcg.jukefox.model.commons.EmptyPlaylistException; import ch.ethz.dcg.jukefox.model.commons.PlaylistPositionOutOfRangeException; import ch.ethz.dcg.jukefox.model.player.PlayerState; import ch.ethz.dcg.pancho3.R; import ch.ethz.dcg.pancho3.model.collection.ParcelableSong; import ch.ethz.dcg.pancho3.view.dialogs.CancelImportDialog; import ch.ethz.dcg.pancho3.view.overlays.SongContextMenu; import ch.ethz.dcg.pancho3.view.tabs.PlayerActivity; import ch.ethz.dcg.pancho3.view.tabs.JukefoxTabActivity.Tab; public class PlayerActivityEventListener extends MainTabButtonEventListener { public static final int AUTO_SHOW_COVER_TIME = 8000; public static final int NUMBER_COVER_HINT_THRESSHOLD = 5; private static final String TAG = PlayerActivityEventListener.class.getSimpleName(); private Timer showAlbumArtTimer; private boolean isCoverVisible = true; private PlayerActivity activity; private long coverTouchDownTime; private long lastListTouchTime; private float playlistTouchDownPosX; private boolean shownCover; private int firstVisibleItemInList; public PlayerActivityEventListener(Controller controller, PlayerActivity activity) { super(controller, activity, Tab.PLAYER); this.activity = activity; } public boolean onAlbumArtTouch(MotionEvent event, ImageView albumArt) { if (event.getAction() == MotionEvent.ACTION_DOWN) { coverTouchDownTime = System.currentTimeMillis(); } else if (event.getAction() == MotionEvent.ACTION_UP) { // Check if was already handled if (coverTouchDownTime == 0) { return true; } long endTime = System.currentTimeMillis(); if (endTime - coverTouchDownTime < 1000) { if (activity.getPlayerController().getCurrentPlaylist().getPlaylistSize() > 0) { controller.doHapticFeedback(); hideAlbumArt(); } else { controller.doHapticFeedback(); controller.showToast(activity.getString(R.string.empty_playlist_use_tabs)); } return true; } } else if (event.getAction() == MotionEvent.ACTION_MOVE) { long endTime = System.currentTimeMillis(); if (coverTouchDownTime == 0) { return true; // float endTouchPosX = event.getX(); // float endTouchPosY = event.getY(); } // if (endTouchPosX - coverTouchDownPosX > albumArt.getWidth() / 3) // { // controller.doHapticFeedback(); // Toast.makeText(activity, activity.getString(R.string.next), // Toast.LENGTH_SHORT).show(); // controller.nextButtonPressed(); // coverTouchDownTime = 0; // return true; // } else if (coverTouchDownPosX - endTouchPosX > // albumArt.getWidth() / 3) { // controller.doHapticFeedback(); // Toast.makeText(activity, activity.getString(R.string.previous), // Toast.LENGTH_SHORT).show(); // controller.previousButtonPressed(); // coverTouchDownTime = 0; // return true; // } else if (endTouchPosY - coverTouchDownPosY > // albumArt.getHeight() / 3) { // controller.doHapticFeedback(); // Toast.makeText(activity, // activity.getString(R.string.play_pause), // Toast.LENGTH_SHORT).show(); // controller.playPauseButtonPressed(); // coverTouchDownTime = 0; // return true; // } else if (coverTouchDownPosY - endTouchPosY > // albumArt.getHeight() / 3) { // controller.doHapticFeedback(); // BaseSong<BaseArtist, BaseAlbum> currentSong; // try { // currentSong = activity.getPlaylist().getCurrentSong(); // if (currentSong != null) { // controller.showAlbumDetailInfo(activity, currentSong // .getAlbum()); // } // } catch (EmptyPlaylistException e) { // Log.w(TAG, e); // } // coverTouchDownTime = 0; // return true; // } else if (endTime - coverTouchDownTime > 1000) { controller.doHapticFeedback(); BaseSong<BaseArtist, BaseAlbum> currentSong; try { currentSong = activity.getPlayerController().getCurrentSong(); int currentSongPosition = activity.getPlayerController().getCurrentSongIndex(); controller.showSongContextMenu(activity, currentSong, currentSongPosition); } catch (EmptyPlaylistException e) { Log.w(TAG, e); } coverTouchDownTime = 0; return true; } } return true; } private void resetShowCoverTimer() { if (!controller.getSettingsReader().isAutomaticallyShowCover()) { return; } cancelShowAlbumArtTimer(); showAlbumArtTimer = new Timer(); showAlbumArtTimer.schedule(new TimerTask() { @Override public void run() { if (System.currentTimeMillis() > lastListTouchTime + AUTO_SHOW_COVER_TIME) { showAlbumArt(); } else { resetShowCoverTimer(); } } }, AUTO_SHOW_COVER_TIME); } private void cancelShowAlbumArtTimer() { if (showAlbumArtTimer != null) { showAlbumArtTimer.cancel(); } showAlbumArtTimer = null; } public void hideAlbumArt() { if (!isCoverVisible) { return; } isCoverVisible = false; activity.getHandler().post(new Runnable() { @Override public void run() { activity.findViewById(R.id.playlist).setVisibility(View.VISIBLE); int numberCoverClicked = activity.getSettings().getCoverHintCountPlayer(); if (numberCoverClicked < NUMBER_COVER_HINT_THRESSHOLD) { controller.getSettingsEditor().setCoverHintCountPlayer(numberCoverClicked + 1); activity.findViewById(R.id.clickCover).setVisibility(View.GONE); } // activity.findViewById(R.id.bigCoverArt) // .setVisibility(View.GONE); ListView playlist = (ListView) activity.findViewById(R.id.playlist); int position = 0; try { position = controller.getPlayerController().getCurrentSongIndex(); playlist.setSelection(position); } catch (EmptyPlaylistException e) { } } }); resetShowCoverTimer(); } public void showAlbumArt() { if (isCoverVisible) { return; } isCoverVisible = true; activity.getHandler().post(new Runnable() { @Override public void run() { activity.findViewById(R.id.playlist).setVisibility(View.GONE); int numberCoverClicked = activity.getSettings().getCoverHintCountPlayer(); if (numberCoverClicked < NUMBER_COVER_HINT_THRESSHOLD) { activity.findViewById(R.id.clickCover).setVisibility(View.VISIBLE); } // activity.findViewById(R.id.bigCoverArt).setVisibility( // View.VISIBLE); } }); } public void setProgress(int progress) { PlayerState state = controller.getPlayerController().getPlayerState(); // if (state == PlayerState.PLAY || state == PlayerState.PAUSE) { controller.getPlayerController().seekTo(progress); activity.updateProgress(); // } } public void onPlaylistItemClicked(int position) { try { // Log.v(TAG, "Clicked at pos: " + position); controller.getPlayerController().playSongAtPosition(position); } catch (PlaylistPositionOutOfRangeException e) { Log.w(TAG, e); } } public void onScroll(int firstVisibleItem) { if (firstVisibleItemInList != firstVisibleItem) { Log.v(TAG, "onScroll()"); resetShowCoverTimer(); firstVisibleItemInList = firstVisibleItem; } } @SuppressWarnings("unchecked") public boolean onPlaylistItemLongClicked(int position) { if (!isCoverVisible) { BaseSong<BaseArtist, BaseAlbum> song = (BaseSong<BaseArtist, BaseAlbum>) activity.getList() .getItemAtPosition(position); Intent intent = new Intent(activity, SongContextMenu.class); intent.putExtra(Controller.INTENT_EXTRA_SONG_PLAYLIST_POSITION, position); intent.putExtra(Controller.INTENT_EXTRA_BASE_SONG, new ParcelableSong(song)); activity.startActivity(intent); } return true; } public void detectedFirstStart() { // controller.showDirectorySelectionDialog(activity); // controller.showTakeATourDialog(); controller.showFirstStartDialog(); } public void sdCardProblemDetected() { controller.showSdCardProblemDialog(); } public boolean onListTouch(MotionEvent event, ImageView albumArt) { lastListTouchTime = event.getEventTime(); if (event.getAction() == MotionEvent.ACTION_DOWN) { playlistTouchDownPosX = event.getX(); shownCover = false; } else if (event.getAction() == MotionEvent.ACTION_MOVE && shownCover == false) { float endTouchPosX = event.getX(); if (Math.abs(endTouchPosX - playlistTouchDownPosX) > (float) albumArt.getWidth() / 2) { shownCover = true; controller.doHapticFeedback(); cancelShowAlbumArtTimer(); showAlbumArt(); return true; } } return false; } public void movePlaylistElement(int from, int to) { try { controller.getPlayerController().moveSong(from, to); } catch (PlaylistPositionOutOfRangeException e) { Log.w(TAG, e); } catch (EmptyPlaylistException e) { Log.w(TAG, e); } } @Override public boolean onKey(int keyCode, KeyEvent event) { Log.v(TAG, "onKey()"); if (keyCode != KeyEvent.KEYCODE_BACK) { return super.onKey(keyCode, event); } if (activity.getSettings().isAutomaticallyShowCover() && !isCoverVisible) { cancelShowAlbumArtTimer(); showAlbumArt(); return true; } else { if (activity.getApplicationState().isImporting()) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { Intent intent = new Intent(activity, CancelImportDialog.class); intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); activity.startActivity(intent); } }, 2000); } return super.onKey(keyCode, event); } } }