/* * 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.map; import android.app.Fragment; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; import ch.ethz.dcg.jukefox.commons.utils.JoinableThread; import ch.ethz.dcg.jukefox.commons.utils.Log; import ch.ethz.dcg.jukefox.manager.AndroidSettingsManager; import ch.ethz.dcg.jukefox.model.collection.BaseAlbum; import ch.ethz.dcg.jukefox.model.libraryimport.ImportState; import ch.ethz.dcg.pancho3.R; import ch.ethz.dcg.pancho3.commons.settings.ISettingsReader; import ch.ethz.dcg.pancho3.controller.eventhandlers.MapEventListener; 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.presenter.map.MapPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.map.MapPresenter.IMapView; import ch.ethz.dcg.pancho3.view.tabs.MapActivity; import ch.ethz.dcg.pancho3.view.tabs.opengl.GLView; import ch.ethz.dcg.pancho3.view.tabs.opengl.MapRenderer; /** * Fragment to display a map of albums. */ public class MapSelectionFragment extends Fragment implements IMapView { public static final String TAG = MapActivity.class.getSimpleName(); private ViewGroup mainViewContainer; private View mainView; private GLView glView; private MapRenderer mapRenderer; private MapEventListener eventListener; private ISettingsReader settings; private ImportState importState; private MapPresenter presenter; private View selectRegionButton; private boolean running = false; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (mainViewContainer == null) { mainViewContainer = new FrameLayout(getActivity()); settings = AndroidSettingsManager.getAndroidSettingsReader(); importState = JukefoxApplication.getCollectionModel().getLibraryImportManager().getImportState(); mapRenderer = new MapRenderer(settings, JukefoxApplication.getCollectionModel(), importState, getActivity(), null, null); } return mainViewContainer; } @Override public void stopSelectingRegion() { eventListener.stopCreatingRegionPlaylist(); selectRegionButton.setVisibility(View.VISIBLE); } private void checkAppStatus() { if (importState.isImporting() && !importState.isMapDataCommitted()) { // showStatusInfo(getString(R.string.map_not_yet_loaded)); } else if (importState.isImporting() && !importState.isCoversFetched()) { // showStatusInfo(getString(R.string.covers_not_yet_fetched)); } else if (mapRenderer.getAlbums().size() == 0) { //StatusInfo.showInfo(getActivity(), getString(R.string.no_song_coordinates)); } } private void registerTouchEventListener() { mainView.findViewById(R.id.zoomBar).setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return eventListener.onZoomBarTouch(v, event); } }); mainView.findViewById(R.id.zoomIn).setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return eventListener.onZoomInTouch(v, event); } }); mainView.findViewById(R.id.zoomOut).setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return eventListener.onZoomOutTouch(v, event); } }); selectRegionButton = mainView.findViewById(R.id.selectregionbutton); selectRegionButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { getActivity().startActionMode(presenter); selectRegionButton.setVisibility(View.INVISIBLE); eventListener.startCreatingRegionPlaylist(); } }); } @Override public void onPause() { super.onPause(); stopRunning(); } private void stopRunning() { if (running) { running = false; if (eventListener != null) { eventListener.onPause(); } if (mapRenderer != null) { mapRenderer.onPause(); } if (glView != null) { glView.onPause(); } } } private void startRunning() { if (!running) { running = true; InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mainViewContainer.getWindowToken(), 0); mainViewContainer.removeAllViews(); mainView = LayoutInflater.from(getActivity()).inflate(R.layout.tablet_mapfragment, null); mainViewContainer.addView(mainView); registerTouchEventListener(); //checkAppStatus(); mapRenderer.onResume(); initGlView(); glView.onResume(); checkIfHideZoomBar(); new AsyncTask<Void, Void, TabletFactory>() { @Override protected TabletFactory doInBackground(Void... params) { TabletFactoryGetter tabletFactoryGetter = (TabletFactoryGetter) getActivity(); while (!tabletFactoryGetter.isTabletFactoryReady()) { try { JoinableThread.sleep(10); } catch (InterruptedException e) { } } return tabletFactoryGetter.getTabletFactory(); } @Override protected void onPostExecute(TabletFactory tabletFactory) { presenter = tabletFactory.getMapPresenter(); mapRenderer.setCurrentAlbumProvider(presenter); eventListener = tabletFactory.getTabletMapEventListener(mapRenderer); presenter.setMap(MapSelectionFragment.this); presenter.viewFinishedInit(); boolean kineticMovement = settings.isKineticMovement(); eventListener.setKineticMovement(kineticMovement); } }.execute(); } } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (hidden) { stopRunning(); } else { startRunning(); } } @Override public void onResume() { super.onResume(); startRunning(); } private void initGlView() { glView = (GLView) mainView.findViewById(R.id.glview); glView.setRenderer(mapRenderer); glView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return eventListener.onGlTouch(v, event); } }); } private void checkIfHideZoomBar() { boolean showZoomBar = settings.isShowZoomBar(); if (!showZoomBar) { mainView.findViewById(R.id.zoomBar).setVisibility(View.GONE); } else { mainView.findViewById(R.id.zoomBar).setVisibility(View.VISIBLE); } } public void setCameraPosition() { float posX = settings.getLastPositionInPcaMapX(); float posZ = settings.getLastPositionInPcaMapY(); // Only set map to last position if no album is set to go to mapRenderer.getCamera().setCameraPosition(posX, MapRenderer.DEFAULT_CAMERA_HEIGHT, posZ, false); Log.v(TAG, "Set camera to position x: " + posX + " y: " + posZ); } @Override public void onDestroyView() { super.onDestroyView(); if (glView != null) { glView.onPause(); } } @Override public void goToAlbum(BaseAlbum album) { mapRenderer.goToAlbum(album); } @Override public void newCurrentAlbum() { mapRenderer.newCurrentAlbum(); } }