package net.osmand.plus.activities.actions;
import android.app.Activity;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import net.osmand.AndroidUtils;
import net.osmand.plus.R;
import net.osmand.plus.Version;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.views.OsmandMapTileView;
public class StartGPSStatus extends OsmAndAction {
public enum GpsStatusApps {
GPS_STATUS("GPS Status & Toolbox", "com.eclipsim.gpsstatus2", "", "com.eclipsim.gpsstatus2.GPSStatus"),
GPS_TEST("GPS Test", "com.chartcross.gpstest", "com.chartcross.gpstestplus", ""),
INVIU_GPS("inViu GPS-details ", "de.enaikoon.android.inviu.gpsdetails", "", ""),
ANDROI_TS_GPS_TEST("AndroiTS GPS Test", "com.androits.gps.test.free", "com.androits.gps.test.pro", ""),
SAT_STAT("SatStat (F-droid)", "com.vonglasow.michael.satstat", "", "");
public final String stringRes;
public final String appName;
public final String paidAppName;
public final String activity;
GpsStatusApps(String res, String appName, String paidAppName, String activity) {
this.stringRes = res;
this.appName = appName;
this.paidAppName = paidAppName;
this.activity = activity;
}
public boolean installed(Activity a) {
return installed(a, appName, paidAppName);
}
public boolean installed(Activity a, String... appName) {
boolean installed = false;
PackageManager packageManager = a.getPackageManager();
for (String app: appName) {
try{
installed = packageManager.getPackageInfo(app, 0) != null;
break;
} catch ( NameNotFoundException e){
installed = false;
}
}
return installed;
}
}
public StartGPSStatus(MapActivity mapActivity) {
super(mapActivity);
}
@Override
public void run() {
String appName = getSettings().GPS_STATUS_APP.get();
GpsStatusApps[] values = GpsStatusApps.values();
for(GpsStatusApps g : values) {
if(appName.length() > 0 && g.appName.equals(appName)) {
if(g.installed(mapActivity)) {
runChosenGPSStatus(g);
return;
} else {
getSettings().GPS_STATUS_APP.set("");
}
}
}
showDialog();
}
@Override
public int getDialogID() {
return OsmAndDialogs.DIALOG_START_GPS;
}
@Override
public Dialog createDialog(Activity activity, Bundle args) {
GpsStatusApps[] values = GpsStatusApps.values();
String[] res = new String[values.length];
int i = 0;
for(GpsStatusApps g : values) {
res[i++] = g.stringRes;
}
AlertDialog.Builder builder = new AlertDialog.Builder(mapActivity);
builder.setTitle(R.string.gps_status);
LinearLayout ll = new LinearLayout(activity);
final ListView lv = new ListView(activity);
final int dp24 = AndroidUtils.dpToPx(mapActivity, 24f);
final int dp12 = AndroidUtils.dpToPx(mapActivity, 12f);
final int dp8 = AndroidUtils.dpToPx(mapActivity, 8f);
lv.setPadding(0, dp8, 0, dp8);
final CheckBox cb = new CheckBox(activity);
cb.setText(R.string.shared_string_remember_my_choice);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.setMargins(dp24, dp8, dp8, dp24);
cb.setLayoutParams(lp);
final int layout = R.layout.list_menu_item_native;
final ArrayAdapter<GpsStatusApps> adapter = new ArrayAdapter<GpsStatusApps>(mapActivity, layout, GpsStatusApps.values()) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = mapActivity.getLayoutInflater().inflate(layout, null);
TextView tv = (TextView)v.findViewById(R.id.title);
tv.setPadding(dp12, 0, dp24, 0);
tv.setText(getItem(position).stringRes);
v.findViewById(R.id.toggle_item).setVisibility(View.INVISIBLE);
return v;
}
};
lv.setAdapter(adapter);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(lv);
ll.addView(cb);
final AlertDialog dlg = builder.create();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
boolean remember = cb.isChecked();
GpsStatusApps item = adapter.getItem(position);
if(remember) {
getSettings().GPS_STATUS_APP.set(item.appName);
}
dlg.dismiss();
runChosenGPSStatus(item);
}
});
dlg.setView(ll);
return dlg;
}
private void runChosenGPSStatus(final GpsStatusApps g) {
if (g.installed(mapActivity)) {
Intent intent = null;
// if (g.activity.length() == 0) {
PackageManager pm = mapActivity.getPackageManager();
try {
String appName = !g.paidAppName.equals("") &&
g.installed(mapActivity, g.paidAppName) ? g.paidAppName : g.appName;
intent = pm.getLaunchIntentForPackage(appName);
} catch (RuntimeException e) {
}
// } else {
// intent = new Intent();
// intent.setComponent(new ComponentName(g.appName, g.activity));
// }
if(intent == null) {
return;
}
intent.addCategory(Intent.CATEGORY_LAUNCHER);
mapActivity.startActivity(intent);
} else {
if (Version.isMarketEnabled(getMyApplication())) {
AlertDialog.Builder builder = new AlertDialog.Builder(mapActivity);
builder.setMessage(mapActivity. getString(R.string.gps_status_app_not_found));
builder.setPositiveButton(mapActivity.getString(R.string.shared_string_yes), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(Version.marketPrefix(getMyApplication()) + g.appName));
try {
mapActivity.startActivity(intent);
} catch (ActivityNotFoundException e) {
}
}
});
builder.setNegativeButton(mapActivity.getString(R.string.shared_string_no), null);
builder.show();
} else {
Toast.makeText(mapActivity, R.string.gps_status_app_not_found, Toast.LENGTH_LONG).show();
}
}
}
}