package de.tum.in.tumcampusapp.activities;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;
import com.google.common.base.Optional;
import java.io.File;
import java.util.List;
import java.util.Map;
import de.tum.in.tumcampusapp.R;
import de.tum.in.tumcampusapp.activities.generic.ActivityForLoadingInBackground;
import de.tum.in.tumcampusapp.auxiliary.NetUtils;
import de.tum.in.tumcampusapp.auxiliary.Utils;
import de.tum.in.tumcampusapp.fragments.ImageViewTouchFragment;
import de.tum.in.tumcampusapp.fragments.WeekViewFragment;
import de.tum.in.tumcampusapp.models.tumo.Geo;
import de.tum.in.tumcampusapp.tumonline.TUMRoomFinderRequest;
/**
* Displays the map regarding the searched room.
*/
public class RoomFinderDetailsActivity extends ActivityForLoadingInBackground<Void, Optional<File>> implements DialogInterface.OnClickListener {
public static final String EXTRA_ROOM_INFO = "roomInfo";
public static final String EXTRA_LOCATION = "location";
private ImageViewTouchFragment mImage;
private boolean mapsLoaded;
private TUMRoomFinderRequest request;
private NetUtils net;
private Bundle roomInfo;
private String mapId = "";
private List<Map<String, String>> mapsList;
private boolean infoLoaded;
private Fragment fragment;
public RoomFinderDetailsActivity() {
super(R.layout.activity_roomfinderdetails);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
net = new NetUtils(this);
mImage = ImageViewTouchFragment.newInstance();
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, mImage).commit();
roomInfo = getIntent().getExtras().getBundle(EXTRA_ROOM_INFO);
if (roomInfo == null) {
Utils.showToast(this, "No room information passed");
this.finish();
return;
}
request = new TUMRoomFinderRequest(this);
startLoading();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_roomfinder_detail, menu);
MenuItem switchMap = menu.findItem(R.id.action_switch_map);
switchMap.setVisible(!"10".equals(mapId) && mapsLoaded && fragment == null);
MenuItem timetable = menu.findItem(R.id.action_room_timetable);
timetable.setVisible(infoLoaded);
timetable.setIcon(fragment == null ? R.drawable.ic_room_timetable : R.drawable.ic_action_map);
menu.findItem(R.id.action_directions).setVisible(infoLoaded && fragment == null);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int i = item.getItemId();
if (i == R.id.action_room_timetable) {
getRoomTimetable();
supportInvalidateOptionsMenu();
return true;
} else if (i == R.id.action_directions) {
getDirections();
return true;
} else if (i == R.id.action_switch_map) {
showMapSwitch();
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
// Remove fragment with room timetable if present and show map again
if (fragment != null) {
getRoomTimetable();
supportInvalidateOptionsMenu();
return;
}
super.onBackPressed();
}
private void getRoomTimetable() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Remove if fragment is already present
if (fragment != null) {
ft.replace(R.id.fragment_container, mImage);
ft.commit();
fragment = null;
return;
}
String roomApiCode = roomInfo.getString(TUMRoomFinderRequest.KEY_ROOM_ID);
fragment = WeekViewFragment.newInstance(roomApiCode);
ft.replace(R.id.fragment_container, fragment);
ft.commit();
}
private void showMapSwitch() {
CharSequence[] list = new CharSequence[mapsList.size()];
int curPos = 0;
for (int i = 0; i < mapsList.size(); i++) {
list[i] = mapsList.get(i).get(TUMRoomFinderRequest.KEY_DESCRIPTION);
if (mapsList.get(i).get(TUMRoomFinderRequest.KEY_MAP_ID).equals(mapId)) {
curPos = i;
}
}
new AlertDialog.Builder(this).setSingleChoiceItems(list, curPos, this).show();
}
@Override
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
int selectedPosition = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
mapId = mapsList.get(selectedPosition).get(TUMRoomFinderRequest.KEY_MAP_ID);
startLoading();
}
private void getDirections() {
new Thread(new Runnable() {
@Override
public void run() {
final Optional<Geo> geo = request.fetchCoordinates(roomInfo.getString(TUMRoomFinderRequest.KEY_ARCH_ID));
if (!geo.isPresent()) {
Utils.showToastOnUIThread(RoomFinderDetailsActivity.this, R.string.no_map_available);
return;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
// Build get directions intent and see if some app can handle it
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + geo.get().getLatitude() + ',' + geo.get().getLongitude()));
List<ResolveInfo> pkgAppsList = getApplicationContext().getPackageManager().queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);
// If some app can handle this intent start it
if (!pkgAppsList.isEmpty()) {
startActivity(intent);
return;
}
// If no app is capable of opening it link to google maps market entry
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps")));
} catch (ActivityNotFoundException e) {
Utils.log(e);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.apps.maps")));
}
}
});
}
}).start();
}
@Override
protected Optional<File> onLoadInBackground(Void... arg) {
String archId = roomInfo.getString(TUMRoomFinderRequest.KEY_ARCH_ID);
String url;
if (mapId == null || mapId.isEmpty()) {
url = TUMRoomFinderRequest.fetchDefaultMap(archId);
} else {
url = TUMRoomFinderRequest.fetchMap(archId, mapId);
}
return net.downloadImage(url);
}
@Override
protected void onLoadFinished(Optional<File> result) {
if (!result.isPresent()) {
if (NetUtils.isConnected(this)) {
showErrorLayout();
} else {
showNoInternetLayout();
}
return;
}
infoLoaded = true;
supportInvalidateOptionsMenu();
//Update the fragment
mImage = ImageViewTouchFragment.newInstance(result.get());
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, mImage).commit();
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(roomInfo.getString(TUMRoomFinderRequest.KEY_ROOM_TITLE));
getSupportActionBar().setSubtitle(roomInfo.getString(TUMRoomFinderRequest.KEY_BUILDING_TITLE));
}
showLoadingEnded();
new Thread(new Runnable() {
@Override
public void run() {
mapsList = request.fetchAvailableMaps(roomInfo.getString(TUMRoomFinderRequest.KEY_ARCH_ID));
if (mapsList.size() > 1) {
mapsLoaded = true;
runOnUiThread(new Runnable() {
@Override
public void run() {
supportInvalidateOptionsMenu();
}
});
}
}
}).start();
}
}