/* * Copyright (C) 2014 Sam Malone * * 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.widget; import android.content.Context; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import org.peterbaldwin.client.android.vlcremote.R; import org.peterbaldwin.vlcremote.model.Button; import org.peterbaldwin.vlcremote.model.DelayPresetButton; import org.peterbaldwin.vlcremote.model.Hotkeys; import org.peterbaldwin.vlcremote.model.Preferences; import org.peterbaldwin.vlcremote.net.MediaServer; /** * * @author Sam Malone */ public class Buttons { private static final String DEFAULT = "default"; private static final String DEFAULT_FIRST = "crop"; private static final String DEFAULT_SECOND = "subtitle"; private static final String DEFAULT_THIRD = "fullscreen"; private static final String DEFAULT_FOURTH = "audio_track"; private static final String DEFAULT_FIFTH = "aspect_ratio"; /** * Get the Button for the ordinal preference button key using the values * stored in preferences * @param key ordinal preference button key e.g. {@link Preferences#KEY_BUTTON_FIRST} * @param pref Preferences that stores the button action * @return Button or null if button not found */ public static Button getButton(String key, Preferences pref) { return getButton(key, pref.getButton(key)); } /** * Get the Button with the given button name or get the default button for * the ordinal preference button key * @param key ordinal preference button key e.g. {@link Preferences#KEY_BUTTON_FIRST} * @param button Button name. See @array/buttonEntryValues. * @return Button or null if button is not found */ public static Button getButton(String key, String button) { if(DEFAULT.equals(button)) { if(Preferences.KEY_BUTTON_FIRST.equals(key)) { button = DEFAULT_FIRST; } else if(Preferences.KEY_BUTTON_SECOND.equals(key)) { button = DEFAULT_SECOND; } else if(Preferences.KEY_BUTTON_THIRD.equals(key)) { button = DEFAULT_THIRD; } else if(Preferences.KEY_BUTTON_FOURTH.equals(key)) { button = DEFAULT_FOURTH; } else if(Preferences.KEY_BUTTON_FIFTH.equals(key)) { button = DEFAULT_FIFTH; } } return getButton(button); } /** * Get the Button for the ordinal menu id * @param menuId ordinal menu id e.g. R.id.menu_action_button_first * @param pref Preferences where the action is stored * @return Button or null if menu id not found */ public static Button getButton(int menuId, Preferences pref) { switch (menuId) { case R.id.menu_action_button_first: return getButton(Preferences.KEY_BUTTON_FIRST, pref); case R.id.menu_action_button_second: return getButton(Preferences.KEY_BUTTON_SECOND, pref); case R.id.menu_action_button_third: return getButton(Preferences.KEY_BUTTON_THIRD, pref); case R.id.menu_action_button_fourth: return getButton(Preferences.KEY_BUTTON_FOURTH, pref); case R.id.menu_action_button_fifth: return getButton(Preferences.KEY_BUTTON_FIFTH, pref); } return null; } /** * Get the Button with the given name * @param button Button name. See @array/buttonEntryValues * @return Button or null if not found */ public static Button getButton(final String button) { if("crop".equals(button)) { return new Button(button, Hotkeys.CROP, R.drawable.ic_menu_crop, R.string.crop); } else if("subtitle".equals(button)) { return new Button(button, Hotkeys.SUBTITLE_TRACK, R.drawable.ic_menu_start_conversation, R.string.subtitle_track); } else if("fullscreen".equals(button)) { return new Button(button, Hotkeys.FULLSCREEN, R.drawable.ic_media_fullscreen, R.string.toggle_fullscreen); } else if("audio_track".equals(button)) { return new Button(button, Hotkeys.AUDIO_TRACK, R.drawable.ic_media_cycle_audio_track, R.string.audio_track); } else if("aspect_ratio".equals(button)) { return new Button(button, Hotkeys.ASPECT_RATIO, R.drawable.ic_menu_chat_dashboard, R.string.aspect_ratio); } else if("chapter_prev".equals(button)) { return new Button(button, Hotkeys.CHAPTER_PREV, R.drawable.ic_media_previous_chapter, R.string.desc_button_chapter_previous); } else if("chapter_next".equals(button)) { return new Button(button, Hotkeys.CHAPTER_NEXT, R.drawable.ic_media_next_chapter, R.string.desc_button_chapter_next); } else if("subtitle_delay_increase".equals(button)) { return new Button(button, Hotkeys.SUBTITLE_DELAY_INCREASE, R.drawable.ic_menu_subtitle_delay_increase, R.string.desc_button_subtitle_delay_increase); } else if("subtitle_delay_decrease".equals(button)) { return new Button(button, Hotkeys.SUBTITLE_DELAY_DECREASE, R.drawable.ic_menu_subtitle_delay_decrease, R.string.desc_button_subtitle_delay_decrease); } else if("audio_delay_increase".equals(button)) { return new Button(button, Hotkeys.AUDIO_DELAY_INCREASE, R.drawable.ic_media_audio_delay_increase, R.string.desc_button_audio_delay_increase); } else if("audio_delay_decrease".equals(button)) { return new Button(button, Hotkeys.AUDIO_DELAY_DECREASE, R.drawable.ic_media_audio_delay_decrease, R.string.desc_button_audio_delay_decrease); } return getDelayPresetButton(button); } /** * Get the delay preset Button with the given name * @param button Button name. See @array/buttonEntryValues * @return Button or null if not found */ public static Button getDelayPresetButton(String button) { if("subtitle_delay_toggle".equals(button)) { return new DelayPresetButton(button, R.drawable.ic_menu_subtitle_delay_cycle, R.string.desc_button_subtitle_delay_toggle) { @Override public void onSendCommand(MediaServer m, Preferences p, Context context, boolean isPresetOn) { int delay = !isPresetOn ? p.getSubtitleDelayToggle() : 0; m.status().command.playback.subtitleDelay(Float.valueOf(delay)); p.setPresetDelayInUse("delay_toggle", false); Toast.makeText(context, String.format("Set subtitle delay at %d ms", delay), Toast.LENGTH_SHORT).show(); } }; } else if("audio_delay_toggle".equals(button)) { return new DelayPresetButton(button, R.drawable.ic_media_audio_delay_preset_cycle, R.string.desc_button_audio_delay_toggle) { @Override public void onSendCommand(MediaServer m, Preferences p, Context context, boolean isPresetOn) { int delay = !isPresetOn ? p.getAudioDelayToggle() : 0; m.status().command.playback.audioDelay(Float.valueOf(delay)); p.setPresetDelayInUse("delay_toggle", false); Toast.makeText(context, String.format("Set audio delay at %d ms", delay), Toast.LENGTH_SHORT).show(); } }; } else if("delay_toggle".equals(button)) { return new DelayPresetButton(button, R.drawable.ic_media_delay_preset_cycle, R.string.desc_button_delay_toggle) { @Override public void onSendCommand(MediaServer m, Preferences p, Context context, boolean isPresetOn) { int subtitleDelay = !isPresetOn ? p.getSubtitleDelayToggle(): 0; int audioDelay = !isPresetOn ? p.getAudioDelayToggle() : 0; m.status().command.playback.subtitleDelay(Float.valueOf(subtitleDelay)); m.status().command.playback.audioDelay(Float.valueOf(audioDelay)); p.setPresetDelayInUse("subtitle_delay_toggle", !isPresetOn); p.setPresetDelayInUse("audio_delay_toggle", !isPresetOn); Toast.makeText(context, String.format("Set subtitle delay at %d ms and audio delay at %d ms", subtitleDelay, audioDelay), Toast.LENGTH_SHORT).show(); } }; } return null; } /** * Send the command performed by the given button * @param server Media server * @param context Context * @param key Preference button key e.g. {@link Preferences#KEY_BUTTON_FIRST} */ public static void sendCommand(MediaServer server, Context context, String key) { getButton(key, Preferences.get(context)).sendCommand(server, context); } /** * Setup the Menu with an icon and title for each of the menu action buttons * @param menu Menu * @param pref Preferences to fetch the ordinal button actions */ public static void setupMenu(Menu menu, Preferences pref) { setupMenuItem(menu.findItem(R.id.menu_action_button_first), pref); setupMenuItem(menu.findItem(R.id.menu_action_button_second), pref); setupMenuItem(menu.findItem(R.id.menu_action_button_third), pref); setupMenuItem(menu.findItem(R.id.menu_action_button_fourth), pref); setupMenuItem(menu.findItem(R.id.menu_action_button_fifth), pref); } /** * Setup the menu item with an icon and title based on the users button * preference * @param item Ordinal Menu Item * @param pref Preferences */ private static void setupMenuItem(MenuItem item, Preferences pref) { Button b = getButton(item.getItemId(), pref); item.setIcon(b.getIconId()); item.setTitle(b.getContentDescriptionId()); } }