// MainActivity.java // Hosts the GeopaparazziActivityFragment on a phone and both the // GeopaparazziActivityFragment and SettingsActivityFragment on a tablet package eu.geopaparazzi.core; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.KeyEvent; import org.json.JSONException; import java.io.IOException; import eu.geopaparazzi.core.database.DaoBookmarks; import eu.geopaparazzi.core.mapview.MapviewActivity; import eu.geopaparazzi.core.ui.fragments.GeopaparazziActivityFragment; import eu.geopaparazzi.core.utilities.IApplicationChangeListener; import eu.geopaparazzi.library.database.GPLog; import eu.geopaparazzi.library.forms.TagsManager; import eu.geopaparazzi.library.gps.GpsServiceUtilities; import eu.geopaparazzi.library.permissions.IChainedPermissionHelper; import eu.geopaparazzi.library.permissions.PermissionWriteStorage; import eu.geopaparazzi.library.profiles.ProfilesHandler; import eu.geopaparazzi.library.util.GPDialogs; import eu.geopaparazzi.library.util.LibraryConstants; import eu.geopaparazzi.library.util.PositionUtilities; import eu.geopaparazzi.library.util.SimplePosition; import eu.geopaparazzi.library.util.UrlUtilities; import eu.geopaparazzi.mapsforge.BaseMapSourcesManager; import eu.geopaparazzi.spatialite.database.spatial.SpatialiteSourcesManager; import eu.geopaparazzi.core.R; import static eu.geopaparazzi.library.util.LibraryConstants.PREFS_KEY_DATABASE_TO_LOAD; /** * Main activity. * * @author Andrea Antonello (www.hydrologis.com) */ public class GeopaparazziCoreActivity extends AppCompatActivity implements IApplicationChangeListener { private IChainedPermissionHelper permissionHelper = new PermissionWriteStorage(); private GeopaparazziActivityFragment geopaparazziActivityFragment; // configure the GeopaparazziCoreActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_geopaparazzi); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); checkIncomingProject(); if (Build.VERSION.SDK_INT >= 23) { // PERMISSIONS START if (permissionHelper.hasPermission(this) && permissionHelper.getNextWithoutPermission(this) == null) { init(); checkIncomingUrl(); checkAvailableProfiles(); } else { if (permissionHelper.hasPermission(this)) { permissionHelper = permissionHelper.getNextWithoutPermission(this); } permissionHelper.requestPermission(this); } // PERMISSIONS STOP } else { init(); checkIncomingUrl(); checkAvailableProfiles(); } } private void init() { // set default values in the app's SharedPreferences PreferenceManager.setDefaultValues(this, R.xml.preferences, false); geopaparazziActivityFragment = new GeopaparazziActivityFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragmentContainer, geopaparazziActivityFragment); transaction.commitAllowingStateLoss(); } private void checkIncomingProject() { Uri data = getIntent().getData(); if (data != null) { String path = data.getEncodedPath(); if (path.endsWith(LibraryConstants.GEOPAPARAZZI_DB_EXTENSION)) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = preferences.edit(); editor.putString(PREFS_KEY_DATABASE_TO_LOAD, path); editor.apply(); } } } private void checkAvailableProfiles() { try { ProfilesHandler.INSTANCE.checkActiveProfile(getContentResolver()); BaseMapSourcesManager.INSTANCE.forceBasemapsreRead(); SpatialiteSourcesManager.INSTANCE.forceSpatialitemapsreRead(); } catch (JSONException e) { e.printStackTrace(); } } private void checkIncomingUrl() { Uri data = getIntent().getData(); if (data != null) { final String path = data.toString(); // try osm final SimplePosition simplePosition = UrlUtilities.getLatLonTextFromOsmUrl(path); if (simplePosition.latitude != null) { GPDialogs.yesNoMessageDialog(this, getString(R.string.import_bookmark_prompt), new Runnable() { @Override public void run() { GeopaparazziCoreActivity activity = GeopaparazziCoreActivity.this; try { DaoBookmarks.addBookmark(simplePosition.longitude, simplePosition.latitude, simplePosition.text, simplePosition.zoomLevel, -1, -1, -1, -1); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity); PositionUtilities.putMapCenterInPreferences(preferences, simplePosition.longitude, simplePosition.latitude, 16); Intent mapIntent = new Intent(activity, MapviewActivity.class); startActivity(mapIntent); } catch (IOException e) { GPLog.error(this, "Error parsing URI: " + path, e); //$NON-NLS-1$ GPDialogs .warningDialog( activity, "Unable to parse the url: " + path, null); } } }, null); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (permissionHelper.hasGainedPermission(requestCode, grantResults)) { IChainedPermissionHelper nextWithoutPermission = permissionHelper.getNextWithoutPermission(this); permissionHelper = nextWithoutPermission; if (permissionHelper == null) { init(); } else { permissionHelper.requestPermission(this); } } else { GPDialogs.infoDialog(this, getString(R.string.premissions_cant_start) + permissionHelper.getDescription(), new Runnable() { @Override public void run() { finish(); } }); } } // called after onCreate completes execution @Override protected void onStart() { super.onStart(); } public boolean onKeyDown(int keyCode, KeyEvent event) { // force to exit through the exit button // System.out.println(keyCode + "/" + KeyEvent.KEYCODE_BACK); switch (keyCode) { case KeyEvent.KEYCODE_BACK: return true; } return super.onKeyDown(keyCode, event); } @Override public void onApplicationNeedsRestart() { if (geopaparazziActivityFragment != null && geopaparazziActivityFragment.getGpsServiceBroadcastReceiver() != null) { GpsServiceUtilities.stopDatabaseLogging(this); GpsServiceUtilities.stopGpsService(this); GpsServiceUtilities.unregisterFromBroadcasts(this, geopaparazziActivityFragment.getGpsServiceBroadcastReceiver()); } Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { if (Build.VERSION.SDK_INT >= 11) { recreate(); } else { Intent intent = getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); finish(); overridePendingTransition(0, 0); startActivity(intent); overridePendingTransition(0, 0); } } }, 10); } @Override public void onAppIsShuttingDown() { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor edit = preferences.edit(); edit.putFloat(MapviewActivity.MAPSCALE_X, 1); edit.putFloat(MapviewActivity.MAPSCALE_Y, 1); edit.apply(); GpsServiceUtilities.stopDatabaseLogging(this); GpsServiceUtilities.stopGpsService(this); TagsManager.reset(); GeopaparazziApplication.reset(); } }