/*
* 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.tablet.view;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.SearchView;
import android.widget.Spinner;
import ch.ethz.dcg.jukefox.commons.utils.AndroidUtils;
import ch.ethz.dcg.pancho3.R;
import ch.ethz.dcg.pancho3.controller.eventhandlers.TabletActivityEventListener;
import ch.ethz.dcg.pancho3.model.JukefoxApplication;
import ch.ethz.dcg.pancho3.tablet.TabletFactory;
import ch.ethz.dcg.pancho3.tablet.TabletFactory.TabletFactoryGetter;
import ch.ethz.dcg.pancho3.tablet.ViewServer;
import ch.ethz.dcg.pancho3.tablet.presenter.TabletPresenter;
import ch.ethz.dcg.pancho3.tablet.presenter.TabletPresenter.IMainView;
import ch.ethz.dcg.pancho3.tablet.presenter.TabletPresenter.SelectionView;
import ch.ethz.dcg.pancho3.tablet.view.queue.QueueFragment;
import ch.ethz.dcg.pancho3.view.commons.JukefoxActivity;
/**
* The main activity of the tablet interface. Its interface has four main
* components: - The queue: The queue displays the play queue with the current
* song on top and the next songs below it. The queue supports dragging and
* swiping gestures and play control - The selection view: The space next to the
* queue is used for the selection view. Those can be different views for
* selecting music. Also drag&drop to the queue is supported. - The action bar:
* The interface supports the action bar from the honeycomb interface. One
* primary use case of the action bar are the tabs to select different selection
* views.
*/
public class TabletActivity extends JukefoxActivity implements TabletFactoryGetter, IMainView {
private boolean DEBUG = true;
public static final String TAG = TabletActivity.class.getSimpleName();
private TabletActivityEventListener eventListener;
private TabletPresenter presenter;
private TabletFactory tabletFactory;
private boolean displayMapMenuItem = true;
@Override
public void onDestroy() {
super.onDestroy();
if (DEBUG) {
ViewServer.get(this).removeWindow(this);
}
}
@Override
public void onResume() {
super.onResume();
if (DEBUG) {
ViewServer.get(this).setFocusedWindow(this);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.tablet_main);
if (DEBUG) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
ViewServer.get(this).addWindow(this);
}
final JukefoxApplication application = (JukefoxApplication) getApplication();
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
applicationState.waitForPlaybackFunctionality();
return null;
}
@Override
protected void onPostExecute(Void result) {
tabletFactory = new TabletFactory(TabletActivity.this, application);
presenter = tabletFactory.getTabletPresenter();
presenter.viewFinishedInit();
eventListener = tabletFactory.getEventListener();
if (!AndroidUtils.isSdCardOk()) {
eventListener.sdCardProblemDetected();
finish();
return;
}
if (applicationState.isFirstStart()) {
eventListener.detectedFirstStart();
}
((QueueFragment) getFragmentManager().findFragmentById(R.id.queue)).initialize();
}
}.execute();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
presenter.exploreAllAlbumsMaybe();
return true;
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (applicationState.isImporting()) {
showStatusInfo(getString(R.string.jukefox_is_currently_importing));
}
}
@Override
public void clearLocalUI() {
FragmentManager fragmentManager = getFragmentManager();
while (fragmentManager.getBackStackEntryCount() > 0) {
// We still have an overlay or search fragment. Remove it.
fragmentManager.popBackStackImmediate();
}
}
@Override
public void displayFragment(SelectionView selectionView) {
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(selectionView.getTag());
FragmentTransaction ft = fragmentManager.beginTransaction();
boolean needsCommit = true;
if (fragment == null) {
try {
fragment = selectionView.getFragmentClass().newInstance();
ft.add(R.id.viewmodeholder, fragment, selectionView.getTag());
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
} else if (fragment.isHidden()) {
ft.show(fragment);
} else {
needsCommit = false;
}
if (needsCommit) {
for (SelectionView otherView : SelectionView.values()) {
if (!otherView.equals(selectionView)) {
Fragment otherFragment = fragmentManager.findFragmentByTag(otherView.getTag());
if (otherFragment != null) {
ft.hide(otherFragment);
}
}
}
ft.commit();
}
}
/**
* We need a title bar since we have the action bar.
*/
@Override
protected boolean hideTitleBar() {
return false;
}
@Override
public TabletFactory getTabletFactory() {
return tabletFactory;
}
@Override
public boolean isTabletFactoryReady() {
return tabletFactory != null;
}
@Override
public void displayOverlay(Fragment overlayFragment) {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.viewmodeholder, overlayFragment);
fragmentTransaction.addToBackStack(getString(R.string.overlay_backstack_name));
fragmentTransaction.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
final SearchView searchView = new SearchView(this);
searchView.setOnSearchClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
searchView.setIconified(true);
presenter.displaySearch();
}
});
menu.add(R.string.search_menu_item_name).setOnMenuItemClickListener(
new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
presenter.displaySearch();
return true;
}
}).setActionView(searchView).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
if (displayMapMenuItem) {
menu.add("Music Map").setIcon(R.drawable.d169_map).setOnMenuItemClickListener(
new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
presenter.mapMaybe();
return true;
}
}).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
Spinner spinner = new Spinner(this);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.autofill_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
menu.add("Autofill").setActionView(spinner).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// + 1 because we auto fill the "coming up" songs, so the "now playing" song
// does not count.
tabletFactory.getMagicPlaylistController().setAutofillNumberOfSongs(
JukefoxApplication.getPlayerController(), position + 1);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (presenter.handleBackButton()) {
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public void updateActionBar(String title, boolean displayHomeAsUpEnabled,
boolean displayMapMenuItem, int iconResId) {
ActionBar actionBar = getActionBar();
actionBar.setTitle(title);
actionBar.setDisplayHomeAsUpEnabled(displayHomeAsUpEnabled);
//actionBar.setIcon(iconResId);
this.displayMapMenuItem = displayMapMenuItem;
invalidateOptionsMenu();
}
}