Refactor activities

This commit is contained in:
Victor Shcherb 2014-06-04 00:51:54 +02:00
parent 115924384f
commit dded78403b
12 changed files with 388 additions and 306 deletions

View file

@ -147,8 +147,6 @@
<activity android:name="net.osmand.plus.activities.search.SearchStreetByNameActivity"></activity> <activity android:name="net.osmand.plus.activities.search.SearchStreetByNameActivity"></activity>
<activity android:name="net.osmand.plus.activities.search.SearchStreet2ByNameActivity"></activity> <activity android:name="net.osmand.plus.activities.search.SearchStreet2ByNameActivity"></activity>
<activity android:name="net.osmand.plus.activities.search.SearchBuildingByNameActivity"></activity> <activity android:name="net.osmand.plus.activities.search.SearchBuildingByNameActivity"></activity>
<activity android:name="net.osmand.plus.sherpafy.TourCommonActivity"></activity>
<activity android:name="net.osmand.plus.sherpafy.SherpafySelectTourActivity" />
<activity android:name="net.osmand.plus.sherpafy.TourViewActivity" android:exported="true" android:launchMode= "singleInstance"/> <activity android:name="net.osmand.plus.sherpafy.TourViewActivity" android:exported="true" android:launchMode= "singleInstance"/>
<activity android:name="net.osmand.plus.activities.EditPOIFilterActivity"></activity> <activity android:name="net.osmand.plus.activities.EditPOIFilterActivity"></activity>
<activity android:name="net.osmand.plus.activities.search.GeoIntentActivity"> <activity android:name="net.osmand.plus.activities.search.GeoIntentActivity">

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal" >
<ProgressBar
android:id="@+id/ProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/ProgressMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loading_data"
android:textSize="22sp" />
</LinearLayout>
</FrameLayout>

View file

@ -1,22 +1,37 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_height="match_parent"> android:orientation="horizontal" >
<LinearLayout android:layout_width="wrap_content"
android:layout_height="wrap_content" <LinearLayout
android:layout_centerHorizontal="true" android:layout_width="0dp"
android:layout_centerVertical="true" android:layout_height="fill_parent"
android:orientation="horizontal"> android:layout_centerVertical="true"
<Button android:id="@+id/select_tour" android:layout_marginRight="10dp"
android:layout_marginRight="10dp" android:layout_weight="1" >
android:layout_width="120dp"
android:text="@string/select_tour" <Button
android:layout_height="wrap_content"/> android:id="@+id/select_tour"
<Button android:id="@+id/download_tour" android:layout_width="wrap_content"
android:layout_marginLeft="10dp" android:layout_height="wrap_content"
android:text="@string/download_tour" android:singleLine="true"
android:layout_width="120dp" android:text="@string/select_tour" />
android:layout_height="wrap_content"/>
</LinearLayout> </LinearLayout>
</RelativeLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_weight="1" >
<Button
android:id="@+id/download_tour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="@string/download_tour" />
</LinearLayout>
</LinearLayout>

View file

@ -5,24 +5,27 @@
android:orientation="vertical" > android:orientation="vertical" >
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginLeft="15dp"
android:layout_marginTop="10dp" android:layout_marginTop="5dp"
android:orientation="horizontal" > android:orientation="horizontal" >
<ToggleButton <ToggleButton
android:id="@+id/collapse" android:id="@+id/collapse"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textOn=""
android:textOff=""
android:button="@drawable/expandable_category" android:button="@drawable/expandable_category"
android:background="@null" /> android:background="@null" />
<TextView <TextView
android:id="@+id/tour_name"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginLeft="10dp" android:layout_marginLeft="5dp"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/select_tour" android:text="@string/select_tour"
android:textSize="21sp" /> android:textSize="21sp" />
@ -31,7 +34,6 @@
android:id="@+id/start_tour" android:id="@+id/start_tour"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="right"
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:text="@string/start_tour" /> android:text="@string/start_tour" />
</LinearLayout> </LinearLayout>
@ -42,7 +44,7 @@
android:layout_height="fill_parent" > android:layout_height="fill_parent" >
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
@ -58,7 +60,7 @@
<TextView <TextView
android:id="@+id/tour_description" android:id="@+id/tour_description"
android:layout_width="wrap_content" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
@ -76,7 +78,7 @@
<TextView <TextView
android:id="@+id/tour_fulldescription" android:id="@+id/tour_fulldescription"
android:layout_width="wrap_content" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textMultiLine" android:inputType="textMultiLine"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources> <resources>
<string name="selecting_tour_progress">"Selecting tour...</string> <string name="overview">Overview</string>
<string name="selecting_tour_progress">Selecting tour...</string>
<string name="no_stages_provided">No stages provided</string> <string name="no_stages_provided">No stages provided</string>
<string name="download_more">Download more</string> <string name="download_more">Download more</string>
<string name="no_tour_selected">No tour selected</string> <string name="no_tour_selected">No tour selected</string>

