/*-
* Copyright (C) 2011 Peter Baldwin
*
* This program 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
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.peterbaldwin.vlcremote.fragment;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.Toast;
import org.peterbaldwin.client.android.vlcremote.R;
import org.peterbaldwin.vlcremote.intent.Intents;
import org.peterbaldwin.vlcremote.listener.ButtonVisibilityListener;
import org.peterbaldwin.vlcremote.listener.CommonPlaybackButtonsListener;
import org.peterbaldwin.vlcremote.listener.MediaServerListener;
import org.peterbaldwin.vlcremote.listener.UIVisibilityListener;
import org.peterbaldwin.vlcremote.model.Preferences;
import org.peterbaldwin.vlcremote.model.Reloadable;
import org.peterbaldwin.vlcremote.model.Reloader;
import org.peterbaldwin.vlcremote.model.Status;
import org.peterbaldwin.vlcremote.model.Tags;
import org.peterbaldwin.vlcremote.net.MediaServer;
public final class ButtonsFragment extends MediaFragment implements View.OnClickListener,
View.OnLongClickListener, MediaServerListener, ButtonVisibilityListener, Reloadable {
private BroadcastReceiver mStatusReceiver;
private CommonPlaybackButtonsListener listener;
private ImageButton mButtonShuffle;
private ImageButton mButtonRepeat;
private boolean isAllButtonsVisible;
private boolean mRandom;
private boolean mRepeat;
private boolean mLoop;
@Override
public void onNewMediaServer(MediaServer server) {
super.onNewMediaServer(server);
if(listener != null) {
listener.setMediaServer(server);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((UIVisibilityListener) activity).setButtonVisibilityListener(this);
((Reloader) activity).addReloadable(Tags.FRAGMENT_BUTTONS, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
return inflater.inflate(R.layout.buttons_fragment, parent, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
View view = getView();
listener = new CommonPlaybackButtonsListener(getMediaServer());
listener.setUp(view);
mButtonShuffle = (ImageButton) view.findViewById(R.id.playlist_button_shuffle);
mButtonRepeat = (ImageButton) view.findViewById(R.id.playlist_button_repeat);
ImageButton mButtonPlaylistSeekBackward = (ImageButton) view.findViewById(R.id.action_button_seek_backward);
ImageButton mButtonPlaylistSeekForward = (ImageButton) view.findViewById(R.id.action_button_seek_forward);
isAllButtonsVisible = view.findViewById(R.id.audio_player_buttons_second_row) != null;
getActivity().invalidateOptionsMenu();
setupImageButtonListeners(mButtonShuffle, mButtonRepeat, mButtonPlaylistSeekBackward, mButtonPlaylistSeekForward);
if(getResources().getConfiguration().screenWidthDp >= 400) {
// seek buttons are displayed in playback fragment if >= 400dp
hideImageButton(mButtonPlaylistSeekBackward, mButtonPlaylistSeekForward);
}
}
private void setupImageButtonListeners(ImageButton... imageButtons) {
for(ImageButton b : imageButtons) {
if(b != null) {
b.setOnClickListener(this);
b.setOnLongClickListener(this);
}
}
}
private void updateDVDButton() {
if(getView() == null) {
return;
}
ImageButton dvd = (ImageButton) getView().findViewById(R.id.button_navigation);
if(dvd != null && dvd.getTag() == null) {
dvd.setVisibility(Preferences.get(getActivity()).isHideDVDTabSet() ? View.GONE : View.VISIBLE);
}
}
private void hideImageButton(ImageButton... imageButtons) {
for(ImageButton b : imageButtons) {
if(b != null) {
b.setVisibility(View.GONE);
}
}
}
@Override
public boolean isAllButtonsVisible() {
return isAllButtonsVisible;
}
@Override
public void onResume() {
super.onResume();
mStatusReceiver = new StatusReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intents.ACTION_STATUS);
getActivity().registerReceiver(mStatusReceiver, filter);
updateDVDButton();
}
@Override
public void onPause() {
getActivity().unregisterReceiver(mStatusReceiver);
mStatusReceiver = null;
super.onPause();
}
/** {@inheritDoc} */
public void onClick(View v) {
switch (v.getId()) {
case R.id.action_button_seek_backward:
getMediaServer().status().command.seek(Uri.encode("-".concat(Preferences.get(getActivity()).getSeekTime())));
break;
case R.id.action_button_seek_forward:
getMediaServer().status().command.seek(Uri.encode("+".concat(Preferences.get(getActivity()).getSeekTime())));
break;
case R.id.playlist_button_shuffle:
getMediaServer().status().command.playback.random();
mRandom = !mRandom;
updateButtons();
break;
case R.id.playlist_button_repeat:
// Order: Normal -> Loop -> Repeat
if (mLoop) {
// Turn-on repeat
getMediaServer().status().command.playback.repeat();
mRepeat = true;
mLoop = false;
} else if (mRepeat) {
// Turn-off repeat
getMediaServer().status().command.playback.repeat();
mRepeat = false;
} else {
// Turn-on loop
getMediaServer().status().command.playback.loop();
mLoop = true;
}
updateButtons();
break;
}
}
private int getShuffleResId() {
if (mRandom) {
return R.drawable.ic_mp_shuffle_on_btn;
} else {
return R.drawable.ic_mp_shuffle_off_btn;
}
}
private int getRepeatResId() {
if (mRepeat) {
return R.drawable.ic_mp_repeat_once_btn;
} else if (mLoop) {
return R.drawable.ic_mp_repeat_all_btn;
} else {
return R.drawable.ic_mp_repeat_off_btn;
}
}
private void updateButtons() {
mButtonShuffle.setImageResource(getShuffleResId());
mButtonRepeat.setImageResource(getRepeatResId());
}
void onStatusChanged(Status status) {
mRandom = status.isRandom();
mLoop = status.isLoop();
mRepeat = status.isRepeat();
updateButtons();
}
public boolean onLongClick(View v) {
Toast.makeText(getActivity(), v.getContentDescription(), Toast.LENGTH_SHORT).show();
return true;
}
public void reload(Bundle args) {
if(listener != null) {
listener.setUp(getView());
}
}
private class StatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Status status = (Status) intent.getSerializableExtra(Intents.EXTRA_STATUS);
onStatusChanged(status);
}
}
}