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 576f083c..26889d0f 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
@@ -2,12 +2,10 @@ package org.torproject.android.ui.hs;
import android.content.ContentResolver;
-import android.content.DialogInterface;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
-import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
@@ -27,6 +25,7 @@ public class HiddenServicesActivity extends AppCompatActivity {
private String[] mProjection = new String[]{
HSContentProvider.HiddenService._ID,
HSContentProvider.HiddenService.NAME,
+ HSContentProvider.HiddenService.PORT,
HSContentProvider.HiddenService.DOMAIN};
class HSObserver extends ContentObserver {
@@ -60,7 +59,7 @@ public class HiddenServicesActivity extends AppCompatActivity {
mAdapter = new OnionListAdapter(
this,
- getContentResolver().query(
+ mCR.query(
HSContentProvider.CONTENT_URI, mProjection, null, null, null
),
0
@@ -77,7 +76,15 @@ public class HiddenServicesActivity extends AppCompatActivity {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ TextView port = (TextView) view.findViewById(R.id.hs_port);
+ TextView onion = (TextView) view.findViewById(R.id.hs_onion);
+
+ Bundle arguments = new Bundle();
+ arguments.putString("port", port.getText().toString());
+ arguments.putString("onion", onion.getText().toString());
+
HSActionsDialog dialog = new HSActionsDialog();
+ dialog.setArguments(arguments);
dialog.show(getSupportFragmentManager(), "HSActionsDialog");
}
});
diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java
index 52757307..0ae10cb7 100644
--- a/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java
+++ b/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java
@@ -23,6 +23,8 @@ public class OnionListAdapter extends CursorAdapter {
@Override
public void bindView(View view, Context context, Cursor cursor) {
+ TextView port = (TextView) view.findViewById(R.id.hs_port);
+ port.setText(cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.PORT)));
TextView name = (TextView) view.findViewById(R.id.hs_name);
name.setText(cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.NAME)));
TextView domain = (TextView) view.findViewById(R.id.hs_onion);
diff --git a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java
index 8c5ca48d..f4905868 100644
--- a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java
@@ -2,20 +2,29 @@ package org.torproject.android.ui.hs.dialogs;
import android.app.Dialog;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
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.Toast;
import org.torproject.android.R;
+import org.torproject.android.hsutils.HiddenServiceUtils;
+import org.torproject.android.ui.hs.providers.HSContentProvider;
public class HSActionsDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final Bundle arguments = getArguments();
final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_actions, null);
final AlertDialog actionDialog = new AlertDialog.Builder(getActivity())
@@ -26,13 +35,40 @@ public class HSActionsDialog extends DialogFragment {
Button save = (Button) dialog_view.findViewById(R.id.btn_hs_backup);
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
+ Context mContext = v.getContext();
+ HiddenServiceUtils hsutils = new HiddenServiceUtils(mContext);
+ String backupPath = hsutils.createOnionBackup(Integer.parseInt(arguments.getString("port")));
+
+ if (backupPath == null || backupPath.length() < 1) {
+ Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
+ actionDialog.dismiss();
+ return;
+ }
+
+ Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show();
+
+ Uri selectedUri = Uri.parse(backupPath);
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setDataAndType(selectedUri, "resource/folder");
+
+
+ if (intent.resolveActivityInfo(mContext.getPackageManager(), 0) != null) {
+ startActivity(intent);
+ } else {
+ Toast.makeText(mContext, R.string.filemanager_not_available, Toast.LENGTH_LONG).show();
+ }
actionDialog.dismiss();
}
});
- Button cancel = (Button) dialog_view.findViewById(R.id.btn_hs_clipboard);
- cancel.setOnClickListener(new View.OnClickListener() {
+ Button copy = (Button) dialog_view.findViewById(R.id.btn_hs_clipboard);
+ copy.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
+ Context mContext = v.getContext();
+ ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
+ ClipData clip = ClipData.newPlainText("onion", arguments.getString("onion"));
+ clipboard.setPrimaryClip(clip);
+ Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show();
actionDialog.dismiss();
}
});
@@ -40,12 +76,15 @@ public class HSActionsDialog extends DialogFragment {
Button delete = (Button) dialog_view.findViewById(R.id.btn_hs_delete);
delete.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
+ v.getContext().getContentResolver().delete(
+ HSContentProvider.CONTENT_URI, "port=" + arguments.getString("port"), null
+ );
actionDialog.dismiss();
}
});
- Button btn_cancel = (Button) dialog_view.findViewById(R.id.btn_hs_cancel);
- btn_cancel.setOnClickListener(new View.OnClickListener() {
+ Button cancel = (Button) dialog_view.findViewById(R.id.btn_hs_cancel);
+ cancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
actionDialog.dismiss();
}
diff --git a/app/src/main/res/layout/layout_hs_list_item.xml b/app/src/main/res/layout/layout_hs_list_item.xml
index 539de8f0..33ed3741 100644
--- a/app/src/main/res/layout/layout_hs_list_item.xml
+++ b/app/src/main/res/layout/layout_hs_list_item.xml
@@ -5,16 +5,42 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
+ android:paddingLeft="15dp"
+ tools:paddingLeft="15dp">
-
+
+
+
+
+
+
+
+
+
+
+
\ 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 6ed77775..cfa23934 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -341,4 +341,6 @@
Copy address to clipboard
Backup Service
Delete Service
+ Done!
+ Filemanager not available