View file

@ -63,6 +63,7 @@ import android.util.TypedValue;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.LinearLayout.LayoutParams; import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -96,8 +97,7 @@ public class OsmandApplication extends Application {
OsmAndTaskManager taskManager; OsmAndTaskManager taskManager;
// start variables // start variables
private ProgressDialogImplementation startDialog; private ProgressImplementation startDialog;
private List<String> startingWarnings;
private Handler uiHandler; private Handler uiHandler;
private GPXFile gpxFileToDisplay; private GPXFile gpxFileToDisplay;
private SavingTrackHelper savingTrackHelper; private SavingTrackHelper savingTrackHelper;
@ -307,33 +307,31 @@ public class OsmandApplication extends Application {
public static final int PROGRESS_DIALOG = 5; public static final int PROGRESS_DIALOG = 5;
/**
* @param activity
* that supports onCreateDialog({@link #PROGRESS_DIALOG}) and returns @param progressdialog
* @param progressDialog
* - it should be exactly the same as onCreateDialog
* @return
*/
public void checkApplicationIsBeingInitialized(Activity activity, ProgressDialog progressDialog) { public void checkApplicationIsBeingInitialized(Activity activity, ProgressDialog progressDialog) {
// start application if it was previously closed // start application if it was previously closed
startApplication(); startApplication();
synchronized (OsmandApplication.this) { synchronized (OsmandApplication.this) {
if (startDialog != null) { if (startDialog != null) {
try {
SpecialPhrases.setLanguage(this, osmandSettings);
} catch (IOException e) {
LOG.error("I/O exception", e);
Toast error = Toast.makeText(this, "Error while reading the special phrases. Restart OsmAnd if possible",
Toast.LENGTH_LONG);
error.show();
}
progressDialog.setTitle(getString(R.string.loading_data)); progressDialog.setTitle(getString(R.string.loading_data));
progressDialog.setMessage(getString(R.string.reading_indexes)); progressDialog.setMessage(getString(R.string.reading_indexes));
activity.showDialog(PROGRESS_DIALOG); activity.showDialog(PROGRESS_DIALOG);
startDialog.setDialog(progressDialog); startDialog.setDialog(progressDialog);
} else if (startingWarnings != null) { } else {
showWarnings(startingWarnings, activity); progressDialog.dismiss();
}
}
}
public void checkApplicationIsBeingInitialized(Activity activity, TextView tv, ProgressBar progressBar,
Runnable onClose) {
// start application if it was previously closed
startApplication();
synchronized (OsmandApplication.this) {
if (startDialog != null ) {
tv.setText(getString(R.string.loading_data));
startDialog.setProgressBar(tv, progressBar, onClose);
} else if (onClose != null) {
onClose.run();
} }
} }
} }
@ -433,7 +431,7 @@ public class OsmandApplication extends Application {
if(dlg != null) { if(dlg != null) {
dlg.dismiss(); dlg.dismiss();
} }
showWarning(uiContext, e.getError()); showToastMessage(e.getError());
} }
} }
}).start(); }).start();
@ -513,7 +511,7 @@ public class OsmandApplication extends Application {
return; return;
} }
applicationInitializing = true; applicationInitializing = true;
startDialog = new ProgressDialogImplementation(this, null, false); startDialog = new ProgressImplementation(this, null, false);
startDialog.setRunnable("Initializing app", new Runnable() { //$NON-NLS-1$ startDialog.setRunnable("Initializing app", new Runnable() { //$NON-NLS-1$
@Override @Override
@ -530,6 +528,12 @@ public class OsmandApplication extends Application {
private void startApplicationBackground() { private void startApplicationBackground() {
List<String> warnings = new ArrayList<String>(); List<String> warnings = new ArrayList<String>();
try { try {
try {
SpecialPhrases.setLanguage(this, osmandSettings);
} catch (IOException e) {
LOG.error("I/O exception", e);
warnings.add("Error while reading the special phrases. Restart OsmAnd if possible");
}
if (!Version.isBlackberry(this)) { if (!Version.isBlackberry(this)) {
if (osmandSettings.NATIVE_RENDERING_FAILED.get()) { if (osmandSettings.NATIVE_RENDERING_FAILED.get()) {
osmandSettings.SAFE_MODE.set(true); osmandSettings.SAFE_MODE.set(true);
@ -574,17 +578,23 @@ public class OsmandApplication extends Application {
} finally { } finally {
synchronized (OsmandApplication.this) { synchronized (OsmandApplication.this) {
final ProgressDialog toDismiss; final ProgressDialog toDismiss;
final Runnable pb;
if (startDialog != null) { if (startDialog != null) {
toDismiss = startDialog.getDialog(); toDismiss = startDialog.getDialog();
pb = startDialog.getFinishRunnable();
} else { } else {
toDismiss = null; toDismiss = null;
pb = null;
} }
startDialog = null; startDialog = null;
if (toDismiss != null) { if (toDismiss != null || pb != null) {
uiHandler.post(new Runnable() { uiHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
if(pb != null) {
}
if (toDismiss != null) { if (toDismiss != null) {
// TODO handling this dialog is bad, we need a better standard way // TODO handling this dialog is bad, we need a better standard way
toDismiss.dismiss(); toDismiss.dismiss();
@ -592,38 +602,28 @@ public class OsmandApplication extends Application {
} }
} }
}); });
showWarnings(warnings, toDismiss.getContext()); }
} else { if (warnings != null && !warnings.isEmpty()) {
startingWarnings = warnings; showToastMessage(formatWarnings(warnings).toString());
} }
} }
} }
} }
protected void showWarnings(List<String> warnings, final Context uiContext) { private StringBuilder formatWarnings(List<String> warnings) {
if (warnings != null && !warnings.isEmpty()) { final StringBuilder b = new StringBuilder();
final StringBuilder b = new StringBuilder(); boolean f = true;
boolean f = true; for (String w : warnings) {
for (String w : warnings) { if (f) {
if (f) { f = false;
f = false; } else {
} else { b.append('\n');
b.append('\n');
}
b.append(w);
} }
showWarning(uiContext, b.toString()); b.append(w);
} }
return b;
} }
private void showWarning(final Context uiContext, final String b) {
uiHandler.post(new Runnable() {
@Override
public void run() {
AccessibleToast.makeText(uiContext, b, Toast.LENGTH_LONG).show();
}
});
}
private class DefaultExceptionHandler implements UncaughtExceptionHandler { private class DefaultExceptionHandler implements UncaughtExceptionHandler {

View file

@ -7,8 +7,10 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnCancelListener;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.widget.ProgressBar;
import android.widget.TextView;
public class ProgressDialogImplementation implements IProgress { public class ProgressImplementation implements IProgress {
private static final int HANDLER_START_TASK = OsmAndConstants.UI_HANDLER_PROGRESS + 1; private static final int HANDLER_START_TASK = OsmAndConstants.UI_HANDLER_PROGRESS + 1;
private static final int HADLER_UPDATE_PROGRESS = OsmAndConstants.UI_HANDLER_PROGRESS + 2; private static final int HADLER_UPDATE_PROGRESS = OsmAndConstants.UI_HANDLER_PROGRESS + 2;
@ -22,54 +24,70 @@ public class ProgressDialogImplementation implements IProgress {
private Thread run; private Thread run;
private Context context; private Context context;
private ProgressDialog dialog = null; private ProgressDialog dialog = null;
private ProgressBar progressBar = null;
private Runnable finishRunnable = null;
private final boolean cancelable; private final boolean cancelable;
private TextView tv;
public ProgressDialogImplementation(Context ctx, ProgressDialog dlg, boolean cancelable){ public ProgressImplementation(Context ctx, ProgressDialog dlg, boolean cancelable) {
this.cancelable = cancelable; this.cancelable = cancelable;
context = ctx; context = ctx;
setDialog(dlg); setDialog(dlg);
mViewUpdateHandler = new Handler(){ mViewUpdateHandler = new Handler() {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
super.handleMessage(msg); super.handleMessage(msg);
if(dialog != null){
switch (msg.what) { switch (msg.what) {
case HANDLER_START_TASK: case HANDLER_START_TASK:
dialog.setMessage(message); if (dialog != null) {
if (isIndeterminate()) { dialog.setMessage(message);
dialog.setMax(1); if (isIndeterminate()) {
dialog.setIndeterminate(true); dialog.setMax(1);
} else { dialog.setIndeterminate(true);
dialog.setIndeterminate(false); } else {
dialog.setMax(work); dialog.setIndeterminate(false);
} dialog.setMax(work);
dialog.show(); }
break; dialog.show();
case HADLER_UPDATE_PROGRESS:
dialog.setProgress(msg.arg1);
break;
} }
if (tv != null) {
tv.setText(message);
}
if (progressBar != null) {
if (isIndeterminate()) {
progressBar.setMax(1);
progressBar.setIndeterminate(true);
} else {
progressBar.setIndeterminate(false);
progressBar.setMax(work);
}
}
break;
case HADLER_UPDATE_PROGRESS:
if (dialog != null) {
dialog.setProgress(msg.arg1);
} else if (progressBar != null) {
progressBar.setProgress(msg.arg1);
}
break;
} }
} }
}; };
} }
public ProgressDialogImplementation(ProgressDialog dlg, boolean cancelable){ public ProgressImplementation(ProgressDialog dlg, boolean cancelable){
this(dlg.getContext(), dlg, cancelable); this(dlg.getContext(), dlg, cancelable);
} }
public ProgressDialogImplementation(final ProgressDialog dlg){
this(dlg, false);
}
public static ProgressDialogImplementation createProgressDialog(Context ctx, String title, String message, int style) { public static ProgressImplementation createProgressDialog(Context ctx, String title, String message, int style) {
return createProgressDialog(ctx, title, message, style, null); return createProgressDialog(ctx, title, message, style, null);
} }
public static ProgressDialogImplementation createProgressDialog(Context ctx, String title, String message, int style, final DialogInterface.OnCancelListener listener) { public static ProgressImplementation createProgressDialog(Context ctx, String title, String message, int style, final DialogInterface.OnCancelListener listener) {
ProgressDialog dlg = new ProgressDialog(ctx) { ProgressDialog dlg = new ProgressDialog(ctx) {
@Override @Override
public void cancel() { public void cancel() {
@ -98,7 +116,13 @@ public class ProgressDialogImplementation implements IProgress {
// failure, must be older device // failure, must be older device
} }
dlg.setProgressStyle(style); dlg.setProgressStyle(style);
return new ProgressDialogImplementation(dlg, true); return new ProgressImplementation(dlg, true);
}
public void setProgressBar(TextView tv, ProgressBar progressBar, Runnable finish) {
this.tv = tv;
this.progressBar = progressBar;
this.finishRunnable = finish;
} }
public void setDialog(ProgressDialog dlg){ public void setDialog(ProgressDialog dlg){
@ -188,7 +212,11 @@ public class ProgressDialogImplementation implements IProgress {
public ProgressDialog getDialog() { public ProgressDialog getDialog() {
return dialog; return dialog;
} }
public Runnable getFinishRunnable() {
return finishRunnable;
}
@Override @Override
public void startWork(int work) { public void startWork(int work) {
this.work = work; this.work = work;

View file

@ -18,7 +18,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.DrivingRegion; import net.osmand.plus.OsmandSettings.DrivingRegion;
import net.osmand.plus.OsmandSettings.MetricsConstants; import net.osmand.plus.OsmandSettings.MetricsConstants;
import net.osmand.plus.ProgressDialogImplementation; import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.Version; import net.osmand.plus.Version;
import net.osmand.plus.base.SuggestExternalDirectoryDialog; import net.osmand.plus.base.SuggestExternalDirectoryDialog;
@ -345,7 +345,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity {
private File to; private File to;
private Context ctx; private Context ctx;
private File from; private File from;
protected ProgressDialogImplementation progress; protected ProgressImplementation progress;
private Runnable runOnSuccess; private Runnable runOnSuccess;
public MoveFilesToDifferentDirectory(Context ctx, File from, File to) { public MoveFilesToDifferentDirectory(Context ctx, File from, File to) {
@ -360,7 +360,7 @@ public class SettingsGeneralActivity extends SettingsBaseActivity {
@Override @Override
protected void onPreExecute() { protected void onPreExecute() {
progress = ProgressDialogImplementation.createProgressDialog( progress = ProgressImplementation.createProgressDialog(
ctx, ctx.getString(R.string.copying_osmand_files), ctx, ctx.getString(R.string.copying_osmand_files),
ctx.getString(R.string.copying_osmand_files_descr, to.getPath()), ctx.getString(R.string.copying_osmand_files_descr, to.getPath()),
ProgressDialog.STYLE_HORIZONTAL); ProgressDialog.STYLE_HORIZONTAL);

View file

@ -13,7 +13,7 @@ import net.osmand.osm.edit.EntityInfo;
import net.osmand.osm.edit.Node; import net.osmand.osm.edit.Node;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings; import net.osmand.plus.OsmandSettings;
import net.osmand.plus.ProgressDialogImplementation; import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.OsmandListActivity; import net.osmand.plus.activities.OsmandListActivity;
@ -200,7 +200,7 @@ public class LocalOpenstreetmapActivity extends OsmandListActivity {
protected Dialog onCreateDialog(int id) { protected Dialog onCreateDialog(int id) {
switch (id) { switch (id) {
case DIALOG_PROGRESS_UPLOAD: case DIALOG_PROGRESS_UPLOAD:
return ProgressDialogImplementation.createProgressDialog( return ProgressImplementation.createProgressDialog(
LocalOpenstreetmapActivity.this, LocalOpenstreetmapActivity.this,
getString(R.string.uploading), getString(R.string.uploading),
getString(R.string.local_openstreetmap_uploading), getString(R.string.local_openstreetmap_uploading),

View file

@ -1,153 +0,0 @@
package net.osmand.plus.sherpafy;
import java.util.List;
import net.osmand.IProgress;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.DownloadIndexActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.actionbarsherlock.app.SherlockFragmentActivity;
/**
*/
public class SherpafySelectTourActivity extends SherlockFragmentActivity {
private SherpafyCustomization customization;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (!(getMyApplication().getAppCustomization() instanceof SherpafyCustomization)) {
getMyApplication().setAppCustomization(new SherpafyCustomization());
}
customization = (SherpafyCustomization) getMyApplication().getAppCustomization();
setTheme(R.style.OsmandLightTheme);
((OsmandApplication) getApplication()).setLanguage(this);
super.onCreate(savedInstanceState);
getSherlock().setUiOptions(ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setTitle(R.string.sherpafy_app_name);
super.setContentView(R.layout.sherpafy_start);
ProgressDialog startProgressDialog = new ProgressDialog(this);
getMyApplication().checkApplicationIsBeingInitialized(this, startProgressDialog);
setContentView();
// FIXME is this needed?
// if (customization.getTourInformations().isEmpty()) {
// customization.onIndexingFiles(IProgress.EMPTY_PROGRESS, new ConcurrentHashMap<String, String>());
// }
}
private OsmandApplication getMyApplication() {
return (OsmandApplication) getApplication();
}
private void setContentView() {
final Button selectTour = (Button) findViewById(R.id.select_tour);
selectTour.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// creating alert dialog with multiple tours to select
AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
final List<TourInformation> tours = customization.getTourInformations();
if (customization.getSelectedTour() != null) {
String[] tourNames = new String[tours.size()];
// creating list of tour names to select
for (int i = 0; i < tours.size(); i++) {
tourNames[i] = tours.get(i).getName();
}
int i;
for (i = 0; i < tours.size(); i++) {
if (customization.getSelectedTour().equals(tours.get(i))) {
break;
}
}
adb.setSingleChoiceItems(tourNames, i, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
selectTour(tours.get(i));
dialogInterface.dismiss();
}
});
} else {
String[] tourNames = new String[tours.size() + 1];
tourNames[0] = getString(R.string.none);
for (int i = 1; i < tours.size() + 1; i++) {
tourNames[i] = tours.get(i - 1).getName();
}
adb.setSingleChoiceItems(tourNames, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0) {
return;
}
selectTour(tours.get(i - 1));
dialogInterface.dismiss();
}
});
}
adb.setTitle(R.string.select_tour);
adb.setNegativeButton(R.string.default_buttons_cancel, null);
adb.show();
}
});
Button downloadTour = (Button) findViewById(R.id.download_tour);
downloadTour.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Intent download = new Intent(v.getContext(), DownloadIndexActivity.class);
download.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
v.getContext().startActivity(download);
}
});
}
private Activity getActivity() {
return this;
}
private void selectTour(final TourInformation tour){
new AsyncTask<TourInformation, Void, Void>(){
private ProgressDialog dlg;
protected void onPreExecute() {
dlg = new ProgressDialog(getActivity());
dlg.setTitle(R.string.selecting_tour_progress);
dlg.setMessage(getString(R.string.indexing_tour, tour == null ? "" : tour.getName()));
dlg.show();
};
@Override
protected Void doInBackground(TourInformation... params) {
customization.selectTour(params[0], IProgress.EMPTY_PROGRESS);
return null;
}
protected void onPostExecute(Void result) {
dlg.dismiss();
Intent intent = new Intent(getApplicationContext(), TourViewActivity.class);
startActivity(intent);
finish();
};
}.execute(tour);
}
}

View file

@ -77,6 +77,8 @@ public class TourInformation {
stage = null; stage = null;
} else if(stage != null && tag.equals("description")) { } else if(stage != null && tag.equals("description")) {
stage.description = text; stage.description = text;
} else if(stage != null && tag.equals("fullDescription")) {
stage.fullDescription = text;
} else if(stage != null && tag.equals("gpx")) { } else if(stage != null && tag.equals("gpx")) {
if(text.startsWith(FILE_PREFIX)) { if(text.startsWith(FILE_PREFIX)) {
stage.gpxFile = new File(folder, text.substring(FILE_PREFIX.length())); stage.gpxFile = new File(folder, text.substring(FILE_PREFIX.length()));
@ -139,6 +141,7 @@ public class TourInformation {
File gpxFile; File gpxFile;
String name = ""; String name = "";
String description = ""; String description = "";
String fullDescription = "";
public String getName() { public String getName() {
return name; return name;
@ -148,6 +151,10 @@ public class TourInformation {
return description; return description;
} }
public String getFullDescription() {
return fullDescription;
}
public File getGpxFile() { public File getGpxFile() {
return gpxFile; return gpxFile;
} }

View file

@ -5,30 +5,43 @@ import java.util.List;
import net.osmand.IProgress; import net.osmand.IProgress;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.DownloadIndexActivity;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableString; import android.view.Gravity;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.TextView; import android.widget.TextView;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.MenuItem.OnMenuItemClickListener;
/** /**
*/ */
public class TourViewActivity extends SherlockFragmentActivity { public class TourViewActivity extends SherlockFragmentActivity {
private static final int GO_TO_MAP = 1;
private static final int SETTINGS_ID = 2;
private static final int STATE_TOUR_VIEW = 1;
private static final int STATE_LOADING = 0;
private static final int STATE_SELECT_TOUR = -1;
int state = 0;
private SherpafyCustomization customization; private SherpafyCustomization customization;
ImageView img; ImageView img;
TextView description; TextView description;
@ -36,6 +49,7 @@ public class TourViewActivity extends SherlockFragmentActivity {
List<TourInformation.StageInformation> stagesInfo; List<TourInformation.StageInformation> stagesInfo;
TourInformation curTour; TourInformation curTour;
RadioGroup stages; RadioGroup stages;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -46,13 +60,27 @@ public class TourViewActivity extends SherlockFragmentActivity {
setTheme(R.style.OsmandLightTheme); setTheme(R.style.OsmandLightTheme);
((OsmandApplication) getApplication()).setLanguage(this); ((OsmandApplication) getApplication()).setLanguage(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getSherlock().setUiOptions(ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW); if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ||
getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
getSherlock().setUiOptions(ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);
}
getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setTitle(R.string.sherpafy_app_name); getSupportActionBar().setTitle(R.string.sherpafy_app_name);
ProgressDialog startProgressDialog = new ProgressDialog(this); setContentView(R.layout.sherpafy_loading);
getMyApplication().checkApplicationIsBeingInitialized(this, startProgressDialog); state = STATE_LOADING;
getMyApplication().checkApplicationIsBeingInitialized(this, (TextView) findViewById(R.id.ProgressMessage),
(ProgressBar) findViewById(R.id.ProgressBar), new Runnable() {
@Override
public void run() {
setMainContent();
}
});
}
private void setTourInfoContent() {
setContentView(R.layout.sherpafy_tour_info); setContentView(R.layout.sherpafy_tour_info);
ToggleButton collapser = (ToggleButton) findViewById(R.id.collapse); ToggleButton collapser = (ToggleButton) findViewById(R.id.collapse);
@ -64,12 +92,13 @@ public class TourViewActivity extends SherlockFragmentActivity {
customization.selectStage(null, IProgress.EMPTY_PROGRESS); customization.selectStage(null, IProgress.EMPTY_PROGRESS);
fullDescription.setText(curTour.getFulldescription()); fullDescription.setText(curTour.getFulldescription());
description.setText((curTour.getShortDescription())); description.setText((curTour.getShortDescription()));
((TextView)findViewById(R.id.tour_name)).setText(getString(R.string.overview));
prepareBitmap(); prepareBitmap();
} else { } else {
//-1 because there's one more item Overview, which is not exactly a stage.
customization.selectStage(stagesInfo.get(i - 1), IProgress.EMPTY_PROGRESS); customization.selectStage(stagesInfo.get(i - 1), IProgress.EMPTY_PROGRESS);
description.setText(stagesInfo.get(i - 1).getDescription()); description.setText(stagesInfo.get(i - 1).getDescription());
fullDescription.setText(""); fullDescription.setText(stagesInfo.get(i - 1).getFullDescription());
((TextView)findViewById(R.id.tour_name)).setText(stagesInfo.get(i - 1).getName());
} }
} }
}); });
@ -83,36 +112,56 @@ public class TourViewActivity extends SherlockFragmentActivity {
} else { } else {
stages.setVisibility(View.GONE); stages.setVisibility(View.GONE);
} }
} }
}); });
TextView settings = (TextView) findViewById(R.id.btn_settings);
SpannableString content = new SpannableString(settings.getText());
content.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Intent intent = new Intent(getApplicationContext(), SherpafySelectTourActivity.class);
startActivity(intent);
}
}, 0, content.length(), 0);
settings.setText(content);
settings.setMovementMethod(LinkMovementMethod.getInstance());
} }
@Override private void startSettings() {
protected void onResume() { if(state != STATE_SELECT_TOUR) {
super.onResume(); setTourSelectionContentView();
state = STATE_SELECT_TOUR;
}
}
private void setMainContent() {
if(customization.getSelectedTour() != null) { if(customization.getSelectedTour() != null) {
if(state != STATE_TOUR_VIEW) {
setTourInfoContent();
state = STATE_TOUR_VIEW;
}
getSupportActionBar().setTitle(customization.getSelectedTour().getName()); getSupportActionBar().setTitle(customization.getSelectedTour().getName());
updateTourView(); updateTourView();
} else { } else {
// Intent intent = new Intent(getApplicationContext(), SherpafySelectTourActivity.class); startSettings();
// startActivity(intent);
//
} }
} }
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
createMenuItem(menu, GO_TO_MAP, R.string.start_tour,
0, 0,/*R.drawable.ic_action_marker_light,*/
MenuItem.SHOW_AS_ACTION_ALWAYS| MenuItem.SHOW_AS_ACTION_WITH_TEXT);
createMenuItem(menu, SETTINGS_ID, R.string.osmo_share_session,
R.drawable.ic_action_settings_light, R.drawable.ic_action_settings_dark,
MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
return super.onCreateOptionsMenu(menu);
}
public MenuItem createMenuItem(Menu m, int id, int titleRes, int iconLight, int iconDark, int menuItemType) {
// int r = getMyApplication().getSettings().isLightActionBar() ? iconLight : iconDark;
int r = iconLight;
MenuItem menuItem = m.add(0, id, 0, titleRes);
if (r != 0) {
menuItem.setIcon(r);
}
menuItem.setShowAsActionFlags(menuItemType).setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(com.actionbarsherlock.view.MenuItem item) {
return onOptionsItemSelected(item);
}
});
return menuItem;
}
private void updateTourView() { private void updateTourView() {
@ -126,39 +175,33 @@ public class TourViewActivity extends SherlockFragmentActivity {
fullDescription.setVisibility(View.VISIBLE); fullDescription.setVisibility(View.VISIBLE);
Button start_tour = (Button) findViewById(R.id.start_tour); Button start_tour = (Button) findViewById(R.id.start_tour);
//in case of reloading view - remove all previous radio buttons // in case of reloading view - remove all previous radio buttons
stages.removeAllViews(); stages.removeAllViews();
start_tour.setOnClickListener(new View.OnClickListener() { start_tour.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
MapActivity.launchMapActivityMoveToTop(GetActivity()); goToMap();
} }
}); });
// get count of radio buttons
//get count of radio buttons
final int count = stagesInfo.size() + 1; final int count = stagesInfo.size() + 1;
final RadioButton[] rb = new RadioButton[count]; final RadioButton[] rb = new RadioButton[count];
rb[0] = new RadioButton(this); rb[0] = new RadioButton(this);
rb[0].setId(0); rb[0].setId(0);
stages.addView(rb[0]); stages.addView(rb[0]);
rb[0].setText("Overview"); rb[0].setText(getString(R.string.overview));
rb[0].setTextColor(getResources().getColor(R.color.color_black)); // add radio buttons to view
//add radio buttons to view
for (int i = 1; i < count; i++) { for (int i = 1; i < count; i++) {
rb[i] = new RadioButton(this); rb[i] = new RadioButton(this);
rb[i].setId(i); rb[i].setId(i);
stages.addView(rb[i]); stages.addView(rb[i]);
rb[i].setText(stagesInfo.get(i - 1).getName()); rb[i].setText(stagesInfo.get(i - 1).getName());
rb[i].setTextColor(getResources().getColor(R.color.color_black));
} }
TourInformation.StageInformation curStage = customization.getSelectedStage(); TourInformation.StageInformation curStage = customization.getSelectedStage();
//if there's no current stage - overview should be selected
if (curStage == null) { if (curStage == null) {
//DIRTY HACK, I dunno why, but after activity onResume it's not possible to just check item 0
stages.check(0); stages.check(0);
description.setText(curTour.getShortDescription()); description.setText(curTour.getShortDescription());
fullDescription.setText(curTour.getFulldescription()); fullDescription.setText(curTour.getFulldescription());
@ -176,6 +219,11 @@ public class TourViewActivity extends SherlockFragmentActivity {
} }
} }
} }
private void goToMap() {
MapActivity.launchMapActivityMoveToTop(getActivity());
// TODO select GPX
}
private void prepareBitmap() { private void prepareBitmap() {
final Bitmap imageBitmap = curTour.getImageBitmap(); final Bitmap imageBitmap = curTour.getImageBitmap();
@ -194,7 +242,117 @@ public class TourViewActivity extends SherlockFragmentActivity {
return (OsmandApplication) getApplication(); return (OsmandApplication) getApplication();
} }
private TourViewActivity GetActivity() {
@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
if (item.getItemId() == GO_TO_MAP) {
goToMap();
return true;
} else if (item.getItemId() == SETTINGS_ID) {
startSettings();
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
private void setTourSelectionContentView() {
setContentView(R.layout.sherpafy_start);
final Button selectTour = (Button) findViewById(R.id.select_tour);
final Button downloadTour = (Button) findViewById(R.id.download_tour);
int width = Math.max(downloadTour.getWidth(), selectTour.getWidth());
downloadTour.setWidth(width);
selectTour.setWidth(width);
selectTour.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// creating alert dialog with multiple tours to select
AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
final List<TourInformation> tours = customization.getTourInformations();
if (customization.getSelectedTour() != null) {
String[] tourNames = new String[tours.size()];
// creating list of tour names to select
for (int i = 0; i < tours.size(); i++) {
tourNames[i] = tours.get(i).getName();
}
int i;
for (i = 0; i < tours.size(); i++) {
if (customization.getSelectedTour().equals(tours.get(i))) {
break;
}
}
adb.setSingleChoiceItems(tourNames, i, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
selectTour(tours.get(i));
dialogInterface.dismiss();
}
});
} else {
String[] tourNames = new String[tours.size() + 1];
tourNames[0] = getString(R.string.none);
for (int i = 1; i < tours.size() + 1; i++) {
tourNames[i] = tours.get(i - 1).getName();
}
adb.setSingleChoiceItems(tourNames, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0) {
return;
}
selectTour(tours.get(i - 1));
dialogInterface.dismiss();
}
});
}
adb.setTitle(R.string.select_tour);
adb.setNegativeButton(R.string.default_buttons_cancel, null);
adb.show();
}
});
downloadTour.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Intent download = new Intent(v.getContext(), DownloadIndexActivity.class);
download.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
v.getContext().startActivity(download);
}
});
}
private Activity getActivity() {
return this; return this;
} }
private void selectTour(final TourInformation tour){
new AsyncTask<TourInformation, Void, Void>(){
private ProgressDialog dlg;
protected void onPreExecute() {
dlg = new ProgressDialog(getActivity());
dlg.setTitle(R.string.selecting_tour_progress);
dlg.setMessage(getString(R.string.indexing_tour, tour == null ? "" : tour.getName()));
dlg.show();
};
@Override
protected Void doInBackground(TourInformation... params) {
customization.selectTour(params[0], IProgress.EMPTY_PROGRESS);
return null;
}
protected void onPostExecute(Void result) {
dlg.dismiss();
setTourInfoContent();
};
}.execute(tour);
}
} }