package im.ricochet.androidod; import android.content.SharedPreferences; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import goRicochetMobile.GoRicochetMobile; public class ConnectActivity extends AppCompatActivity { private static final int ONION_ADDRESS_LENGTH = 16; public static final String PREFERNCE_FILE = "im.ricochet.PREFERENCE_FILE"; private static final String TAG = "InitActivity"; private static final String PRIVATE_KEY_KEY = "privateKey"; private static final String CONNECT_TO_ADDRESS_KEY = "connectToAddress"; private static final String RICOCHET_ADDRESS_PREFIX = "ricochet:"; Button regenButton; Button connectButton; ProgressBar connectSpinner; ProgressBar regenIdentSpinner; TextView connectStatusText; TextView regenIdentStatusText; TextView idetityText; EditText addressText; SharedPreferences prefs; @Override protected void onCreate(Bundle savedInstanceState) { // Load identity and connect to addr. Enable appropriate buttons // If no identity, generate. super.onCreate(savedInstanceState); setContentView(im.ricochet.androidod.R.layout.activity_connect); connectStatusText = (TextView)findViewById(R.id.connectStatusTextView); regenIdentStatusText = (TextView)findViewById(R.id.regenIdentStatusText); idetityText = (TextView)findViewById(R.id.identityTextView); regenButton = (Button)findViewById(R.id.regenIdentButton); connectButton = (Button)findViewById(R.id.connectButton); connectSpinner = (ProgressBar)findViewById(R.id.connectProgressBar); regenIdentSpinner = (ProgressBar)findViewById(R.id.regenIdentProgressBar); addressText = (EditText)findViewById(R.id.addressText); prefs = getSharedPreferences(PREFERNCE_FILE, MODE_PRIVATE); regenButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { RegenIdentTask regenIdentTask = new RegenIdentTask(); regenIdentTask.execute(); } }); addressText.addTextChangedListener(new TextWatcher(){ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { validateOnionAddress(); } @Override public void afterTextChanged(Editable s) { } }); String privateKey = prefs.getString(PRIVATE_KEY_KEY, ""); Log.i(TAG, "Private key loaded:\n"+privateKey); if (privateKey.equals("")) { Log.i(TAG, "regenerating pricate key"); RegenIdentTask regenIdentTask = new RegenIdentTask(); regenIdentTask.execute(); } else { Log.i(TAG, "setting identity, enabling regen"); setIdentity(privateKey); Button regenButton = (Button)findViewById(R.id.regenIdentButton); regenButton.setEnabled(true); } String connectToAddress = prefs.getString(CONNECT_TO_ADDRESS_KEY, RICOCHET_ADDRESS_PREFIX); addressText.setText(connectToAddress); validateOnionAddress(); /*Log.i(TAG, "Ready!"); connectStatusText.setText("Ready!"); ProgressBar progressBar = (ProgressBar)findViewById(im.ricochet.androidod.R.id.progressBar); progressBar.setVisibility(View.GONE); Log.i(TAG, "Setting thread policy perms"); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); Log.i(TAG, "Starting Echo Bot"); //GoRicochetMobile.echoBot(privateKey); new EchoBot(privateKey).execute(); */ } private void setIdentity(String privateKey) { Log.i(TAG, "setIdentity(): " + privateKey); String addr = GoRicochetMobile.getOnionAddress(privateKey); Log.i(TAG, "setIdentity(): addr: '" + addr + "'"); idetityText.setText("ricochet:" + addr); } private void validateOnionAddress() { String address = addressText.getText().toString(); if (address.startsWith(RICOCHET_ADDRESS_PREFIX) && address.length() == ONION_ADDRESS_LENGTH + RICOCHET_ADDRESS_PREFIX.length()) { SharedPreferences.Editor prefsEditor = prefs.edit(); prefsEditor.putString(CONNECT_TO_ADDRESS_KEY, address); prefsEditor.commit(); connectButton.setEnabled(true); } else { connectButton.setEnabled(false); } } private class RegenIdentTask extends AsyncTask { @Override protected void onPreExecute() { Log.i(TAG, "RegenIdentTask.onPreExecute()"); regenButton.setEnabled(false); connectButton.setEnabled(false); regenIdentStatusText.setText("Generating new identity..."); regenIdentSpinner.setVisibility(View.VISIBLE); } @Override public String doInBackground(Void... voids) { Log.i(TAG, "RegenIdentTask.doInBackground()"); String privateKey; try { privateKey = GoRicochetMobile.generatePrivateKey(); SharedPreferences.Editor prefsEditor = prefs.edit(); prefsEditor.putString(PRIVATE_KEY_KEY, privateKey); prefsEditor.commit(); return privateKey; } catch (Exception e) { Log.e(TAG, e.toString()); return null; } } @Override protected void onPostExecute(String privateKey) { Log.i(TAG, "RegenIdentTask.onPostExecute(): " + privateKey); regenIdentSpinner.setVisibility(View.INVISIBLE); regenButton.setEnabled(true); validateOnionAddress(); if (privateKey == null) { regenIdentStatusText.setText("ERROR: unable to generate new identity"); } else { regenIdentStatusText.setText(""); setIdentity(privateKey); } } } private class EchoBot extends AsyncTask { String privateKey; public EchoBot(String privateKey) { this.privateKey = privateKey; } @Override public Void doInBackground(Void... voids) { GoRicochetMobile.echoBot(privateKey); return null; } } }