From 162afa5bfa6485f3aacb3f60e9c92fa0c3bfa7a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Mon, 11 Feb 2013 20:28:59 +0100 Subject: Gets provider.json from custom url (assuming the file is at the root of the website, just as bitmask.net/provider.json), and writes it to a file in ~/leap_android. Next steps: parse that file and download eip-service and cert. --- res/layout/new_provider_dialog.xml | 18 +++++++ res/values/strings.xml | 1 + src/se/leap/leapclient/ConfigHelper.java | 32 ++++++++++- src/se/leap/leapclient/ConfigurationWizard.java | 15 +++++- src/se/leap/leapclient/NewProviderDialog.java | 72 +++++++++++++++++++------ src/se/leap/leapclient/ProviderAPI.java | 21 +++++++- 6 files changed, 141 insertions(+), 18 deletions(-) create mode 100644 res/layout/new_provider_dialog.xml diff --git a/res/layout/new_provider_dialog.xml b/res/layout/new_provider_dialog.xml new file mode 100644 index 00000000..28122867 --- /dev/null +++ b/res/layout/new_provider_dialog.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index ca73c0da..2deb23fa 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -264,5 +264,6 @@ Add new Provider Introduce new provider Save + New provider\'s main URL \ No newline at end of file diff --git a/src/se/leap/leapclient/ConfigHelper.java b/src/se/leap/leapclient/ConfigHelper.java index eded2504..c724a31c 100644 --- a/src/se/leap/leapclient/ConfigHelper.java +++ b/src/se/leap/leapclient/ConfigHelper.java @@ -1,18 +1,28 @@ package se.leap.leapclient; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + import org.json.JSONException; import org.json.JSONObject; import android.content.SharedPreferences; +import android.os.Environment; +import android.util.Log; public class ConfigHelper { final static String downloadJsonFilesBundleExtra = "downloadJSONFiles"; + final static String downloadNewProviderDotJSON = "downloadNewProviderDotJSON"; final static String provider_key = "provider"; final static String cert_key = "cert"; final static String eip_service_key = "eip"; public static final String PREFERENCES_KEY = "LEAPPreferences"; + public static final String user_directory = "leap_android"; + public static String provider_key_url = "provider_main_url"; static void saveSharedPref(String shared_preferences_key, JSONObject content) { @@ -27,9 +37,29 @@ public class ConfigHelper { + ConfigurationWizard.shared_preferences.getString( shared_preferences_key, "Default")); } - + static void rescueJSONException(JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } + + static void saveFile(String filename, String content) { + File root = Environment.getExternalStorageDirectory(); + File outDir = new File(root.getAbsolutePath() + File.separator + user_directory); + if (!outDir.isDirectory()) { + outDir.mkdir(); + } + try { + if (!outDir.isDirectory()) { + throw new IOException( + "Unable to create directory " + user_directory + ". Maybe the SD card is mounted?"); + } + File outputFile = new File(outDir, filename); + BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile)); + writer.write(content); + writer.close(); + } catch (IOException e) { + Log.w("leap_android", e.getMessage(), e); + } + } } diff --git a/src/se/leap/leapclient/ConfigurationWizard.java b/src/se/leap/leapclient/ConfigurationWizard.java index 86de817c..39ada310 100644 --- a/src/se/leap/leapclient/ConfigurationWizard.java +++ b/src/se/leap/leapclient/ConfigurationWizard.java @@ -8,6 +8,7 @@ import java.util.Scanner; import org.json.JSONException; import org.json.JSONObject; +import se.leap.leapclient.NewProviderDialog.NewProviderDialogInterface; import se.leap.leapclient.ProviderListContent.ProviderItem; import android.app.Activity; import android.app.DialogFragment; @@ -38,7 +39,7 @@ import android.view.View; * to listen for item selections. */ public class ConfigurationWizard extends Activity - implements ProviderListFragment.Callbacks { + implements ProviderListFragment.Callbacks, NewProviderDialog.NewProviderDialogInterface{ /** * Whether or not the activity is in two-pane mode, i.e. running on a tablet @@ -170,4 +171,16 @@ public class ConfigurationWizard extends Activity DialogFragment newFragment = NewProviderDialog.newInstance(); newFragment.show(fragment_transaction, "newProviderDialog"); } + + @Override + public void saveProvider(String provider_url) { + Intent provider_API_command = new Intent(this, ProviderAPI.class); + + Bundle method_and_parameters = new Bundle(); + method_and_parameters.putString(ConfigHelper.provider_key_url, provider_url); + + provider_API_command.putExtra(ConfigHelper.downloadNewProviderDotJSON, method_and_parameters); + + startService(provider_API_command); + } } diff --git a/src/se/leap/leapclient/NewProviderDialog.java b/src/se/leap/leapclient/NewProviderDialog.java index fd6d4619..09e7453a 100644 --- a/src/se/leap/leapclient/NewProviderDialog.java +++ b/src/se/leap/leapclient/NewProviderDialog.java @@ -1,32 +1,74 @@ package se.leap.leapclient; +import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebView.FindListener; +import android.widget.EditText; +import android.widget.Toast; public class NewProviderDialog extends DialogFragment { - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(R.string.introduce_new_provider) - .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // Save provider - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); - // Create the AlertDialog object and return it - return builder.create(); + + public interface NewProviderDialogInterface { + public void saveProvider(String url_provider); } + NewProviderDialogInterface interface_with_ConfigurationWizard; + public static DialogFragment newInstance() { NewProviderDialog dialog_fragment = new NewProviderDialog(); return dialog_fragment; } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + // Verify that the host activity implements the callback interface + try { + // Instantiate the NoticeDialogListener so we can send events to the host + interface_with_ConfigurationWizard = (NewProviderDialogInterface) activity; + } catch (ClassCastException e) { + // The activity doesn't implement the interface, throw exception + throw new ClassCastException(activity.toString() + + " must implement NoticeDialogListener"); + } + } + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + LayoutInflater inflater = getActivity().getLayoutInflater(); + View new_provider_dialog_view = inflater.inflate(R.layout.new_provider_dialog, null); + final EditText url_input_field = (EditText)new_provider_dialog_view.findViewById(R.id.new_provider_url); + builder.setView(new_provider_dialog_view) + .setMessage(R.string.introduce_new_provider) + .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + String entered_url = url_input_field.getText().toString().trim(); + if(validURL(entered_url)) { + interface_with_ConfigurationWizard.saveProvider(entered_url); + Toast.makeText(getActivity().getApplicationContext(), "Valid URL", Toast.LENGTH_LONG).show(); + } else { + url_input_field.setText(""); + Toast.makeText(getActivity().getApplicationContext(), "Not valid URL", Toast.LENGTH_LONG).show(); + } + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }); + // Create the AlertDialog object and return it + return builder.create(); + } + + boolean validURL(String entered_url) { + return !entered_url.isEmpty() && entered_url.matches("http[s]?://.+") && !entered_url.replaceFirst("http[s]?://", "").isEmpty(); + } } diff --git a/src/se/leap/leapclient/ProviderAPI.java b/src/se/leap/leapclient/ProviderAPI.java index 5a8f9572..c21e17a4 100644 --- a/src/se/leap/leapclient/ProviderAPI.java +++ b/src/se/leap/leapclient/ProviderAPI.java @@ -27,7 +27,7 @@ public class ProviderAPI extends IntentService { protected void onHandleIntent(Intent task_for) { Bundle task; System.out.println("onHandleIntent called"); - if (!(task = task_for.getBundleExtra(ConfigHelper.downloadJsonFilesBundleExtra)).isEmpty()) { + if((task = task_for.getBundleExtra(ConfigHelper.downloadJsonFilesBundleExtra)) != null) { String cert_url = (String) task.get(ConfigHelper.cert_key); String eip_service_json_url = (String) task.get(ConfigHelper.eip_service_key); try { @@ -45,6 +45,25 @@ public class ProviderAPI extends IntentService { e.printStackTrace(); } } + else if ((task = task_for.getBundleExtra(ConfigHelper.downloadNewProviderDotJSON)) != null) { + String provider_main_url = (String) task.get(ConfigHelper.provider_key_url); + String provider_json_url = guessURL(provider_main_url); + try { + JSONObject provider_json = getJSONFromProvider(provider_json_url); + String filename = provider_json_url.replaceFirst("http[s]?://", "").replaceFirst("\\/", "_") + "_provider.json".replaceFirst("__", "_"); + ConfigHelper.saveFile(filename, provider_json.toString()); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + private String guessURL(String provider_main_url) { + return provider_main_url + "/provider.json"; } private String getStringFromProvider(String string_url) throws IOException { -- cgit v1.2.3