/* * 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.view.overlays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.SeekBar; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; import ch.ethz.dcg.jukefox.playmode.smartshuffle.agents.AbstractRecentAgent; import ch.ethz.dcg.jukefox.playmode.smartshuffle.agents.AbstractRepetitionAgent; import ch.ethz.dcg.jukefox.playmode.smartshuffle.agents.AgentManager.AgentType; import ch.ethz.dcg.jukefox.playmode.smartshuffle.agents.ArtistRepetitionAgent; import ch.ethz.dcg.jukefox.playmode.smartshuffle.agents.IAgent; import ch.ethz.dcg.jukefox.playmode.smartshuffle.agents.SongRepetitionAgent; import ch.ethz.dcg.pancho3.R; public class ComplexAgentsMenu extends AbstractAgentsMenu { private Map<SeekBar, IAgent> seekBarToAgent; @Override protected void onCreate(Bundle savedInstanceState) { seekBarToAgent = new HashMap<SeekBar, IAgent>(); super.onCreate(savedInstanceState); } @Override protected void createAgentBars(AgentType agentType, List<IAgent> agents) { TableLayout agentsTable = (TableLayout) findViewById(R.id.layout_agents); TableRow mainRow = new TableRow(this); mainRow.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); mainRow.setPadding(0, 10, 0, 0); { TextView mainTitle = new TextView(this); mainTitle.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, (agents.size() == 1) ? LayoutParams.MATCH_PARENT : android.app.ActionBar.LayoutParams.WRAP_CONTENT, 1.0f)); mainTitle.setGravity(Gravity.CENTER_VERTICAL); mainTitle.setText(getGroupTitle(agentType)); mainRow.addView(mainTitle); } agentsTable.addView(mainRow); if (agents.size() == 1) { // Show a one-liner SeekBar seekBar = createSeekBar(); seekBarToAgent.put(seekBar, agents.get(0)); mainRow.addView(seekBar); } else { // Sort the agents Collections.sort(agents, new Comparator<IAgent>() { @Override public int compare(IAgent left, IAgent right) { return getSubTitle(left).compareTo(getSubTitle(right)); } }); // Add placeholder to finish main row View placeHolder = new View(this); placeHolder.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, 0)); mainRow.addView(placeHolder); // Add row for every agent for (IAgent agent : agents) { TableRow row = new TableRow(this); row.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); { // Create text TextView subTitle = new TextView(this); subTitle.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, 1.0f)); subTitle.setPadding(30, 0, 0, 0); subTitle.setGravity(Gravity.CENTER_VERTICAL); subTitle.setText(getSubTitle(agent)); // Create seek bar SeekBar seekBar = createSeekBar(); seekBarToAgent.put(seekBar, agent); seekBar.setMax(10000); row.addView(subTitle); row.addView(seekBar); } agentsTable.addView(row); } } } /** * Returns the sub-title for the given agent. * * @param agent * The agent * @return The sub-title */ private String getSubTitle(IAgent agent) { switch (agent.getAgentType()) { case Random: /* Only one instance of a random agent should be there (and therefore getSubTitle() not be called), * if not, make a distinction of the instances */ assert false; return ""; case Repetition: AbstractRepetitionAgent repAgent = (AbstractRepetitionAgent) agent; if (repAgent.getRepetitionType().equals(SongRepetitionAgent.REPETITION_TYPE)) { return getString(R.string.agent_subtitle_repetition_song); } else if (repAgent.getRepetitionType().equals(ArtistRepetitionAgent.REPETITION_TYPE)) { return getString(R.string.agent_subtitle_repetition_artist); } else { assert false; return ""; } case Suggested: case Top: AbstractRecentAgent recAgent = (AbstractRecentAgent) agent; switch (recAgent.getTimeFilter()) { case DAY_OF_THE_WEEK: return getString(R.string.agent_subtitle_recent_day_of_the_week); case HOUR_OF_THE_DAY: return getString(R.string.agent_subtitle_recent_hour_of_the_day); case RECENTLY: return getString(R.string.agent_subtitle_recent_recently); case NONE: return getString(R.string.agent_subtitle_recent_overall); default: assert false; return ""; } default: assert false; return ""; } } @Override protected void setSeekBarPositions() { for (Map.Entry<SeekBar, IAgent> entry : seekBarToAgent.entrySet()) { setSeekBarPosition(entry.getKey(), agentManager.getAgentWeight(entry.getValue())); } } @Override protected Collection<SeekBar> getSeekBars() { return seekBarToAgent.keySet(); } @Override protected void onSeekBarsChanged(Map<SeekBar, Double> weights) { final Map<IAgent, Double> agentWeights = new HashMap<IAgent, Double>(weights.size()); for (Map.Entry<SeekBar, Double> entry : weights.entrySet()) { final IAgent agent = seekBarToAgent.get(entry.getKey()); agentWeights.put(agent, entry.getValue()); } // save the weights agentManager.setAgentWeights(agentWeights); } @Override protected double getSeekBarStretchFactor() { return 4.0d; } }