tor-commits
Threads by month
- ----- 2025 -----
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
March 2017
- 20 participants
- 1183 discussions
commit 4155246b88286c59c421129bf8f1408240121ec1
Author: arrase <arrase(a)gmail.com>
Date: Fri Nov 18 01:00:57 2016 +0100
more ps
---
app/src/main/res/layout/onion_item.xml | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/app/src/main/res/layout/onion_item.xml b/app/src/main/res/layout/onion_item.xml
index 067e0a0..539de8f 100644
--- a/app/src/main/res/layout/onion_item.xml
+++ b/app/src/main/res/layout/onion_item.xml
@@ -1,5 +1,6 @@
<?xml version="1.0"…
[View More] encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@@ -7,11 +8,13 @@
<TextView
android:id="@+id/hs_name"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:textSize="24sp" />
<TextView
android:id="@+id/hs_onion"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:textSize="18sp" />
</LinearLayout>
\ No newline at end of file
[View Less]
1
0
commit 8494cfb63327bd27e9c31b155dfb2c14e3f5658f
Author: arrase <arrase(a)gmail.com>
Date: Sun Nov 20 03:20:14 2016 +0100
actions dialog
---
.../android/ui/hs/HiddenServicesActivity.java | 17 +++----
.../android/ui/hs/dialogs/HSActionsDialog.java | 56 ++++++++++++++++++++++
.../android/ui/hs/dialogs/HSDataDialog.java | 10 ++--
app/src/main/res/layout/layout_hs_actions.xml | 30 ++++++++++++
app/src/main/res/layout/layout_hs_data_dialog.xml | 2 +-
app/src/…
[View More]main/res/values/strings.xml | 6 ++-
6 files changed, 103 insertions(+), 18 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 a2c9280..576f083 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,17 +2,21 @@ 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;
import android.widget.ListView;
+import android.widget.TextView;
import org.torproject.android.R;
import org.torproject.android.ui.hs.adapters.OnionListAdapter;
+import org.torproject.android.ui.hs.dialogs.HSActionsDialog;
import org.torproject.android.ui.hs.dialogs.HSDataDialog;
import org.torproject.android.ui.hs.providers.HSContentProvider;
@@ -69,19 +73,12 @@ public class HiddenServicesActivity extends AppCompatActivity {
ListView onion_list = (ListView) findViewById(R.id.onion_list);
onion_list.setAdapter(mAdapter);
- onion_list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
+ onion_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-
- }
- });
-
- onion_list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
-
- @Override
- public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
- return false;
+ HSActionsDialog dialog = new HSActionsDialog();
+ dialog.show(getSupportFragmentManager(), "HSActionsDialog");
}
});
}
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
new file mode 100644
index 0000000..8c5ca48
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSActionsDialog.java
@@ -0,0 +1,56 @@
+package org.torproject.android.ui.hs.dialogs;
+
+
+import android.app.Dialog;
+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 org.torproject.android.R;
+
+public class HSActionsDialog extends DialogFragment {
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+
+ final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_actions, null);
+ final AlertDialog actionDialog = new AlertDialog.Builder(getActivity())
+ .setView(dialog_view)
+ .setTitle(R.string.hidden_services)
+ .create();
+
+ Button save = (Button) dialog_view.findViewById(R.id.btn_hs_backup);
+ save.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ actionDialog.dismiss();
+ }
+ });
+
+ Button cancel = (Button) dialog_view.findViewById(R.id.btn_hs_clipboard);
+ cancel.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ actionDialog.dismiss();
+ }
+ });
+
+ Button delete = (Button) dialog_view.findViewById(R.id.btn_hs_delete);
+ delete.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ actionDialog.dismiss();
+ }
+ });
+
+ Button btn_cancel = (Button) dialog_view.findViewById(R.id.btn_hs_cancel);
+ btn_cancel.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ actionDialog.dismiss();
+ }
+ });
+
+ return actionDialog;
+ }
+}
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
index 67c3691..98a9d3f 100644
--- 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
@@ -25,9 +25,9 @@ public class HSDataDialog extends DialogFragment {
final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_data_dialog, null);
// Use the Builder class for convenient dialog construction
- final AlertDialog serverDataDialog = new AlertDialog.Builder(getActivity())
+ final AlertDialog serviceDataDialog = new AlertDialog.Builder(getActivity())
.setView(dialog_view)
- .setTitle(R.string.hs_dialog_title)
+ .setTitle(R.string.hidden_services)
.create();
// Buttons action
@@ -44,7 +44,7 @@ public class HSDataDialog extends DialogFragment {
if (checkInput(localPort,onionPort)) {
saveData(serverName, localPort,onionPort);
- serverDataDialog.dismiss();
+ serviceDataDialog.dismiss();
}
}
});
@@ -52,11 +52,11 @@ public class HSDataDialog extends DialogFragment {
Button cancel = (Button) dialog_view.findViewById(R.id.HSDialogCancel);
cancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
- serverDataDialog.cancel();
+ serviceDataDialog.cancel();
}
});
- return serverDataDialog;
+ return serviceDataDialog;
}
private boolean checkInput(Integer local, Integer remote){
diff --git a/app/src/main/res/layout/layout_hs_actions.xml b/app/src/main/res/layout/layout_hs_actions.xml
new file mode 100644
index 0000000..64bda7d
--- /dev/null
+++ b/app/src/main/res/layout/layout_hs_actions.xml
@@ -0,0 +1,30 @@
+<?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="match_parent">
+
+ <Button
+ android:text="@string/copy_address_to_clipboard"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/btn_hs_clipboard" />
+
+ <Button
+ android:text="@string/backup_service"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/btn_hs_backup" />
+
+ <Button
+ android:text="@string/delete_service"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/btn_hs_delete" />
+
+ <Button
+ android:text="@string/btn_cancel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/btn_hs_cancel" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_data_dialog.xml b/app/src/main/res/layout/layout_hs_data_dialog.xml
index 7379f45..d791b1b 100644
--- a/app/src/main/res/layout/layout_hs_data_dialog.xml
+++ b/app/src/main/res/layout/layout_hs_data_dialog.xml
@@ -59,7 +59,7 @@
android:layout_height="match_parent">
<Button
- android:text="@string/cancel"
+ android:text="@string/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/HSDialogCancel"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ea01787..6ed7777 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -330,13 +330,15 @@
<string name="note_only_standard_tor_bridges_work_on_intel_x86_atom_devices">NOTE: Only standard Tor bridges work on Intel X86/ATOM devices</string>
<string name="vpn_default_world">World (Location)</string>
+ <string name="hidden_services">Hidden Services</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="ports">Ports</string>
<string name="local_port">Local Port</string>
<string name="onion_port">Onion Port</string>
<string name="name">Name</string>
<string name="invalid_port">Invalid Port</string>
+ <string name="copy_address_to_clipboard">Copy address to clipboard</string>
+ <string name="backup_service">Backup Service</string>
+ <string name="delete_service">Delete Service</string>
</resources>
[View Less]
1
0
commit 8e9bc2f840874e0b9751942240be6a93c31857f5
Author: arrase <arrase(a)gmail.com>
Date: Sun Nov 20 04:39:34 2016 +0100
some actions
---
.../android/ui/hs/HiddenServicesActivity.java | 13 ++++--
.../android/ui/hs/adapters/OnionListAdapter.java | 2 +
.../android/ui/hs/dialogs/HSActionsDialog.java | 47 ++++++++++++++++++++--
app/src/main/res/layout/layout_hs_list_item.xml | 42 +++++++++++++++----
app/src/main/res/values/strings.xml | 2 +
5 files …
[View More]changed, 91 insertions(+), 15 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 576f083..26889d0 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 5275730..0ae10cb 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 8c5ca48..f490586 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 539de8f..33ed374 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">
- <TextView
- android:id="@+id/hs_name"
+ <LinearLayout
+ android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textSize="24sp" />
+ android:paddingLeft="15dp"
+ tools:paddingLeft="15dp">
- <TextView
- android:id="@+id/hs_onion"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="18sp" />
+ <TextView
+ android:layout_height="match_parent"
+ android:id="@+id/hs_port"
+ android:layout_width="wrap_content"
+ android:textSize="35sp" />
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1">
+
+ <TextView
+ android:id="@+id/hs_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="24sp"
+ android:paddingLeft="10dp"
+ android:paddingBottom="10dp" />
+
+ <TextView
+ android:id="@+id/hs_onion"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:paddingLeft="10dp" />
+
+ </LinearLayout>
+
+ </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 6ed7777..cfa2393 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -341,4 +341,6 @@
<string name="copy_address_to_clipboard">Copy address to clipboard</string>
<string name="backup_service">Backup Service</string>
<string name="delete_service">Delete Service</string>
+ <string name="done">Done!</string>
+ <string name="filemanager_not_available">Filemanager not available</string>
</resources>
[View Less]
1
0
commit e8a509951874f8af8b2fbc95bc94fb57cd75d8fb
Author: arrase <arrase(a)gmail.com>
Date: Mon Nov 21 00:00:58 2016 +0100
refactor
---
.../android/ui/hs/HiddenServicesActivity.java | 26 +++++++++++-----------
.../android/ui/hs/dialogs/HSDataDialog.java | 6 ++---
2 files changed, 16 insertions(+), 16 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/…
[View More]HiddenServicesActivity.java
index 80b7e81..0fa4f13 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
@@ -32,19 +32,6 @@ public class HiddenServicesActivity extends AppCompatActivity {
HSContentProvider.HiddenService.PORT,
HSContentProvider.HiddenService.DOMAIN};
- class HSObserver extends ContentObserver {
- HSObserver(Handler handler) {
- super(handler);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- mAdapter.changeCursor(mCR.query(
- HSContentProvider.CONTENT_URI, mProjection, null, null, null
- ));
- }
- }
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -106,4 +93,17 @@ public class HiddenServicesActivity extends AppCompatActivity {
private boolean hasPermission() {
return (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
}
+
+ class HSObserver extends ContentObserver {
+ HSObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mAdapter.changeCursor(mCR.query(
+ HSContentProvider.CONTENT_URI, mProjection, null, null, null
+ ));
+ }
+ }
}
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
index 98a9d3f..cdd9ce4 100644
--- 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
@@ -42,8 +42,8 @@ public class HSDataDialog extends DialogFragment {
((EditText) dialog_view.findViewById(R.id.hsOnionPort)).getText().toString()
);
- if (checkInput(localPort,onionPort)) {
- saveData(serverName, localPort,onionPort);
+ if (checkInput(localPort, onionPort)) {
+ saveData(serverName, localPort, onionPort);
serviceDataDialog.dismiss();
}
}
@@ -59,7 +59,7 @@ public class HSDataDialog extends DialogFragment {
return serviceDataDialog;
}
- private boolean checkInput(Integer local, Integer remote){
+ private boolean checkInput(Integer local, Integer remote) {
boolean is_ok = true;
Integer error_msg = 0;
[View Less]
1
0
commit fa6151cc99e4c50b6bcd6b477fd20d7b5939ee43
Author: arrase <arrase(a)gmail.com>
Date: Fri Nov 18 03:16:31 2016 +0100
adds card view
---
app/build.gradle | 2 +-
.../main/res/layout/content_hidden_services.xml | 4 +--
app/src/main/res/layout/onion_item.xml | 36 ++++++++++++++--------
3 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 54cbf5f..66d1225 100644
--- a/app/…
[View More]build.gradle
+++ b/app/build.gradle
@@ -28,8 +28,8 @@ android {
dependencies {
compile project(':orbotservice')
-
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
+ compile 'com.android.support:cardview-v7:23.4.0'
}
diff --git a/app/src/main/res/layout/content_hidden_services.xml b/app/src/main/res/layout/content_hidden_services.xml
index ba760de..39588f9 100644
--- a/app/src/main/res/layout/content_hidden_services.xml
+++ b/app/src/main/res/layout/content_hidden_services.xml
@@ -6,8 +6,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingLeft="10dp"
+ android:paddingRight="10dp"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="org.torproject.android.ui.hs.HiddenServicesActivity"
diff --git a/app/src/main/res/layout/onion_item.xml b/app/src/main/res/layout/onion_item.xml
index 754afdb..12fbf1d 100644
--- a/app/src/main/res/layout/onion_item.xml
+++ b/app/src/main/res/layout/onion_item.xml
@@ -1,21 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginBottom="15sp">
+ android:padding="5dp">
- <TextView
- android:id="@+id/hs_name"
+ <android.support.v7.widget.CardView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="24sp" />
+ android:layout_height="wrap_content">
- <TextView
- android:id="@+id/hs_onion"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="18sp" />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="5dp">
+
+ <TextView
+ android:id="@+id/hs_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="24sp"
+ android:paddingLeft="5dp" />
+ <TextView
+ android:id="@+id/hs_onion"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:paddingLeft="5dp" />
+ </LinearLayout>
+ </android.support.v7.widget.CardView>
</LinearLayout>
\ No newline at end of file
[View Less]
1
0
commit d1884c3349601c27c9cd95492b94b62e3b37b981
Author: arrase <arrase(a)gmail.com>
Date: Mon Nov 21 00:04:48 2016 +0100
refactor
---
.../org/torproject/android/OrbotMainActivity.java | 2 +-
.../android/hsutils/ExternalStorage.java | 42 ----------
.../android/hsutils/GrantedPermissionsAction.java | 7 --
.../android/hsutils/HiddenServiceUtils.java | 2 +
.../java/org/torproject/android/hsutils/ZipIt.java | 98 ----------------------
.../android/storage/…
[View More]ExternalStorage.java | 42 ++++++++++
.../android/storage/GrantedPermissionsAction.java | 7 ++
.../java/org/torproject/android/zip/ZipIt.java | 98 ++++++++++++++++++++++
8 files changed, 150 insertions(+), 148 deletions(-)
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
index b28c3c4..a544de5 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -16,7 +16,7 @@ import java.util.Random;
import java.util.StringTokenizer;
import org.json.JSONArray;
-import org.torproject.android.hsutils.GrantedPermissionsAction;
+import org.torproject.android.storage.GrantedPermissionsAction;
import org.torproject.android.service.OrbotConstants;
import org.torproject.android.service.util.Prefs;
import org.torproject.android.service.TorService;
diff --git a/app/src/main/java/org/torproject/android/hsutils/ExternalStorage.java b/app/src/main/java/org/torproject/android/hsutils/ExternalStorage.java
deleted file mode 100644
index 400f39a..0000000
--- a/app/src/main/java/org/torproject/android/hsutils/ExternalStorage.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.torproject.android.hsutils;
-
-import android.os.Environment;
-
-import java.io.File;
-
-public class ExternalStorage {
- private final String BACKUPS_DIR = "Orbot-HiddenServices";
-
- public String createBackupDir() {
- if (!isExternalStorageWritable()) {
- return null;
- }
-
- File path = Environment.getExternalStoragePublicDirectory(BACKUPS_DIR);
-
- if (!path.mkdirs()) {
- return null;
- }
-
- return path.getAbsolutePath();
- }
-
- /* Checks if external storage is available for read and write */
- public boolean isExternalStorageWritable() {
- String state = Environment.getExternalStorageState();
- if (Environment.MEDIA_MOUNTED.equals(state)) {
- return true;
- }
- return false;
- }
-
- /* Checks if external storage is available to at least read */
- public boolean isExternalStorageReadable() {
- String state = Environment.getExternalStorageState();
- if (Environment.MEDIA_MOUNTED.equals(state) ||
- Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
- return true;
- }
- return false;
- }
-}
diff --git a/app/src/main/java/org/torproject/android/hsutils/GrantedPermissionsAction.java b/app/src/main/java/org/torproject/android/hsutils/GrantedPermissionsAction.java
deleted file mode 100644
index 31731fa..0000000
--- a/app/src/main/java/org/torproject/android/hsutils/GrantedPermissionsAction.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.torproject.android.hsutils;
-
-import android.content.Context;
-
-public abstract class GrantedPermissionsAction {
- public abstract void run(Context context, boolean granted);
-}
diff --git a/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java b/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java
index 0e96756..0cf359b 100644
--- a/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java
+++ b/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java
@@ -4,6 +4,8 @@ import android.app.Application;
import android.content.Context;
import org.torproject.android.service.TorServiceConstants;
+import org.torproject.android.storage.ExternalStorage;
+import org.torproject.android.zip.ZipIt;
import java.io.File;
diff --git a/app/src/main/java/org/torproject/android/hsutils/ZipIt.java b/app/src/main/java/org/torproject/android/hsutils/ZipIt.java
deleted file mode 100644
index 25d74a5..0000000
--- a/app/src/main/java/org/torproject/android/hsutils/ZipIt.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.torproject.android.hsutils;
-
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-
-public class ZipIt {
- private static final int BUFFER = 2048;
-
- private String[] _files;
- private String _zipFile;
-
- public ZipIt(String[] files, String zipFile) {
- _files = files;
- _zipFile = zipFile;
- }
-
- public boolean zip() {
- try {
- BufferedInputStream origin = null;
- FileOutputStream dest = new FileOutputStream(_zipFile);
-
- ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
-
- byte data[] = new byte[BUFFER];
-
- for (String _file : _files) {
- FileInputStream fi = new FileInputStream(_file);
- origin = new BufferedInputStream(fi, BUFFER);
- ZipEntry entry = new ZipEntry(_file.substring(_file.lastIndexOf("/") + 1));
- out.putNextEntry(entry);
- int count;
- while ((count = origin.read(data, 0, BUFFER)) != -1) {
- out.write(data, 0, count);
- }
- origin.close();
- }
-
- out.close();
- } catch (Exception e) {
- return false;
- }
-
- return true;
- }
-
- public boolean unzip(String output_path) {
- InputStream is;
- ZipInputStream zis;
-
- try {
- String filename;
- is = new FileInputStream(_zipFile);
- zis = new ZipInputStream(new BufferedInputStream(is));
- ZipEntry ze;
- byte[] buffer = new byte[1024];
- int count;
-
- while ((ze = zis.getNextEntry()) != null) {
- // zapis do souboru
- filename = ze.getName();
-
- // Need to create directories if not exists, or
- // it will generate an Exception...
- if (ze.isDirectory()) {
- File fmd = new File(output_path + filename);
- fmd.mkdirs();
- continue;
- }
-
- FileOutputStream fout = new FileOutputStream(output_path + filename);
-
- // cteni zipu a zapis
- while ((count = zis.read(buffer)) != -1) {
- fout.write(buffer, 0, count);
- }
-
- fout.close();
- zis.closeEntry();
- }
-
- zis.close();
- } catch (IOException e) {
- e.printStackTrace();
- return false;
- }
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/torproject/android/storage/ExternalStorage.java b/app/src/main/java/org/torproject/android/storage/ExternalStorage.java
new file mode 100644
index 0000000..6da650d
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/storage/ExternalStorage.java
@@ -0,0 +1,42 @@
+package org.torproject.android.storage;
+
+import android.os.Environment;
+
+import java.io.File;
+
+public class ExternalStorage {
+ private final String BACKUPS_DIR = "Orbot-HiddenServices";
+
+ public String createBackupDir() {
+ if (!isExternalStorageWritable()) {
+ return null;
+ }
+
+ File path = Environment.getExternalStoragePublicDirectory(BACKUPS_DIR);
+
+ if (!path.mkdirs()) {
+ return null;
+ }
+
+ return path.getAbsolutePath();
+ }
+
+ /* Checks if external storage is available for read and write */
+ public boolean isExternalStorageWritable() {
+ String state = Environment.getExternalStorageState();
+ if (Environment.MEDIA_MOUNTED.equals(state)) {
+ return true;
+ }
+ return false;
+ }
+
+ /* Checks if external storage is available to at least read */
+ public boolean isExternalStorageReadable() {
+ String state = Environment.getExternalStorageState();
+ if (Environment.MEDIA_MOUNTED.equals(state) ||
+ Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/app/src/main/java/org/torproject/android/storage/GrantedPermissionsAction.java b/app/src/main/java/org/torproject/android/storage/GrantedPermissionsAction.java
new file mode 100644
index 0000000..9a62a74
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/storage/GrantedPermissionsAction.java
@@ -0,0 +1,7 @@
+package org.torproject.android.storage;
+
+import android.content.Context;
+
+public abstract class GrantedPermissionsAction {
+ public abstract void run(Context context, boolean granted);
+}
diff --git a/app/src/main/java/org/torproject/android/zip/ZipIt.java b/app/src/main/java/org/torproject/android/zip/ZipIt.java
new file mode 100644
index 0000000..84a0b7a
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/zip/ZipIt.java
@@ -0,0 +1,98 @@
+package org.torproject.android.zip;
+
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+public class ZipIt {
+ private static final int BUFFER = 2048;
+
+ private String[] _files;
+ private String _zipFile;
+
+ public ZipIt(String[] files, String zipFile) {
+ _files = files;
+ _zipFile = zipFile;
+ }
+
+ public boolean zip() {
+ try {
+ BufferedInputStream origin = null;
+ FileOutputStream dest = new FileOutputStream(_zipFile);
+
+ ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
+
+ byte data[] = new byte[BUFFER];
+
+ for (String _file : _files) {
+ FileInputStream fi = new FileInputStream(_file);
+ origin = new BufferedInputStream(fi, BUFFER);
+ ZipEntry entry = new ZipEntry(_file.substring(_file.lastIndexOf("/") + 1));
+ out.putNextEntry(entry);
+ int count;
+ while ((count = origin.read(data, 0, BUFFER)) != -1) {
+ out.write(data, 0, count);
+ }
+ origin.close();
+ }
+
+ out.close();
+ } catch (Exception e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public boolean unzip(String output_path) {
+ InputStream is;
+ ZipInputStream zis;
+
+ try {
+ String filename;
+ is = new FileInputStream(_zipFile);
+ zis = new ZipInputStream(new BufferedInputStream(is));
+ ZipEntry ze;
+ byte[] buffer = new byte[1024];
+ int count;
+
+ while ((ze = zis.getNextEntry()) != null) {
+ // zapis do souboru
+ filename = ze.getName();
+
+ // Need to create directories if not exists, or
+ // it will generate an Exception...
+ if (ze.isDirectory()) {
+ File fmd = new File(output_path + filename);
+ fmd.mkdirs();
+ continue;
+ }
+
+ FileOutputStream fout = new FileOutputStream(output_path + filename);
+
+ // cteni zipu a zapis
+ while ((count = zis.read(buffer)) != -1) {
+ fout.write(buffer, 0, count);
+ }
+
+ fout.close();
+ zis.closeEntry();
+ }
+
+ zis.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+}
\ No newline at end of file
[View Less]
1
0
commit 0fd59bc78d22924ecc306899e6672332815f1cfe
Author: arrase <arrase(a)gmail.com>
Date: Sun Nov 20 23:56:17 2016 +0100
restore backup from intent
---
.../org/torproject/android/OrbotMainActivity.java | 79 +++++++++++-----------
.../android/hsutils/HiddenServiceUtils.java | 5 +-
.../java/org/torproject/android/hsutils/ZipIt.java | 48 +++++++++++++
.../android/ui/hs/dialogs/HSActionsDialog.java | 3 +-
4 files changed, 93 insertions(+), 42 deletions(-)
diff --git …
[View More]a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
index 2e4a4e9..b28c3c4 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -525,15 +525,15 @@ public class OrbotMainActivity extends AppCompatActivity
}
else if (item.getItemId() == R.id.menu_hidden_services)
{
- if(usesRuntimePermissions()){
- postPermissionsAction = new GrantedPermissionsAction() {
- @Override
- public void run(Context context, boolean granted) {
- startActivity(new Intent(context, HiddenServicesActivity.class));
- }
- };
-
- checkPermissions();
+ if(usesRuntimePermissions() && !hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
+ postPermissionsAction = new GrantedPermissionsAction() {
+ @Override
+ public void run(Context context, boolean granted) {
+ startActivity(new Intent(context, HiddenServicesActivity.class));
+ }
+ };
+
+ checkPermissions();
} else {
startActivity(new Intent(this, HiddenServicesActivity.class));
}
@@ -615,7 +615,7 @@ public class OrbotMainActivity extends AppCompatActivity
stopVpnService();
}
- private void enableHiddenServicePort (String hsName, final int hsPort, int hsRemotePort, final boolean doBackup) throws RemoteException, InterruptedException
+ private void enableHiddenServicePort (String hsName, final int hsPort, int hsRemotePort, final boolean doBackup, final String keyZipPath) throws RemoteException, InterruptedException
{
String onionHostname = null;
@@ -664,8 +664,15 @@ public class OrbotMainActivity extends AppCompatActivity
Cursor onion = getContentResolver().query(HSContentProvider.CONTENT_URI, mProjection, "port=" + hsPort, null, null);
if(onion != null) {
hostname = onion.getString(onion.getColumnIndex(HSContentProvider.HiddenService.NAME));
- if(doBackup) {
- HiddenServiceUtils hsutils = new HiddenServiceUtils(getApplicationContext());
+ HiddenServiceUtils hsutils = new HiddenServiceUtils(getApplicationContext());
+ if(keyZipPath != null && keyZipPath.length() > 0)
+ {
+ hsutils.restoreOnionBackup(hsPort, keyZipPath);
+ requestTorRereadConfig();
+ }
+
+ if(doBackup)
+ {
backupPath = hsutils.createOnionBackup(hsPort);
}
onion.close();
@@ -686,7 +693,6 @@ public class OrbotMainActivity extends AppCompatActivity
Intent nResult = new Intent();
nResult.putExtra("hs_host", onionHostname);
- // TODO: Add key
setResult(RESULT_OK, nResult);
finish();
@@ -713,23 +719,22 @@ public class OrbotMainActivity extends AppCompatActivity
final int hiddenServiceRemotePort = intent.getIntExtra("hs_onion_port", -1);
final String hiddenServiceName = intent.getStringExtra("hs_name");
final Boolean createBackup = intent.getBooleanExtra("hs_backup",false);
-
- if(createBackup && usesRuntimePermissions())
- checkPermissions();
+ final String keyZipPath = intent.getStringExtra("hs_key_zip_path");
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
- if(createBackup && usesRuntimePermissions()){
+ if(createBackup && usesRuntimePermissions()
+ && !hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
postPermissionsAction = new GrantedPermissionsAction() {
@Override
public void run(Context context, boolean granted) {
try {
enableHiddenServicePort (
hiddenServiceName, hiddenServicePort,
- hiddenServiceRemotePort, createBackup
+ hiddenServiceRemotePort, createBackup, keyZipPath
);
} catch (RemoteException e) {
// TODO Auto-generated catch block
@@ -745,7 +750,7 @@ public class OrbotMainActivity extends AppCompatActivity
try {
enableHiddenServicePort (
hiddenServiceName, hiddenServicePort,
- hiddenServiceRemotePort, createBackup
+ hiddenServiceRemotePort, createBackup, keyZipPath
);
} catch (RemoteException e) {
// TODO Auto-generated catch block
@@ -1605,25 +1610,23 @@ public class OrbotMainActivity extends AppCompatActivity
}
private void checkPermissions() {
- if (!hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- if (ActivityCompat.shouldShowRequestPermissionRationale
- (OrbotMainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- Snackbar.make(findViewById(android.R.id.content),
- R.string.please_grant_permissions_for_external_storage,
- Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ActivityCompat.requestPermissions(OrbotMainActivity.this,
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
- }
- }).show();
- } else {
- ActivityCompat.requestPermissions(OrbotMainActivity.this,
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
- }
+ if (ActivityCompat.shouldShowRequestPermissionRationale
+ (OrbotMainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+ Snackbar.make(findViewById(android.R.id.content),
+ R.string.please_grant_permissions_for_external_storage,
+ Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ ActivityCompat.requestPermissions(OrbotMainActivity.this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
+ }
+ }).show();
+ } else {
+ ActivityCompat.requestPermissions(OrbotMainActivity.this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
}
}
diff --git a/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java b/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java
index 2eb434c..0e96756 100644
--- a/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java
+++ b/app/src/main/java/org/torproject/android/hsutils/HiddenServiceUtils.java
@@ -37,7 +37,8 @@ public class HiddenServiceUtils {
return zip_path;
}
- public void restoreOnionBackup(String path) {
-
+ public void restoreOnionBackup(Integer port, String path) {
+ ZipIt zip = new ZipIt(null, path);
+ zip.unzip(appCacheHome + "/hs" + port);
}
}
diff --git a/app/src/main/java/org/torproject/android/hsutils/ZipIt.java b/app/src/main/java/org/torproject/android/hsutils/ZipIt.java
index 39544ec..25d74a5 100644
--- a/app/src/main/java/org/torproject/android/hsutils/ZipIt.java
+++ b/app/src/main/java/org/torproject/android/hsutils/ZipIt.java
@@ -3,9 +3,13 @@ package org.torproject.android.hsutils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipIt {
@@ -47,4 +51,48 @@ public class ZipIt {
return true;
}
+
+ public boolean unzip(String output_path) {
+ InputStream is;
+ ZipInputStream zis;
+
+ try {
+ String filename;
+ is = new FileInputStream(_zipFile);
+ zis = new ZipInputStream(new BufferedInputStream(is));
+ ZipEntry ze;
+ byte[] buffer = new byte[1024];
+ int count;
+
+ while ((ze = zis.getNextEntry()) != null) {
+ // zapis do souboru
+ filename = ze.getName();
+
+ // Need to create directories if not exists, or
+ // it will generate an Exception...
+ if (ze.isDirectory()) {
+ File fmd = new File(output_path + filename);
+ fmd.mkdirs();
+ continue;
+ }
+
+ FileOutputStream fout = new FileOutputStream(output_path + filename);
+
+ // cteni zipu a zapis
+ while ((count = zis.read(buffer)) != -1) {
+ fout.write(buffer, 0, count);
+ }
+
+ fout.close();
+ zis.closeEntry();
+ }
+
+ zis.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
}
\ No newline at end of file
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 8d6ad37..97361b7 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
@@ -53,11 +53,10 @@ public class HSActionsDialog extends DialogFragment {
Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show();
- Uri selectedUri = Uri.parse(backupPath);
+ Uri selectedUri = Uri.parse(backupPath.substring(0, backupPath.lastIndexOf("/")));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "resource/folder");
-
if (intent.resolveActivityInfo(mContext.getPackageManager(), 0) != null) {
startActivity(intent);
} else {
[View Less]
1
0
commit c232e1c92ed6324ab9bbf3f5bd37d771838d4412
Author: arrase <arrase(a)gmail.com>
Date: Sun Nov 20 01:52:23 2016 +0100
switch to listview
---
app/build.gradle | 1 -
.../android/ui/hs/HiddenServicesActivity.java | 83 ++++++------
.../ui/hs/adapters/CursorRecyclerViewAdapter.java | 144 ---------------------
.../android/ui/hs/adapters/HSAdapter.java | 55 --------
.../android/ui/hs/adapters/OnionListAdapter.java | 36 ++++++
…
[View More] .../android/ui/hs/dialogs/HSDataDialog.java | 5 +-
.../main/res/layout/activity_hidden_services.xml | 34 -----
.../main/res/layout/content_hidden_services.xml | 22 ----
app/src/main/res/layout/dialog_hs_data.xml | 79 -----------
app/src/main/res/layout/layout_hs_data_dialog.xml | 79 +++++++++++
app/src/main/res/layout/layout_hs_list_item.xml | 20 +++
app/src/main/res/layout/layout_hs_list_view.xml | 22 ++++
app/src/main/res/layout/onion_item.xml | 33 -----
13 files changed, 205 insertions(+), 408 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 66d1225..cc364c7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,5 +31,4 @@ dependencies {
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
- compile 'com.android.support:cardview-v7:23.4.0'
}
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 da556da..a2c9280 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
@@ -1,38 +1,49 @@
package org.torproject.android.ui.hs;
+
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.Toolbar;
import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ListView;
import org.torproject.android.R;
-import org.torproject.android.ui.hs.adapters.HSAdapter;
+import org.torproject.android.ui.hs.adapters.OnionListAdapter;
import org.torproject.android.ui.hs.dialogs.HSDataDialog;
import org.torproject.android.ui.hs.providers.HSContentProvider;
public class HiddenServicesActivity extends AppCompatActivity {
- private HSAdapter mHiddenServices;
private ContentResolver mCR;
- private HSObserver mHSObserver;
+ private OnionListAdapter mAdapter;
+
private String[] mProjection = new String[]{
HSContentProvider.HiddenService._ID,
HSContentProvider.HiddenService.NAME,
- HSContentProvider.HiddenService.DOMAIN,
- HSContentProvider.HiddenService.ONION_PORT,
- HSContentProvider.HiddenService.PORT};
+ HSContentProvider.HiddenService.DOMAIN};
+
+ class HSObserver extends ContentObserver {
+ HSObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mAdapter.changeCursor(mCR.query(
+ HSContentProvider.CONTENT_URI, mProjection, null, null, null
+ ));
+ }
+ }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_hidden_services);
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
+ setContentView(R.layout.layout_hs_list_view);
+
+ mCR = getContentResolver();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@@ -43,35 +54,35 @@ public class HiddenServicesActivity extends AppCompatActivity {
}
});
- mCR = getContentResolver();
- // View adapter
- mHiddenServices = new HSAdapter(
- mCR.query(
+ mAdapter = new OnionListAdapter(
+ this,
+ getContentResolver().query(
HSContentProvider.CONTENT_URI, mProjection, null, null, null
- ));
+ ),
+ 0
+ );
- mHSObserver = new HSObserver(new Handler());
- mCR.registerContentObserver(HSContentProvider.CONTENT_URI, true, mHSObserver);
+ mCR.registerContentObserver(
+ HSContentProvider.CONTENT_URI, true, new HSObserver(new Handler())
+ );
- // Fill view
- RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.onion_list);
- mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
- mRecyclerView.setAdapter(mHiddenServices);
- }
+ ListView onion_list = (ListView) findViewById(R.id.onion_list);
+ onion_list.setAdapter(mAdapter);
- class HSObserver extends ContentObserver {
- public HSObserver(Handler handler) {
- super(handler);
- }
+ onion_list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
- @Override
- public void onChange(boolean selfChange) {
- // New data
- mHiddenServices.changeCursor(mCR.query(
- HSContentProvider.CONTENT_URI, mProjection, null, null, null
- ));
- }
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- }
+ }
+ });
+
+ onion_list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
+ @Override
+ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
+ return false;
+ }
+ });
+ }
}
diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java
deleted file mode 100644
index 9798413..0000000
--- a/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package org.torproject.android.ui.hs.adapters;
-
-/*
- * Copyright (C) 2014 skyfish.jy(a)gmail.com
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-import android.database.Cursor;
-import android.database.DataSetObserver;
-import android.support.v7.widget.RecyclerView;
-
-/**
- * Created by skyfishjy on 10/31/14.
- */
-
-public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
-
- private Cursor mCursor;
-
- private boolean mDataValid;
-
- private int mRowIdColumn;
-
- private DataSetObserver mDataSetObserver;
-
- public CursorRecyclerViewAdapter(Cursor cursor) {
- mCursor = cursor;
- mDataValid = cursor != null;
- mRowIdColumn = mDataValid ? mCursor.getColumnIndex("_id") : -1;
- mDataSetObserver = new NotifyingDataSetObserver();
- if (mCursor != null) {
- mCursor.registerDataSetObserver(mDataSetObserver);
- }
- }
-
- @Override
- public int getItemCount() {
- if (mDataValid && mCursor != null) {
- return mCursor.getCount();
- }
- return 0;
- }
-
- @Override
- public long getItemId(int position) {
- if (mDataValid && mCursor != null && mCursor.moveToPosition(position)) {
- return mCursor.getLong(mRowIdColumn);
- }
- return 0;
- }
-
- @Override
- public void setHasStableIds(boolean hasStableIds) {
- super.setHasStableIds(true);
- }
-
- public abstract void onBindViewHolder(VH viewHolder, Cursor cursor);
-
- @Override
- public void onBindViewHolder(VH viewHolder, int position) {
- if (!mDataValid) {
- throw new IllegalStateException("this should only be called when the cursor is valid");
- }
- if (!mCursor.moveToPosition(position)) {
- throw new IllegalStateException("couldn't move cursor to position " + position);
- }
- onBindViewHolder(viewHolder, mCursor);
- }
-
- /**
- * Change the underlying cursor to a new cursor. If there is an existing cursor it will be
- * closed.
- */
- public void changeCursor(Cursor cursor) {
- Cursor old = swapCursor(cursor);
- if (old != null) {
- old.close();
- }
- }
-
- public void closeCursor() {
- mCursor.unregisterDataSetObserver(mDataSetObserver);
- mCursor.close();
- }
-
- /**
- * Swap in a new Cursor, returning the old Cursor. Unlike
- * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em>
- * closed.
- */
- private Cursor swapCursor(Cursor newCursor) {
- if (newCursor == mCursor) {
- return null;
- }
- final Cursor oldCursor = mCursor;
- if (oldCursor != null && mDataSetObserver != null) {
- oldCursor.unregisterDataSetObserver(mDataSetObserver);
- }
- mCursor = newCursor;
- if (mCursor != null) {
- if (mDataSetObserver != null) {
- mCursor.registerDataSetObserver(mDataSetObserver);
- }
- mRowIdColumn = newCursor.getColumnIndexOrThrow("_id");
- mDataValid = true;
- notifyDataSetChanged();
- } else {
- mRowIdColumn = -1;
- mDataValid = false;
- notifyDataSetChanged();
- //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter
- }
- return oldCursor;
- }
-
- private class NotifyingDataSetObserver extends DataSetObserver {
- @Override
- public void onChanged() {
- super.onChanged();
- mDataValid = true;
- notifyDataSetChanged();
- }
-
- @Override
- public void onInvalidated() {
- super.onInvalidated();
- mDataValid = false;
- notifyDataSetChanged();
- //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java
deleted file mode 100644
index 92189ad..0000000
--- a/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.torproject.android.ui.hs.adapters;
-
-import android.database.Cursor;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import org.torproject.android.R;
-import org.torproject.android.ui.hs.providers.HSContentProvider;
-
-public class HSAdapter extends CursorRecyclerViewAdapter<HSAdapter.ViewHolder> {
-
- public HSAdapter(Cursor cursor) {
- super(cursor);
- }
-
- @Override
- public HSAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View v = LayoutInflater.from(parent.getContext())
- .inflate(R.layout.onion_item, parent, false);
-
- ViewHolder vh = new ViewHolder(v);
-
- return vh;
- }
-
- @Override
- public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {
- viewHolder.id = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService._ID));
-
- String name_string = cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.NAME));
- Integer port = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.PORT));
- Integer onion_port = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.ONION_PORT));
-
- viewHolder.name.setText(name_string + ": " + port.toString()+ " -> " +onion_port.toString());
-
- viewHolder.domain.setText(
- cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.DOMAIN))
- );
- }
-
- class ViewHolder extends RecyclerView.ViewHolder {
- TextView name;
- TextView domain;
- Integer id;
-
- ViewHolder(View itemView) {
- super(itemView);
- name = (TextView) itemView.findViewById(R.id.hs_name);
- domain = (TextView) itemView.findViewById(R.id.hs_onion);
- }
- }
-}
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
new file mode 100644
index 0000000..5275730
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/adapters/OnionListAdapter.java
@@ -0,0 +1,36 @@
+package org.torproject.android.ui.hs.adapters;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.support.v4.widget.CursorAdapter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.torproject.android.R;
+import org.torproject.android.ui.hs.providers.HSContentProvider;
+
+public class OnionListAdapter extends CursorAdapter {
+ private LayoutInflater cursorInflater;
+
+ public OnionListAdapter(Context context, Cursor c, int flags) {
+ super(context, c, flags);
+
+ cursorInflater = (LayoutInflater) context.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ 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);
+ domain.setText(cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)));
+ }
+
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ return cursorInflater.inflate(R.layout.layout_hs_list_item, parent, false);
+ }
+}
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
index fb62cb7..67c3691 100644
--- 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
@@ -5,14 +5,11 @@ import android.app.Dialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.os.Bundle;
-import android.support.annotation.BoolRes;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
-import android.support.v4.app.ShareCompat;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.Button;
-import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
@@ -25,7 +22,7 @@ public class HSDataDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Get the layout
- final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.dialog_hs_data, null);
+ final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_data_dialog, null);
// Use the Builder class for convenient dialog construction
final AlertDialog serverDataDialog = new AlertDialog.Builder(getActivity())
diff --git a/app/src/main/res/layout/activity_hidden_services.xml b/app/src/main/res/layout/activity_hidden_services.xml
deleted file mode 100644
index a2e8663..0000000
--- a/app/src/main/res/layout/activity_hidden_services.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fitsSystemWindows="true"
- tools:context="org.torproject.android.ui.hs.HiddenServicesActivity">
-
- <android.support.design.widget.AppBarLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:theme="@style/DefaultTheme.AppBarOverlay">
-
- <android.support.v7.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- android:background="?attr/colorPrimary"
- app:popupTheme="@style/DefaultTheme.PopupOverlay" />
-
- </android.support.design.widget.AppBarLayout>
-
- <include layout="@layout/content_hidden_services" />
-
- <android.support.design.widget.FloatingActionButton
- android:id="@+id/fab"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|end"
- android:layout_margin="@dimen/fab_margin"
- app:srcCompat="@android:drawable/stat_notify_more" />
-
-</android.support.design.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/content_hidden_services.xml b/app/src/main/res/layout/content_hidden_services.xml
deleted file mode 100644
index 39588f9..0000000
--- a/app/src/main/res/layout/content_hidden_services.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/content_hidden_services"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="10dp"
- android:paddingRight="10dp"
- android:paddingTop="@dimen/activity_vertical_margin"
- app:layout_behavior="@string/appbar_scrolling_view_behavior"
- tools:context="org.torproject.android.ui.hs.HiddenServicesActivity"
- tools:showIn="@layout/activity_hidden_services">
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/onion_list"
- android:scrollbars="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
-</RelativeLayout>
diff --git a/app/src/main/res/layout/dialog_hs_data.xml b/app/src/main/res/layout/dialog_hs_data.xml
deleted file mode 100644
index 7379f45..0000000
--- a/app/src/main/res/layout/dialog_hs_data.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?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/local_port"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/HSLocalPortLabel"
- 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/hsLocalPort"
- android:inputType="number" />
-
- <TextView
- android:text="@string/onion_port"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/HSOnionPortLabel"
- 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/hsOnionPort"
- 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/layout/layout_hs_data_dialog.xml b/app/src/main/res/layout/layout_hs_data_dialog.xml
new file mode 100644
index 0000000..7379f45
--- /dev/null
+++ b/app/src/main/res/layout/layout_hs_data_dialog.xml
@@ -0,0 +1,79 @@
+<?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/local_port"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/HSLocalPortLabel"
+ 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/hsLocalPort"
+ android:inputType="number" />
+
+ <TextView
+ android:text="@string/onion_port"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/HSOnionPortLabel"
+ 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/hsOnionPort"
+ 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/layout/layout_hs_list_item.xml b/app/src/main/res/layout/layout_hs_list_item.xml
new file mode 100644
index 0000000..539de8f
--- /dev/null
+++ b/app/src/main/res/layout/layout_hs_list_item.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/hs_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="24sp" />
+
+ <TextView
+ android:id="@+id/hs_onion"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_list_view.xml b/app/src/main/res/layout/layout_hs_list_view.xml
new file mode 100644
index 0000000..551d4e6
--- /dev/null
+++ b/app/src/main/res/layout/layout_hs_list_view.xml
@@ -0,0 +1,22 @@
+<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/main_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ListView
+ android:id="@+id/onion_list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <android.support.design.widget.FloatingActionButton
+ android:id="@+id/fab"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|end"
+ android:layout_margin="16dp"
+ android:src="@android:drawable/stat_notify_more"
+ app:layout_anchor="@id/onion_list"
+ app:layout_anchorGravity="bottom|right|end" />
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/onion_item.xml b/app/src/main/res/layout/onion_item.xml
deleted file mode 100644
index 12fbf1d..0000000
--- a/app/src/main/res/layout/onion_item.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="5dp">
-
- <android.support.v7.widget.CardView
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:padding="5dp">
-
- <TextView
- android:id="@+id/hs_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="24sp"
- android:paddingLeft="5dp" />
-
- <TextView
- android:id="@+id/hs_onion"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:paddingLeft="5dp" />
- </LinearLayout>
- </android.support.v7.widget.CardView>
-</LinearLayout>
\ No newline at end of file
[View Less]
1
0
commit d048cd6fb2292997cea2a974a2ae3923105bd371
Author: arrase <arrase(a)gmail.com>
Date: Sun Nov 20 19:03:45 2016 +0100
request permissions
---
.../android/ui/hs/HiddenServicesActivity.java | 65 ++++++++++++++++++++++
app/src/main/res/values/strings.xml | 3 +
2 files changed, 68 insertions(+)
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
…
[View More]index 26889d0..8a81a40 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
@@ -1,11 +1,17 @@
package org.torproject.android.ui.hs;
+import android.Manifest;
+import android.annotation.SuppressLint;
import android.content.ContentResolver;
+import android.content.pm.PackageManager;
import android.database.ContentObserver;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
@@ -22,6 +28,8 @@ public class HiddenServicesActivity extends AppCompatActivity {
private ContentResolver mCR;
private OnionListAdapter mAdapter;
+ public final int PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
+
private String[] mProjection = new String[]{
HSContentProvider.HiddenService._ID,
HSContentProvider.HiddenService.NAME,
@@ -46,6 +54,9 @@ public class HiddenServicesActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_hs_list_view);
+ if (usesRuntimePermissions())
+ checkPermissions();
+
mCR = getContentResolver();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
@@ -89,4 +100,58 @@ public class HiddenServicesActivity extends AppCompatActivity {
}
});
}
+
+ private boolean usesRuntimePermissions() {
+ return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
+ }
+
+ @SuppressLint("NewApi")
+ private boolean hasPermission(String permission) {
+ return !usesRuntimePermissions() || (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED);
+ }
+
+ private void checkPermissions() {
+ if (!hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale
+ (HiddenServicesActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+ Snackbar.make(findViewById(android.R.id.content),
+ R.string.please_grant_permissions_for_external_storage,
+ Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ ActivityCompat.requestPermissions(HiddenServicesActivity.this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
+ }
+ }).show();
+ } else {
+ ActivityCompat.requestPermissions(HiddenServicesActivity.this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
+ }
+ }
+ }
+
+ @SuppressLint("NewApi")
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
+ // If request is cancelled, the result arrays are empty.
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ Snackbar.make(findViewById(android.R.id.content),
+ R.string.permission_granted,
+ Snackbar.LENGTH_LONG).show();
+ } else {
+ Snackbar.make(findViewById(android.R.id.content),
+ R.string.permission_denied,
+ Snackbar.LENGTH_LONG).show();
+ }
+ break;
+ }
+ }
+ }
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cfa2393..05408dc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -343,4 +343,7 @@
<string name="delete_service">Delete Service</string>
<string name="done">Done!</string>
<string name="filemanager_not_available">Filemanager not available</string>
+ <string name="please_grant_permissions_for_external_storage">Please grant permissions for external storage</string>
+ <string name="permission_granted">Permission granted</string>
+ <string name="permission_denied">Permission denied</string>
</resources>
[View Less]
1
0
commit 3e6c62771209b61e54ecf75ffb39e7bf419af3b5
Author: arrase <arrase(a)gmail.com>
Date: Sun Nov 20 22:31:12 2016 +0100
action moved
---
.../org/torproject/android/OrbotMainActivity.java | 122 ++++++++++++++++++---
.../android/hsutils/GrantedPermissionsAction.java | 7 ++
.../android/ui/hs/HiddenServicesActivity.java | 65 -----------
3 files changed, 113 insertions(+), 81 deletions(-)
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/…
[View More]src/main/java/org/torproject/android/OrbotMainActivity.java
index 85dc028..2e4a4e9 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -16,6 +16,7 @@ import java.util.Random;
import java.util.StringTokenizer;
import org.json.JSONArray;
+import org.torproject.android.hsutils.GrantedPermissionsAction;
import org.torproject.android.service.OrbotConstants;
import org.torproject.android.service.util.Prefs;
import org.torproject.android.service.TorService;
@@ -31,6 +32,7 @@ import org.torproject.android.ui.hs.providers.HSContentProvider;
import org.torproject.android.vpn.VPNEnableActivity;
import org.torproject.android.hsutils.HiddenServiceUtils;
+import android.Manifest;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
@@ -55,6 +57,8 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
+import android.support.design.widget.Snackbar;
+import android.support.v4.app.ActivityCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
@@ -88,6 +92,7 @@ import com.google.zxing.integration.android.IntentResult;
public class OrbotMainActivity extends AppCompatActivity
implements OrbotConstants, OnLongClickListener, OnTouchListener {
+ private GrantedPermissionsAction postPermissionsAction = null;
/* Useful UI bits */
private TextView lblStatus = null; //the main text display widget
@@ -127,7 +132,9 @@ public class OrbotMainActivity extends AppCompatActivity
private static final int MESSAGE_TRAFFIC_COUNT = 2;
public final static String INTENT_ACTION_REQUEST_HIDDEN_SERVICE = "org.torproject.android.REQUEST_HS_PORT";
- public final static String INTENT_ACTION_REQUEST_START_TOR = "org.torproject.android.START_TOR";
+ public final static String INTENT_ACTION_REQUEST_START_TOR = "org.torproject.android.START_TOR";
+
+ public final int PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
// for bridge loading from the assets default bridges.txt file
class Bridge
@@ -518,9 +525,20 @@ public class OrbotMainActivity extends AppCompatActivity
}
else if (item.getItemId() == R.id.menu_hidden_services)
{
- startActivity(new Intent(this, HiddenServicesActivity.class));
+ if(usesRuntimePermissions()){
+ postPermissionsAction = new GrantedPermissionsAction() {
+ @Override
+ public void run(Context context, boolean granted) {
+ startActivity(new Intent(context, HiddenServicesActivity.class));
+ }
+ };
+
+ checkPermissions();
+ } else {
+ startActivity(new Intent(this, HiddenServicesActivity.class));
+ }
}
-
+
return super.onOptionsItemSelected(item);
}
@@ -696,25 +714,47 @@ public class OrbotMainActivity extends AppCompatActivity
final String hiddenServiceName = intent.getStringExtra("hs_name");
final Boolean createBackup = intent.getBooleanExtra("hs_backup",false);
+ if(createBackup && usesRuntimePermissions())
+ checkPermissions();
+
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
-
- try {
- enableHiddenServicePort (
- hiddenServiceName, hiddenServicePort,
- hiddenServiceRemotePort, createBackup
- );
- } catch (RemoteException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ if(createBackup && usesRuntimePermissions()){
+ postPermissionsAction = new GrantedPermissionsAction() {
+ @Override
+ public void run(Context context, boolean granted) {
+ try {
+ enableHiddenServicePort (
+ hiddenServiceName, hiddenServicePort,
+ hiddenServiceRemotePort, createBackup
+ );
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ };
+ checkPermissions();
+ } else {
+ try {
+ enableHiddenServicePort (
+ hiddenServiceName, hiddenServicePort,
+ hiddenServiceRemotePort, createBackup
+ );
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
-
break;
@@ -1553,4 +1593,54 @@ public class OrbotMainActivity extends AppCompatActivity
setNewBridges(sbConfig.toString());
}
+
+
+ private boolean usesRuntimePermissions() {
+ return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
+ }
+
+ @SuppressLint("NewApi")
+ private boolean hasPermission(String permission) {
+ return (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED);
+ }
+
+ private void checkPermissions() {
+ if (!hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale
+ (OrbotMainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+ Snackbar.make(findViewById(android.R.id.content),
+ R.string.please_grant_permissions_for_external_storage,
+ Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ ActivityCompat.requestPermissions(OrbotMainActivity.this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
+ }
+ }).show();
+ } else {
+ ActivityCompat.requestPermissions(OrbotMainActivity.this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+ PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
+ }
+ }
+ }
+
+ @SuppressLint("NewApi")
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
+ // If request is cancelled, the result arrays are empty.
+ boolean granted = (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED);
+
+ postPermissionsAction.run(this, granted);
+
+ break;
+ }
+ }
+ }
}
diff --git a/app/src/main/java/org/torproject/android/hsutils/GrantedPermissionsAction.java b/app/src/main/java/org/torproject/android/hsutils/GrantedPermissionsAction.java
new file mode 100644
index 0000000..31731fa
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/hsutils/GrantedPermissionsAction.java
@@ -0,0 +1,7 @@
+package org.torproject.android.hsutils;
+
+import android.content.Context;
+
+public abstract class GrantedPermissionsAction {
+ public abstract void run(Context context, boolean granted);
+}
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 fa09cdd..26889d0 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
@@ -1,17 +1,11 @@
package org.torproject.android.ui.hs;
-import android.Manifest;
-import android.annotation.SuppressLint;
import android.content.ContentResolver;
-import android.content.pm.PackageManager;
import android.database.ContentObserver;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
-import android.support.design.widget.Snackbar;
-import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
@@ -28,8 +22,6 @@ public class HiddenServicesActivity extends AppCompatActivity {
private ContentResolver mCR;
private OnionListAdapter mAdapter;
- public final int PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
-
private String[] mProjection = new String[]{
HSContentProvider.HiddenService._ID,
HSContentProvider.HiddenService.NAME,
@@ -84,9 +76,6 @@ public class HiddenServicesActivity extends AppCompatActivity {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- if (usesRuntimePermissions())
- checkPermissions();
-
TextView port = (TextView) view.findViewById(R.id.hs_port);
TextView onion = (TextView) view.findViewById(R.id.hs_onion);
@@ -100,58 +89,4 @@ public class HiddenServicesActivity extends AppCompatActivity {
}
});
}
-
- private boolean usesRuntimePermissions() {
- return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
- }
-
- @SuppressLint("NewApi")
- private boolean hasPermission(String permission) {
- return !usesRuntimePermissions() || (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED);
- }
-
- private void checkPermissions() {
- if (!hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- if (ActivityCompat.shouldShowRequestPermissionRationale
- (HiddenServicesActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- Snackbar.make(findViewById(android.R.id.content),
- R.string.please_grant_permissions_for_external_storage,
- Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ActivityCompat.requestPermissions(HiddenServicesActivity.this,
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
- }
- }).show();
- } else {
- ActivityCompat.requestPermissions(HiddenServicesActivity.this,
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
- }
- }
- }
-
- @SuppressLint("NewApi")
- @Override
- public void onRequestPermissionsResult(int requestCode,
- String permissions[], int[] grantResults) {
- switch (requestCode) {
- case PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
- // If request is cancelled, the result arrays are empty.
- if (grantResults.length > 0
- && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- Snackbar.make(findViewById(android.R.id.content),
- R.string.permission_granted,
- Snackbar.LENGTH_LONG).show();
- } else {
- Snackbar.make(findViewById(android.R.id.content),
- R.string.permission_denied,
- Snackbar.LENGTH_LONG).show();
- }
- break;
- }
- }
- }
}
[View Less]
1
0