diff --git a/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
index 85665fb6..ebf1ec31 100644
--- a/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
@@ -5,7 +5,6 @@ import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
-import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -14,6 +13,7 @@ import android.view.View;
import org.torproject.android.R;
import org.torproject.android.ui.hs.adapters.HSAdapter;
+import org.torproject.android.ui.hs.dialogs.HSDataDialog;
import org.torproject.android.ui.hs.providers.HSContentProvider;
public class HiddenServicesActivity extends AppCompatActivity {
@@ -37,8 +37,8 @@ public class HiddenServicesActivity extends AppCompatActivity {
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
- .setAction("Action", null).show();
+ HSDataDialog dialog = new HSDataDialog();
+ dialog.show(getSupportFragmentManager(), "HSDataDialog");
}
});
diff --git a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java
new file mode 100644
index 00000000..e62d2cb9
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java
@@ -0,0 +1,84 @@
+package org.torproject.android.ui.hs.dialogs;
+
+
+import android.app.Dialog;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import org.torproject.android.R;
+import org.torproject.android.ui.hs.providers.HSContentProvider;
+
+public class HSDataDialog extends DialogFragment {
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ // Get the layout
+ final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.dialog_hs_data, null);
+
+ // Use the Builder class for convenient dialog construction
+ final AlertDialog serverDataDialog = new AlertDialog.Builder(getActivity())
+ .setView(dialog_view)
+ .setTitle(R.string.hs_dialog_title)
+ .create();
+
+ // Buttons action
+ Button save = (Button) dialog_view.findViewById(R.id.HSDialogSave);
+ save.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ String serverName = ((EditText) dialog_view.findViewById(R.id.hsName)).getText().toString();
+ Integer serverPort = Integer.parseInt(
+ ((EditText) dialog_view.findViewById(R.id.serverPort)).getText().toString()
+ );
+
+ if (checkInput(serverPort)) {
+ saveData(serverName, serverPort);
+ serverDataDialog.dismiss();
+ }
+ }
+ });
+
+ Button cancel = (Button) dialog_view.findViewById(R.id.HSDialogCancel);
+ cancel.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ serverDataDialog.cancel();
+ }
+ });
+
+ return serverDataDialog;
+ }
+
+ private boolean checkInput(Integer port) {
+ boolean is_ok = true;
+ Integer error_msg = 0;
+
+ if (port <= 1 || port > 65535) {
+ error_msg = R.string.invalid_port;
+ is_ok = false;
+ }
+
+ if (!is_ok) {
+ Toast.makeText(getContext(), error_msg, Toast.LENGTH_SHORT).show();
+ }
+
+ return is_ok;
+ }
+
+ private void saveData(String name, Integer port) {
+ ContentValues fields = new ContentValues();
+ fields.put("name", name);
+ fields.put("port", port);
+
+ ContentResolver cr = getContext().getContentResolver();
+
+ cr.insert(HSContentProvider.CONTENT_URI, fields);
+ }
+}
diff --git a/app/src/main/res/layout/dialog_hs_data.xml b/app/src/main/res/layout/dialog_hs_data.xml
new file mode 100644
index 00000000..2f4daa6b
--- /dev/null
+++ b/app/src/main/res/layout/dialog_hs_data.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bd93d6d8..333ac581 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -331,4 +331,10 @@
World (Location)
Hidden Services
+ Save
+ Cancel
+ Hidden Service
+ Port
+ Name
+ Invalid Port
diff --git a/proguard-project.txt b/proguard-project.txt
index e69de29b..f2fe1559 100644
--- a/proguard-project.txt
+++ b/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/project.properties b/project.properties
index 145c9f25..240497d6 100644
--- a/project.properties
+++ b/project.properties
@@ -9,6 +9,6 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
# Project target.
-target=android-23
+target=android-15
android.library.reference.1=external/jsocks/jsockslib
android.library.reference.2=external/appcompat