package com.michaldabski.panoramio.photo_activity; import android.annotation.SuppressLint; import android.app.ActionBar; import android.app.Activity; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.app.NavUtils; import android.support.v4.view.ViewPager; import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.michaldabski.panoramio.R; import com.michaldabski.panoramio.models.Photo; import com.michaldabski.panoramio.utils.MiscUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PhotoActivity extends Activity implements ViewPager.OnPageChangeListener, GoogleMap.OnMarkerClickListener, View.OnSystemUiVisibilityChangeListener { public static final String ARG_PHOTOS_ARRAY = "photos", ARG_SELECTED_INDEX = "selected_photo"; private static final String STATE_FULLSCREEN = "fullscreen", STATE_MAP_VISIBILITY = "map_visibility"; private static final float MAP_ZOOM_LEVEL = 15f; @SuppressLint("InlinedApi") private static final int FULLSCREEN_UI_VISIBILITY_FLAGS = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; ViewPager viewPager; List<Photo> photos; MapFragment mapFragment; Map<Marker, Photo> markerPhotoMap; private boolean fullscreen = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo); setupActionbar(getActionBar()); Bundle extras = getIntent().getExtras(); Parcelable[] parcelableArray = extras.getParcelableArray(ARG_PHOTOS_ARRAY); markerPhotoMap = new HashMap<Marker, Photo>(parcelableArray.length); photos = new ArrayList<Photo>(parcelableArray.length); for (Parcelable parcelable : parcelableArray) photos.add((Photo) parcelable); viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setPageTransformer(true, new PhotoPageTransformer()); viewPager.setAdapter(new PhotoPagerAdapter(getFragmentManager(), photos)); viewPager.setOnPageChangeListener(this); // if activity just launched, show photo selected by user if (savedInstanceState == null) { viewPager.setCurrentItem(extras.getInt(ARG_SELECTED_INDEX)); findViewById(R.id.fragmentMap).setVisibility(View.GONE); } else { int visibility = savedInstanceState.getInt(STATE_MAP_VISIBILITY, View.GONE); //noinspection ResourceType findViewById(R.id.fragmentMap).setVisibility(visibility); if (savedInstanceState.getBoolean(STATE_FULLSCREEN)) enableFullscreen(); } setPhotoTitleAndAuthor(getActionBar(), photos.get(viewPager.getCurrentItem())); if (MiscUtils.isGooglePlayAvailable(this)) { mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.fragmentMap); if (mapFragment.getMap() != null) setupMap(mapFragment.getMap()); } } void setupActionbar(ActionBar actionBar) { if (actionBar == null) return; actionBar.setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.photos, menu); if (MiscUtils.isGooglePlayAvailable(this) == false) { menu.findItem(R.id.actionLocation).setVisible(false); } return true; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(STATE_MAP_VISIBILITY, findViewById(R.id.fragmentMap).getVisibility()); outState.putBoolean(STATE_FULLSCREEN, fullscreen); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; case R.id.actionLocation: View view = findViewById(R.id.fragmentMap); if (view.getVisibility() == View.VISIBLE) { view.setVisibility(View.GONE); mapFragment.setUserVisibleHint(false); } else { view.setVisibility(View.VISIBLE); mapFragment.setUserVisibleHint(true); int position = viewPager.getCurrentItem(); showPhotoLocation(photos.get(position), false); } return true; } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { if (findViewById(R.id.fragmentMap).getVisibility() == View.VISIBLE) findViewById(R.id.fragmentMap).setVisibility(View.GONE); else super.onBackPressed(); } @Override public void onPageScrolled(int i, float v, int i2) { } void setupMap(GoogleMap googleMap) { googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); googleMap.getUiSettings().setZoomControlsEnabled(false); googleMap.setOnMarkerClickListener(this); for (Photo photo : photos) { MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(photo.getLatitude(), photo.getLongitude())).title(photo.getPhotoTitle()); Marker marker = googleMap.addMarker(markerOptions); markerPhotoMap.put(marker, photo); } } void showPhotoLocation(Photo photo, boolean animate) { if (mapFragment == null) return; GoogleMap map = mapFragment.getMap(); if (map != null && findViewById(R.id.fragmentMap).getVisibility() == View.VISIBLE) { final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(photo.getLatitude(), photo.getLongitude()), MAP_ZOOM_LEVEL); if (animate) map.animateCamera(cameraUpdate); else map.moveCamera(cameraUpdate); for (Map.Entry<Marker, Photo> entry : markerPhotoMap.entrySet()) if (entry.getValue().equals(photo)) entry.getKey().showInfoWindow(); } } @Override public void onPageSelected(int position) { showPhotoLocation(photos.get(position), true); setPhotoTitleAndAuthor(getActionBar(), photos.get(position)); } void setPhotoTitleAndAuthor(ActionBar actionBar, Photo photo) { if (actionBar == null) return; actionBar.setTitle(photo.getPhotoTitle()); actionBar.setSubtitle(getString(R.string.by_s, photo.getOwnerName())); } @Override public void onPageScrollStateChanged(int i) { } @Override public boolean onMarkerClick(Marker marker) { Photo photo = markerPhotoMap.get(marker); if (photo != null) { int position = photos.indexOf(photo); viewPager.setCurrentItem(position, true); return true; } else return false; } public void disableFullScreen() { fullscreen = false; viewPager.setSystemUiVisibility(viewPager.getSystemUiVisibility() & ~FULLSCREEN_UI_VISIBILITY_FLAGS); } public void enableFullscreen() { fullscreen = true; viewPager.setOnSystemUiVisibilityChangeListener(this); viewPager.setSystemUiVisibility(FULLSCREEN_UI_VISIBILITY_FLAGS); findViewById(R.id.tvCopyright).setVisibility(View.GONE); } public boolean isFullscreen() { return fullscreen; } public boolean toggleFullscreen() { if (isFullscreen()) disableFullScreen(); else enableFullscreen(); return isFullscreen(); } @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) fullscreen = false; findViewById(R.id.tvCopyright).setVisibility(fullscreen?View.GONE:View.VISIBLE); } }