/*
* Geopaparazzi - Digital field mapping on Android based devices
* Copyright (C) 2016 HydroloGIS (www.hydrologis.com)
*
* This program 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
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.geopaparazzi.core.ui.activities;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.nfc.NfcAdapter;
import android.nfc.NfcEvent;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TreeSet;
import eu.geopaparazzi.library.core.ResourcesManager;
import eu.geopaparazzi.library.core.maps.SpatialiteMap;
import eu.geopaparazzi.library.database.GPLog;
import eu.geopaparazzi.library.database.Image;
import eu.geopaparazzi.library.network.NetworkUtilities;
import eu.geopaparazzi.library.plugin.ExtensionPoints;
import eu.geopaparazzi.library.plugin.PluginLoaderListener;
import eu.geopaparazzi.library.plugin.menu.IMenuLoader;
import eu.geopaparazzi.library.plugin.menu.MenuLoader;
import eu.geopaparazzi.library.plugin.style.StyleHelper;
import eu.geopaparazzi.library.plugin.types.IMenuEntry;
import eu.geopaparazzi.library.util.FileUtilities;
import eu.geopaparazzi.library.util.GPDialogs;
import eu.geopaparazzi.library.util.IActivitySupporter;
import eu.geopaparazzi.library.util.LibraryConstants;
import eu.geopaparazzi.library.util.StringAsyncTask;
import eu.geopaparazzi.library.util.TimeUtilities;
import eu.geopaparazzi.spatialite.database.spatial.SpatialiteSourcesManager;
import eu.geopaparazzi.core.GeopaparazziApplication;
import eu.geopaparazzi.core.R;
import eu.geopaparazzi.core.database.DaoBookmarks;
import eu.geopaparazzi.core.database.DaoImages;
import eu.geopaparazzi.core.database.objects.Bookmark;
import eu.geopaparazzi.core.ui.dialogs.GpxExportDialogFragment;
import eu.geopaparazzi.core.ui.dialogs.KmzExportDialogFragment;
import eu.geopaparazzi.core.ui.dialogs.StageExportDialogFragment;
import eu.geopaparazzi.core.utilities.Constants;
import static eu.geopaparazzi.library.util.LibraryConstants.DATABASE_ID;
/**
* Activity for export tasks.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class ExportActivity extends AppCompatActivity implements
NfcAdapter.CreateBeamUrisCallback, IActivitySupporter {
public static final int START_REQUEST_CODE = 666;
private NfcAdapter mNfcAdapter;
// List of URIs to provide to Android Beam
private Uri[] mFileUris = new Uri[1];
private PendingIntent pendingIntent;
private SparseArray<IMenuEntry> menuEntriesMap = new SparseArray<>();
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_export);
Toolbar toolbar = (Toolbar) findViewById(eu.geopaparazzi.core.R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
try {
checkNfc();
} catch (Exception e) {
GPLog.error(this, e.getLocalizedMessage(), e);
}
// Button cloudDataExportButton = (Button) findViewById(R.id.cloudDataExportButton);
// cloudDataExportButton.setOnClickListener(new Button.OnClickListener() {
// public void onClick(View v) {
// final ExportActivity context = ExportActivity.this;
// if (!NetworkUtilities.isNetworkAvailable(context)) {
// GPDialogs.infoDialog(context, context.getString(R.string.available_only_with_network), null);
// return;
// }
//
// SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
// final String user = preferences.getString(Constants.PREF_KEY_USER, "geopaparazziuser"); //$NON-NLS-1$
// final String pwd = preferences.getString(Constants.PREF_KEY_PWD, "geopaparazzipwd"); //$NON-NLS-1$
// final String serverUrl = preferences.getString(Constants.PREF_KEY_SERVER, ""); //$NON-NLS-1$
// if (serverUrl.length() == 0) {
// GPDialogs.infoDialog(context, getString(R.string.error_set_cloud_settings), null);
// return;
// }
//
// Intent webExportIntent = new Intent(ExportActivity.this, WebDataUploadListActivity.class);
// webExportIntent.putExtra(LibraryConstants.PREFS_KEY_URL, serverUrl);
// webExportIntent.putExtra(LibraryConstants.PREFS_KEY_USER, user);
// webExportIntent.putExtra(LibraryConstants.PREFS_KEY_PWD, pwd);
// List<SpatialiteMap> spatialiteMaps = SpatialiteSourcesManager.INSTANCE.getSpatialiteMaps();
// List<String> databases = new ArrayList<String>();
// for (int i = 0; i < spatialiteMaps.size(); i++) {
// String dbPath = spatialiteMaps.get(i).databasePath;
// if (!databases.contains(dbPath)) {
// databases.add(dbPath);
// }
// }
// webExportIntent.putExtra(DATABASE_ID, databases.toArray(new String[0]));
// startActivity(webExportIntent);
// }
// });
MenuLoader menuLoader = new MenuLoader(this, ExtensionPoints.MENU_EXPORT_PROVIDER);
menuLoader.addListener(new PluginLoaderListener<MenuLoader>() {
@Override
public void pluginLoaded(MenuLoader loader) {
addMenuEntries(loader.getEntries());
}
});
menuLoader.connect();
}
protected void addMenuEntries(List<IMenuEntry> entries) {
menuEntriesMap.clear();
int code = START_REQUEST_CODE + 1;
for (final eu.geopaparazzi.library.plugin.types.IMenuEntry entry : entries) {
final Context context = this;
Button button = new Button(context);
LinearLayout.LayoutParams lp = StyleHelper.styleButton(this, button);
button.setText(entry.getLabel());
entry.setRequestCode(code);
menuEntriesMap.put(code, entry);
LinearLayout container = (LinearLayout) findViewById(R.id.scrollView);
container.addView(button, lp);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
entry.onClick(ExportActivity.this);
}
});
}
}
private void checkNfc() throws Exception {
// Check for available NFC Adapter
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter != null) {
if (Build.VERSION.SDK_INT >
Build.VERSION_CODES.JELLY_BEAN_MR1) {
mNfcAdapter.setBeamPushUrisCallback(this, this);
File databaseFile = ResourcesManager.getInstance(this).getDatabaseFile();
mFileUris[0] = Uri.fromFile(databaseFile);
} else {
mNfcAdapter = null;
}
}
}
@Override
protected void onPause() {
super.onPause();
if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
}
@Override
public Uri[] createBeamUris(NfcEvent nfcEvent) {
GPLog.addLogEntry(this, "URI SENT: " + mFileUris[0]);
return mFileUris;
}
public void onResume() {
super.onResume();
if (mNfcAdapter != null)
mNfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
// Check to see that the Activity started due to an Android Beam
String action = getIntent().getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
GPLog.addLogEntry(this, "Incoming NFC event.");
processIntent(getIntent());
}
}
@Override
public void onNewIntent(Intent intent) {
// onResume gets called after this to handle the intent
setIntent(intent);
}
void processIntent(Intent intent) {
Uri beamUri = intent.getData();
String path = beamUri.getPath();
GPLog.addLogEntry(this, "Incoming URI path: " + path);
if (TextUtils.equals(beamUri.getScheme(), "file") &&
path.endsWith("gpap")) {
System.out.println(path);
File pathFile = new File(path);
boolean exists = pathFile.exists();
System.out.println(exists);
}
}
@Override
public Context getContext() {
return this;
}
}