commit 3f7435c90e3aa468046b1994938bf6b2b3d821a2 Author: arrase arrase@gmail.com Date: Thu Nov 17 02:57:37 2016 +0100
Hidden Service dialog --- .../android/ui/hs/HiddenServicesActivity.java | 6 +- .../android/ui/hs/dialogs/HSDataDialog.java | 84 ++++++++++++++++++++++ app/src/main/res/layout/dialog_hs_data.xml | 63 ++++++++++++++++ app/src/main/res/values/strings.xml | 6 ++ proguard-project.txt | 20 ++++++ project.properties | 2 +- 6 files changed, 177 insertions(+), 4 deletions(-)
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 85665fb..ebf1ec3 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 0000000..e62d2cb --- /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 0000000..2f4daa6 --- /dev/null +++ b/app/src/main/res/layout/dialog_hs_data.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:paddingTop="5dp" + android:paddingBottom="5dp"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/HSNameLabel" + android:text="@string/name" + android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" + android:paddingLeft="5dp" /> + + <EditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="text" + android:ems="10" + android:id="@+id/hsName" /> + + <TextView + android:text="@string/port" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/HSPortLabel" + android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" + android:paddingLeft="5dp" /> + + <EditText + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:id="@+id/serverPort" + android:inputType="number" /> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <Button + android:text="@string/cancel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/HSDialogCancel" + android:layout_weight="1" + style="@style/Widget.AppCompat.Button.Borderless.Colored" /> + + <Button + android:text="@string/save" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/HSDialogSave" + android:layout_weight="1" + style="@style/Widget.AppCompat.Button.Borderless.Colored" /> + </LinearLayout> + +</LinearLayout> \ 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 bd93d6d..333ac58 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -331,4 +331,10 @@
<string name="vpn_default_world">World (Location)</string> <string name="title_activity_hidden_services">Hidden Services</string> + <string name="save">Save</string> + <string name="cancel">Cancel</string> + <string name="hs_dialog_title">Hidden Service</string> + <string name="port">Port</string> + <string name="name">Name</string> + <string name="invalid_port">Invalid Port</string> </resources> diff --git a/proguard-project.txt b/proguard-project.txt index e69de29..f2fe155 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 145c9f2..240497d 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
tor-commits@lists.torproject.org