tor-android/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java

215 lines
7.9 KiB
Java
Raw Normal View History

2016-11-24 02:56:11 +01:00
package org.torproject.android.ui.hiddenservices;
2016-11-20 01:52:23 +01:00
import android.content.ContentResolver;
2016-11-24 22:22:04 +01:00
import android.content.pm.PackageManager;
import android.database.ContentObserver;
2016-11-28 22:25:59 +01:00
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
2016-11-29 01:41:41 +01:00
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
2016-11-21 21:48:45 +01:00
import android.support.v7.widget.Toolbar;
2016-11-22 01:24:23 +01:00
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
2016-11-20 01:52:23 +01:00
import android.widget.AdapterView;
2016-11-29 01:41:41 +01:00
import android.widget.ArrayAdapter;
2016-11-20 01:52:23 +01:00
import android.widget.ListView;
2016-11-29 01:41:41 +01:00
import android.widget.Spinner;
2016-11-28 23:58:55 +01:00
import android.widget.Toast;
import org.torproject.android.R;
2016-11-24 02:56:11 +01:00
import org.torproject.android.ui.hiddenservices.adapters.OnionListAdapter;
import org.torproject.android.ui.hiddenservices.dialogs.HSActionsDialog;
import org.torproject.android.ui.hiddenservices.dialogs.HSDataDialog;
import org.torproject.android.ui.hiddenservices.dialogs.SelectHSBackupDialog;
2016-12-08 15:22:53 +01:00
import org.torproject.android.ui.hiddenservices.permissions.PermissionManager;
2016-11-24 02:56:11 +01:00
import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;
public class HiddenServicesActivity extends AppCompatActivity {
2016-11-24 22:22:04 +01:00
public final int WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR = 1;
2016-11-27 17:15:15 +01:00
private ContentResolver mResolver;
2016-11-20 01:52:23 +01:00
private OnionListAdapter mAdapter;
2016-11-29 01:41:41 +01:00
private FloatingActionButton fab;
2016-11-20 01:52:23 +01:00
2016-11-22 00:22:22 +01:00
private String mWhere = HSContentProvider.HiddenService.CREATED_BY_USER + "=1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
2016-11-20 01:52:23 +01:00
setContentView(R.layout.layout_hs_list_view);
2016-11-27 17:15:15 +01:00
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
2016-11-21 21:48:45 +01:00
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
2016-11-27 17:15:15 +01:00
mResolver = getContentResolver();
2016-11-29 01:41:41 +01:00
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
2016-11-17 02:57:37 +01:00
HSDataDialog dialog = new HSDataDialog();
dialog.show(getSupportFragmentManager(), "HSDataDialog");
}
});
2016-11-20 01:52:23 +01:00
mAdapter = new OnionListAdapter(
this,
2016-11-27 17:15:15 +01:00
mResolver.query(
HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, mWhere, null, null
),
2016-11-20 01:52:23 +01:00
0
);
2016-11-27 17:15:15 +01:00
mResolver.registerContentObserver(
2016-11-20 01:52:23 +01:00
HSContentProvider.CONTENT_URI, true, new HSObserver(new Handler())
);
2016-11-20 01:52:23 +01:00
ListView onion_list = (ListView) findViewById(R.id.onion_list);
onion_list.setAdapter(mAdapter);
2016-11-20 03:20:14 +01:00
onion_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
2016-11-20 01:52:23 +01:00
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
2016-11-28 22:25:59 +01:00
Cursor item = (Cursor) parent.getItemAtPosition(position);
2016-11-20 04:39:34 +01:00
Bundle arguments = new Bundle();
2016-11-28 23:32:35 +01:00
arguments.putInt(
"_id", item.getInt(item.getColumnIndex(HSContentProvider.HiddenService._ID))
);
2016-11-28 22:25:59 +01:00
arguments.putString(
"port", item.getString(item.getColumnIndex(HSContentProvider.HiddenService.PORT))
);
arguments.putString(
2016-11-28 23:25:19 +01:00
"onion", item.getString(item.getColumnIndex(HSContentProvider.HiddenService.DOMAIN))
2016-11-28 22:25:59 +01:00
);
2016-11-20 04:39:34 +01:00
arguments.putInt(
"auth_cookie", item.getInt(item.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE))
);
arguments.putString(
"auth_cookie_value", item.getString(item.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE))
);
2016-11-20 03:20:14 +01:00
HSActionsDialog dialog = new HSActionsDialog();
2016-11-20 04:39:34 +01:00
dialog.setArguments(arguments);
2016-11-20 03:20:14 +01:00
dialog.show(getSupportFragmentManager(), "HSActionsDialog");
2016-11-20 01:52:23 +01:00
}
});
}
2016-11-20 22:51:36 +01:00
2016-11-22 01:24:23 +01:00
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.hs_menu, menu);
2016-11-29 01:41:41 +01:00
MenuItem item = menu.findItem(R.id.hs_type);
Spinner spinner = (Spinner) MenuItemCompat.getActionView(item);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.array_hs_types, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View v, int pos, long id) {
if (pos == 0) {
mWhere = HSContentProvider.HiddenService.CREATED_BY_USER + "=1";
fab.show();
} else {
mWhere = HSContentProvider.HiddenService.CREATED_BY_USER + "=0";
fab.hide();
}
mAdapter.changeCursor(mResolver.query(
HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, mWhere, null, null
));
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// Do nothing
}
});
2016-11-22 01:24:23 +01:00
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_restore_backup) {
2016-12-08 15:22:53 +01:00
if (PermissionManager.isLollipopOrHigher()
2016-11-24 02:22:41 +01:00
&& !PermissionManager.hasExternalWritePermission(this)) {
2016-12-08 15:22:53 +01:00
PermissionManager.requestExternalWritePermissions(this, WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR);
2016-11-24 02:22:41 +01:00
return true;
}
SelectHSBackupDialog dialog = new SelectHSBackupDialog();
dialog.show(getSupportFragmentManager(), "SelectHSBackupDialog");
2016-11-22 01:24:23 +01:00
}
return super.onOptionsItemSelected(item);
}
2016-11-24 22:22:04 +01:00
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
if (grantResults.length < 1
|| grantResults[0] != PackageManager.PERMISSION_GRANTED) {
return;
}
switch (requestCode) {
case WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR: {
SelectHSBackupDialog dialog = new SelectHSBackupDialog();
dialog.show(getSupportFragmentManager(), "SelectHSBackupDialog");
2016-11-24 22:22:04 +01:00
break;
}
case HSActionsDialog.WRITE_EXTERNAL_STORAGE_FROM_ACTION_DIALOG: {
2016-11-28 23:58:55 +01:00
Toast.makeText(this, R.string.click_again_for_backup, Toast.LENGTH_LONG).show();
2016-11-24 22:22:04 +01:00
break;
}
}
}
2016-11-21 00:00:58 +01:00
class HSObserver extends ContentObserver {
HSObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
2016-11-27 17:15:15 +01:00
mAdapter.changeCursor(mResolver.query(
HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, mWhere, null, null
2016-11-21 00:00:58 +01:00
));
2016-12-08 15:22:53 +01:00
if (PermissionManager.isLollipopOrHigher()) {
Cursor active = mResolver.query(
HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, HSContentProvider.HiddenService.ENABLED + "=1", null, null
);
if (active == null) return;
if (active.getCount() > 0) // Call only if there running services
PermissionManager.requestBatteryPermmssions(HiddenServicesActivity.this, getApplicationContext());
else // Drop whe not needed
PermissionManager.requestDropBatteryPermmssions(HiddenServicesActivity.this, getApplicationContext());
active.close();
}
2016-11-21 00:00:58 +01:00
}
}
}