Removed bundle encryption.

Android doesn't currently store bundles persistently, so it's premature
to protect against accidental information leaks through persistent
bundle storage. Protecting against deliberate information leaks by the
OS is probably futile, so there's currently no need for bundle
encryption.
This commit is contained in:
akwizgran
2013-04-30 15:05:23 +01:00
parent 1d610209d0
commit d5720c085f
31 changed files with 155 additions and 377 deletions

View File

@@ -8,7 +8,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import net.sf.briar.api.android.AndroidExecutor; import net.sf.briar.api.android.AndroidExecutor;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.android.ReferenceManager; import net.sf.briar.api.android.ReferenceManager;
import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoComponent;
@@ -33,8 +32,6 @@ public class AndroidModule extends AbstractModule {
@Override @Override
protected void configure() { protected void configure() {
bind(AndroidExecutor.class).to(AndroidExecutorImpl.class); bind(AndroidExecutor.class).to(AndroidExecutorImpl.class);
bind(BundleEncrypter.class).to(BundleEncrypterImpl.class).in(
Singleton.class);
bind(ReferenceManager.class).to(ReferenceManagerImpl.class).in( bind(ReferenceManager.class).to(ReferenceManagerImpl.class).in(
Singleton.class); Singleton.class);
// Use a single thread so DB accesses from the UI don't overlap, with // Use a single thread so DB accesses from the UI don't overlap, with

View File

@@ -1,36 +0,0 @@
package net.sf.briar.android;
import roboguice.activity.RoboActivity;
import android.os.Bundle;
/**
* An abstract superclass for activities that overrides the default behaviour
* to prevent sensitive state from being saved unless the subclass explicitly
* saves it.
*/
public abstract class BriarActivity extends RoboActivity {
@Override
public void onCreate(Bundle state) {
// Don't pass state through to the superclass
super.onCreate(null);
}
@Override
public void onRestoreInstanceState(Bundle state) {
// Don't pass state through to the superclass
}
@Override
public void onSaveInstanceState(Bundle state) {
// Don't allow the superclass to save state
}
protected void finishOnUiThread() {
runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
}
}

View File

@@ -1,36 +0,0 @@
package net.sf.briar.android;
import roboguice.activity.RoboFragmentActivity;
import android.os.Bundle;
/**
* An abstract superclass for activities that overrides the default behaviour
* to prevent sensitive state from being saved unless the subclass explicitly
* saves it.
*/
public class BriarFragmentActivity extends RoboFragmentActivity {
@Override
public void onCreate(Bundle state) {
// Don't pass state through to the superclass
super.onCreate(null);
}
@Override
public void onRestoreInstanceState(Bundle state) {
// Don't pass state through to the superclass
}
@Override
public void onSaveInstanceState(Bundle state) {
// Don't allow the superclass to save state
}
protected void finishOnUiThread() {
runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
}
}

View File

@@ -1,68 +0,0 @@
package net.sf.briar.android;
import static java.util.logging.Level.INFO;
import java.util.logging.Logger;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.util.ByteUtils;
import android.os.Bundle;
import android.os.Parcel;
import com.google.inject.Inject;
class BundleEncrypterImpl implements BundleEncrypter {
private static final Logger LOG =
Logger.getLogger(BundleEncrypterImpl.class.getName());
private final CryptoComponent crypto;
@Inject
BundleEncrypterImpl(CryptoComponent crypto) {
this.crypto = crypto;
}
@Override
public void encrypt(Bundle b) {
// Marshall the plaintext contents into a byte array
Parcel p = Parcel.obtain();
b.writeToParcel(p, 0);
byte[] plaintext = p.marshall();
p.recycle();
if(LOG.isLoggable(INFO)) {
LOG.info("Marshalled " + b.size() + " mappings, "
+ plaintext.length + " plaintext bytes");
}
// Encrypt the plaintext
byte[] ciphertext = crypto.encryptTemporaryStorage(plaintext);
ByteUtils.erase(plaintext);
// Replace the plaintext contents with the ciphertext
b.clear();
b.putByteArray("net.sf.briar.CIPHERTEXT", ciphertext);
}
@Override
public boolean decrypt(Bundle b) {
// Retrieve the ciphertext
byte[] ciphertext = b.getByteArray("net.sf.briar.CIPHERTEXT");
if(ciphertext == null) throw new IllegalArgumentException();
// Decrypt the ciphertext
byte[] plaintext = crypto.decryptTemporaryStorage(ciphertext);
if(plaintext == null) return false;
// Unmarshall the plaintext
Parcel p = Parcel.obtain();
p.unmarshall(plaintext, 0, plaintext.length);
ByteUtils.erase(plaintext);
// Restore the plaintext contents
p.setDataPosition(0);
b.readFromParcel(p);
p.recycle();
if(LOG.isLoggable(INFO)) {
LOG.info("Unmarshalled " + (b.size() - 1) + " mappings, "
+ plaintext.length + " plaintext bytes");
}
return true;
}
}

View File

@@ -36,6 +36,7 @@ import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DatabaseConfig; import net.sf.briar.api.db.DatabaseConfig;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.util.StringUtils; import net.sf.briar.util.StringUtils;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
@@ -58,7 +59,7 @@ import android.widget.TextView.OnEditorActionListener;
import com.google.inject.Inject; import com.google.inject.Inject;
public class HomeScreenActivity extends BriarActivity { public class HomeScreenActivity extends RoboActivity {
// This build expires at the beginning of June 2013 // This build expires at the beginning of June 2013
private static final long EXPIRY_DATE = 1370044800000L; private static final long EXPIRY_DATE = 1370044800000L;
@@ -84,7 +85,7 @@ public class HomeScreenActivity extends BriarActivity {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
boolean quit = i.getBooleanExtra("net.sf.briar.QUIT", false); boolean quit = i.getBooleanExtra("net.sf.briar.QUIT", false);
long handle = i.getLongExtra("net.sf.briar.LOCAL_AUTHOR_HANDLE", -1); long handle = i.getLongExtra("net.sf.briar.LOCAL_AUTHOR_HANDLE", -1);

View File

@@ -25,6 +25,7 @@ import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.crypto.CryptoExecutor; import net.sf.briar.api.crypto.CryptoExecutor;
import net.sf.briar.api.db.DatabaseConfig; import net.sf.briar.api.db.DatabaseConfig;
import net.sf.briar.util.StringUtils; import net.sf.briar.util.StringUtils;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.Editor;
@@ -40,7 +41,7 @@ import android.widget.TextView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class SetupActivity extends BriarActivity implements OnClickListener { public class SetupActivity extends RoboActivity implements OnClickListener {
private static final int MIN_PASSWORD_LENGTH = 8; private static final int MIN_PASSWORD_LENGTH = 8;
@@ -58,7 +59,7 @@ public class SetupActivity extends BriarActivity implements OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);

View File

@@ -22,7 +22,7 @@ public class SplashScreenActivity extends RoboSplashActivity {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setGravity(CENTER); layout.setGravity(CENTER);

View File

@@ -15,7 +15,6 @@ import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.AscendingHeaderComparator; import net.sf.briar.android.AscendingHeaderComparator;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
@@ -32,6 +31,7 @@ import net.sf.briar.api.db.event.MessageExpiredEvent;
import net.sf.briar.api.db.event.RatingChangedEvent; import net.sf.briar.api.db.event.RatingChangedEvent;
import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -44,7 +44,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class BlogActivity extends BriarFragmentActivity public class BlogActivity extends RoboFragmentActivity
implements DatabaseListener, OnClickListener, OnItemClickListener { implements DatabaseListener, OnClickListener, OnItemClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -65,7 +65,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -125,7 +125,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
displayHeaders(headers); displayHeaders(headers);
} catch(NoSuchSubscriptionException e) { } catch(NoSuchSubscriptionException e) {
if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); if(LOG.isLoggable(INFO)) LOG.info("Subscription removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} catch(DbException e) { } catch(DbException e) {
if(LOG.isLoggable(WARNING)) if(LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e); LOG.log(WARNING, e.toString(), e);
@@ -204,7 +208,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e; SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e;
if(s.getGroup().getId().equals(groupId)) { if(s.getGroup().getId().equals(groupId)) {
if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); if(LOG.isLoggable(INFO)) LOG.info("Subscription removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
} }
} }

View File

@@ -19,7 +19,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
@@ -39,6 +38,7 @@ import net.sf.briar.api.db.event.SubscriptionRemovedEvent;
import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.Group;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import net.sf.briar.api.messaging.GroupStatus; import net.sf.briar.api.messaging.GroupStatus;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -51,7 +51,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class BlogListActivity extends BriarFragmentActivity public class BlogListActivity extends RoboFragmentActivity
implements DatabaseListener, OnClickListener, NoBlogsDialog.Listener, implements DatabaseListener, OnClickListener, NoBlogsDialog.Listener,
OnItemClickListener { OnItemClickListener {
@@ -72,7 +72,7 @@ OnItemClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);

View File

@@ -15,7 +15,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.contact.SelectContactsDialog; import net.sf.briar.android.contact.SelectContactsDialog;
@@ -28,6 +27,7 @@ import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.Group;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -41,7 +41,7 @@ import android.widget.RadioGroup;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ConfigureBlogActivity extends BriarFragmentActivity public class ConfigureBlogActivity extends RoboFragmentActivity
implements OnClickListener, NoContactsDialog.Listener, implements OnClickListener, NoContactsDialog.Listener,
SelectContactsDialog.Listener { SelectContactsDialog.Listener {
@@ -66,7 +66,7 @@ SelectContactsDialog.Listener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -227,7 +227,11 @@ SelectContactsDialog.Listener {
LOG.info("Interrupted while waiting for service"); LOG.info("Interrupted while waiting for service");
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
}); });
} }

View File

@@ -21,7 +21,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.contact.SelectContactsDialog; import net.sf.briar.android.contact.SelectContactsDialog;
@@ -36,6 +35,7 @@ import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.api.messaging.GroupFactory; import net.sf.briar.api.messaging.GroupFactory;
import net.sf.briar.api.messaging.LocalGroup; import net.sf.briar.api.messaging.LocalGroup;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.KeyEvent; import android.view.KeyEvent;
@@ -53,7 +53,7 @@ import android.widget.TextView.OnEditorActionListener;
import com.google.inject.Inject; import com.google.inject.Inject;
public class CreateBlogActivity extends BriarFragmentActivity public class CreateBlogActivity extends RoboFragmentActivity
implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener, implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener,
SelectContactsDialog.Listener { SelectContactsDialog.Listener {
@@ -79,7 +79,7 @@ SelectContactsDialog.Listener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);
@@ -254,7 +254,11 @@ SelectContactsDialog.Listener {
LOG.info("Interrupted while waiting for service"); LOG.info("Interrupted while waiting for service");
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
}); });
} }

View File

@@ -13,7 +13,6 @@ import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -26,6 +25,7 @@ import net.sf.briar.api.db.event.SubscriptionAddedEvent;
import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent;
import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.Group;
import net.sf.briar.api.messaging.GroupStatus; import net.sf.briar.api.messaging.GroupStatus;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -35,7 +35,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ManageBlogsActivity extends BriarFragmentActivity public class ManageBlogsActivity extends RoboFragmentActivity
implements DatabaseListener, OnItemClickListener { implements DatabaseListener, OnItemClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -53,7 +53,7 @@ implements DatabaseListener, OnItemClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
adapter = new ManageBlogsAdapter(this); adapter = new ManageBlogsAdapter(this);
list = new ListView(this); list = new ListView(this);

View File

@@ -19,12 +19,10 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
@@ -32,6 +30,7 @@ import net.sf.briar.api.db.NoSuchMessageException;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import net.sf.briar.api.messaging.Rating; import net.sf.briar.api.messaging.Rating;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
@@ -46,7 +45,7 @@ import android.widget.TextView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ReadBlogPostActivity extends BriarFragmentActivity public class ReadBlogPostActivity extends RoboFragmentActivity
implements OnClickListener { implements OnClickListener {
static final int RESULT_REPLY = RESULT_FIRST_USER; static final int RESULT_REPLY = RESULT_FIRST_USER;
@@ -59,7 +58,6 @@ implements OnClickListener {
private final BriarServiceConnection serviceConnection = private final BriarServiceConnection serviceConnection =
new BriarServiceConnection(); new BriarServiceConnection();
@Inject private BundleEncrypter bundleEncrypter;
private GroupId groupId = null; private GroupId groupId = null;
private boolean postable = false; private boolean postable = false;
private Rating rating = UNRATED; private Rating rating = UNRATED;
@@ -76,7 +74,7 @@ implements OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -97,11 +95,11 @@ implements OnClickListener {
long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1);
if(timestamp == -1) throw new IllegalStateException(); if(timestamp == -1) throw new IllegalStateException();
if(state != null && bundleEncrypter.decrypt(state)) { if(state == null) {
read = state.getBoolean("net.sf.briar.READ");
} else {
read = false; read = false;
setReadInDatabase(true); setReadInDatabase(true);
} else {
read = state.getBoolean("net.sf.briar.READ");
} }
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
@@ -255,7 +253,11 @@ implements OnClickListener {
}); });
} catch(NoSuchMessageException e) { } catch(NoSuchMessageException e) {
if(LOG.isLoggable(INFO)) LOG.info("Message removed"); if(LOG.isLoggable(INFO)) LOG.info("Message removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} catch(DbException e) { } catch(DbException e) {
if(LOG.isLoggable(WARNING)) if(LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e); LOG.log(WARNING, e.toString(), e);
@@ -272,8 +274,8 @@ implements OnClickListener {
@Override @Override
public void onSaveInstanceState(Bundle state) { public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putBoolean("net.sf.briar.READ", read); state.putBoolean("net.sf.briar.READ", read);
bundleEncrypter.encrypt(state);
} }
@Override @Override

View File

@@ -17,7 +17,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.identity.CreateIdentityActivity; import net.sf.briar.android.identity.CreateIdentityActivity;
@@ -26,7 +25,6 @@ import net.sf.briar.android.identity.LocalAuthorItemComparator;
import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter; import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.api.LocalAuthor; import net.sf.briar.api.LocalAuthor;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.crypto.KeyParser; import net.sf.briar.api.crypto.KeyParser;
@@ -37,9 +35,9 @@ import net.sf.briar.api.messaging.LocalGroup;
import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.Message;
import net.sf.briar.api.messaging.MessageFactory; import net.sf.briar.api.messaging.MessageFactory;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable;
import android.text.InputType; import android.text.InputType;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@@ -53,7 +51,7 @@ import android.widget.TextView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class WriteBlogPostActivity extends BriarActivity public class WriteBlogPostActivity extends RoboActivity
implements OnItemSelectedListener, OnClickListener { implements OnItemSelectedListener, OnClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -62,7 +60,6 @@ implements OnItemSelectedListener, OnClickListener {
private final BriarServiceConnection serviceConnection = private final BriarServiceConnection serviceConnection =
new BriarServiceConnection(); new BriarServiceConnection();
@Inject private BundleEncrypter bundleEncrypter;
@Inject private CryptoComponent crypto; @Inject private CryptoComponent crypto;
@Inject private MessageFactory messageFactory; @Inject private MessageFactory messageFactory;
private LocalAuthorSpinnerAdapter fromAdapter = null; private LocalAuthorSpinnerAdapter fromAdapter = null;
@@ -81,7 +78,7 @@ implements OnItemSelectedListener, OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -142,10 +139,6 @@ implements OnItemSelectedListener, OnClickListener {
int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE
| TYPE_TEXT_FLAG_CAP_SENTENCES; | TYPE_TEXT_FLAG_CAP_SENTENCES;
content.setInputType(inputType); content.setInputType(inputType);
if(state != null && bundleEncrypter.decrypt(state)) {
Parcelable p = state.getParcelable("net.sf.briar.CONTENT");
if(p != null) content.onRestoreInstanceState(p);
}
layout.addView(content); layout.addView(content);
setContentView(layout); setContentView(layout);
@@ -241,13 +234,6 @@ implements OnItemSelectedListener, OnClickListener {
}); });
} }
@Override
public void onSaveInstanceState(Bundle state) {
Parcelable p = content.onSaveInstanceState();
state.putParcelable("net.sf.briar.CONTENT", p);
bundleEncrypter.encrypt(state);
}
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();

View File

@@ -20,7 +20,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.invitation.AddContactActivity; import net.sf.briar.android.invitation.AddContactActivity;
@@ -37,6 +36,7 @@ import net.sf.briar.api.db.event.DatabaseEvent;
import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.DatabaseListener;
import net.sf.briar.api.transport.ConnectionListener; import net.sf.briar.api.transport.ConnectionListener;
import net.sf.briar.api.transport.ConnectionRegistry; import net.sf.briar.api.transport.ConnectionRegistry;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
@@ -48,7 +48,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ContactListActivity extends BriarActivity public class ContactListActivity extends RoboActivity
implements OnClickListener, DatabaseListener, ConnectionListener { implements OnClickListener, DatabaseListener, ConnectionListener {
private static final Logger LOG = private static final Logger LOG =
@@ -68,7 +68,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);

View File

@@ -15,7 +15,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.contact.SelectContactsDialog; import net.sf.briar.android.contact.SelectContactsDialog;
@@ -28,6 +27,7 @@ import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.Group;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -41,7 +41,7 @@ import android.widget.RadioGroup;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ConfigureGroupActivity extends BriarFragmentActivity public class ConfigureGroupActivity extends RoboFragmentActivity
implements OnClickListener, NoContactsDialog.Listener, implements OnClickListener, NoContactsDialog.Listener,
SelectContactsDialog.Listener { SelectContactsDialog.Listener {
@@ -66,7 +66,7 @@ SelectContactsDialog.Listener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -225,7 +225,11 @@ SelectContactsDialog.Listener {
LOG.info("Interrupted while waiting for service"); LOG.info("Interrupted while waiting for service");
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
}); });
} }

View File

@@ -20,7 +20,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.contact.SelectContactsDialog; import net.sf.briar.android.contact.SelectContactsDialog;
@@ -33,6 +32,7 @@ import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.Group;
import net.sf.briar.api.messaging.GroupFactory; import net.sf.briar.api.messaging.GroupFactory;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.KeyEvent; import android.view.KeyEvent;
@@ -50,7 +50,7 @@ import android.widget.TextView.OnEditorActionListener;
import com.google.inject.Inject; import com.google.inject.Inject;
public class CreateGroupActivity extends BriarFragmentActivity public class CreateGroupActivity extends RoboFragmentActivity
implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener, implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener,
SelectContactsDialog.Listener { SelectContactsDialog.Listener {
@@ -74,7 +74,7 @@ SelectContactsDialog.Listener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);
@@ -188,7 +188,11 @@ SelectContactsDialog.Listener {
} catch(IOException e) { } catch(IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
}); });
} }

View File

@@ -15,7 +15,6 @@ import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.AscendingHeaderComparator; import net.sf.briar.android.AscendingHeaderComparator;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
@@ -32,6 +31,7 @@ import net.sf.briar.api.db.event.MessageExpiredEvent;
import net.sf.briar.api.db.event.RatingChangedEvent; import net.sf.briar.api.db.event.RatingChangedEvent;
import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -44,7 +44,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class GroupActivity extends BriarActivity implements DatabaseListener, public class GroupActivity extends RoboActivity implements DatabaseListener,
OnClickListener, OnItemClickListener { OnClickListener, OnItemClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -64,7 +64,7 @@ OnClickListener, OnItemClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -123,7 +123,11 @@ OnClickListener, OnItemClickListener {
displayHeaders(headers); displayHeaders(headers);
} catch(NoSuchSubscriptionException e) { } catch(NoSuchSubscriptionException e) {
if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); if(LOG.isLoggable(INFO)) LOG.info("Subscription removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} catch(DbException e) { } catch(DbException e) {
if(LOG.isLoggable(WARNING)) if(LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e); LOG.log(WARNING, e.toString(), e);
@@ -202,7 +206,11 @@ OnClickListener, OnItemClickListener {
SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e; SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e;
if(s.getGroup().getId().equals(groupId)) { if(s.getGroup().getId().equals(groupId)) {
if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); if(LOG.isLoggable(INFO)) LOG.info("Subscription removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
} }
} }

View File

@@ -17,7 +17,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
@@ -37,6 +36,7 @@ import net.sf.briar.api.db.event.SubscriptionRemovedEvent;
import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.Group;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import net.sf.briar.api.messaging.GroupStatus; import net.sf.briar.api.messaging.GroupStatus;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -49,7 +49,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class GroupListActivity extends BriarFragmentActivity public class GroupListActivity extends RoboFragmentActivity
implements DatabaseListener, OnClickListener, NoGroupsDialog.Listener, implements DatabaseListener, OnClickListener, NoGroupsDialog.Listener,
OnItemClickListener { OnItemClickListener {
@@ -70,7 +70,7 @@ OnItemClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);

View File

@@ -13,7 +13,6 @@ import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
@@ -26,6 +25,7 @@ import net.sf.briar.api.db.event.SubscriptionAddedEvent;
import net.sf.briar.api.db.event.SubscriptionRemovedEvent; import net.sf.briar.api.db.event.SubscriptionRemovedEvent;
import net.sf.briar.api.messaging.Group; import net.sf.briar.api.messaging.Group;
import net.sf.briar.api.messaging.GroupStatus; import net.sf.briar.api.messaging.GroupStatus;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -35,7 +35,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ManageGroupsActivity extends BriarFragmentActivity public class ManageGroupsActivity extends RoboFragmentActivity
implements DatabaseListener, OnItemClickListener { implements DatabaseListener, OnItemClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -53,7 +53,7 @@ implements DatabaseListener, OnItemClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
adapter = new ManageGroupsAdapter(this); adapter = new ManageGroupsAdapter(this);
list = new ListView(this); list = new ListView(this);

View File

@@ -19,13 +19,11 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.api.AuthorId; import net.sf.briar.api.AuthorId;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
@@ -33,6 +31,7 @@ import net.sf.briar.api.db.NoSuchMessageException;
import net.sf.briar.api.messaging.GroupId; import net.sf.briar.api.messaging.GroupId;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import net.sf.briar.api.messaging.Rating; import net.sf.briar.api.messaging.Rating;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
@@ -47,7 +46,7 @@ import android.widget.TextView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ReadGroupPostActivity extends BriarActivity public class ReadGroupPostActivity extends RoboActivity
implements OnClickListener { implements OnClickListener {
static final int RESULT_REPLY = RESULT_FIRST_USER; static final int RESULT_REPLY = RESULT_FIRST_USER;
@@ -60,7 +59,6 @@ implements OnClickListener {
private final BriarServiceConnection serviceConnection = private final BriarServiceConnection serviceConnection =
new BriarServiceConnection(); new BriarServiceConnection();
@Inject private BundleEncrypter bundleEncrypter;
private GroupId groupId = null; private GroupId groupId = null;
private Rating rating = UNRATED; private Rating rating = UNRATED;
private boolean read; private boolean read;
@@ -78,7 +76,7 @@ implements OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -104,11 +102,11 @@ implements OnClickListener {
long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1);
if(timestamp == -1) throw new IllegalStateException(); if(timestamp == -1) throw new IllegalStateException();
if(state != null && bundleEncrypter.decrypt(state)) { if(state == null) {
read = state.getBoolean("net.sf.briar.READ");
} else {
read = false; read = false;
setReadInDatabase(true); setReadInDatabase(true);
} else {
read = state.getBoolean("net.sf.briar.READ");
} }
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
@@ -279,7 +277,11 @@ implements OnClickListener {
}); });
} catch(NoSuchMessageException e) { } catch(NoSuchMessageException e) {
if(LOG.isLoggable(INFO)) LOG.info("Message removed"); if(LOG.isLoggable(INFO)) LOG.info("Message removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} catch(DbException e) { } catch(DbException e) {
if(LOG.isLoggable(WARNING)) if(LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e); LOG.log(WARNING, e.toString(), e);
@@ -296,8 +298,8 @@ implements OnClickListener {
@Override @Override
public void onSaveInstanceState(Bundle state) { public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putBoolean("net.sf.briar.READ", read); state.putBoolean("net.sf.briar.READ", read);
bundleEncrypter.encrypt(state);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.identity.CreateIdentityActivity; import net.sf.briar.android.identity.CreateIdentityActivity;
@@ -29,7 +28,6 @@ import net.sf.briar.android.identity.LocalAuthorItemComparator;
import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter; import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.api.LocalAuthor; import net.sf.briar.api.LocalAuthor;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.crypto.KeyParser; import net.sf.briar.api.crypto.KeyParser;
@@ -40,9 +38,9 @@ import net.sf.briar.api.messaging.GroupId;
import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.Message;
import net.sf.briar.api.messaging.MessageFactory; import net.sf.briar.api.messaging.MessageFactory;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable;
import android.text.InputType; import android.text.InputType;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@@ -56,7 +54,7 @@ import android.widget.TextView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class WriteGroupPostActivity extends BriarActivity public class WriteGroupPostActivity extends RoboActivity
implements OnItemSelectedListener, OnClickListener { implements OnItemSelectedListener, OnClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -65,7 +63,6 @@ implements OnItemSelectedListener, OnClickListener {
private final BriarServiceConnection serviceConnection = private final BriarServiceConnection serviceConnection =
new BriarServiceConnection(); new BriarServiceConnection();
@Inject private BundleEncrypter bundleEncrypter;
@Inject private CryptoComponent crypto; @Inject private CryptoComponent crypto;
@Inject private MessageFactory messageFactory; @Inject private MessageFactory messageFactory;
private LocalAuthorSpinnerAdapter fromAdapter = null; private LocalAuthorSpinnerAdapter fromAdapter = null;
@@ -84,7 +81,7 @@ implements OnItemSelectedListener, OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID");
@@ -145,10 +142,6 @@ implements OnItemSelectedListener, OnClickListener {
int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE
| TYPE_TEXT_FLAG_CAP_SENTENCES; | TYPE_TEXT_FLAG_CAP_SENTENCES;
content.setInputType(inputType); content.setInputType(inputType);
if(state != null && bundleEncrypter.decrypt(state)) {
Parcelable p = state.getParcelable("net.sf.briar.CONTENT");
if(p != null) content.onRestoreInstanceState(p);
}
layout.addView(content); layout.addView(content);
setContentView(layout); setContentView(layout);
@@ -246,13 +239,6 @@ implements OnItemSelectedListener, OnClickListener {
}); });
} }
@Override
public void onSaveInstanceState(Bundle state) {
Parcelable p = content.onSaveInstanceState();
state.putParcelable("net.sf.briar.CONTENT", p);
bundleEncrypter.encrypt(state);
}
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();

View File

@@ -20,7 +20,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.api.AuthorFactory; import net.sf.briar.api.AuthorFactory;
@@ -30,6 +29,7 @@ import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.crypto.CryptoExecutor; import net.sf.briar.api.crypto.CryptoExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.KeyEvent; import android.view.KeyEvent;
@@ -45,7 +45,7 @@ import android.widget.TextView.OnEditorActionListener;
import com.google.inject.Inject; import com.google.inject.Inject;
public class CreateIdentityActivity extends BriarActivity public class CreateIdentityActivity extends RoboActivity
implements OnEditorActionListener, OnClickListener { implements OnEditorActionListener, OnClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -67,7 +67,7 @@ implements OnEditorActionListener, OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);
@@ -168,7 +168,11 @@ implements OnEditorActionListener, OnClickListener {
LOG.info("Interrupted while waiting for service"); LOG.info("Interrupted while waiting for service");
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
}); });
} }

View File

@@ -12,7 +12,6 @@ import java.util.Collection;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.identity.LocalAuthorItem; import net.sf.briar.android.identity.LocalAuthorItem;
@@ -20,7 +19,6 @@ import net.sf.briar.android.identity.LocalAuthorItemComparator;
import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter; import net.sf.briar.android.identity.LocalAuthorSpinnerAdapter;
import net.sf.briar.api.AuthorId; import net.sf.briar.api.AuthorId;
import net.sf.briar.api.LocalAuthor; import net.sf.briar.api.LocalAuthor;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.android.ReferenceManager; import net.sf.briar.api.android.ReferenceManager;
import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoComponent;
@@ -30,6 +28,7 @@ import net.sf.briar.api.invitation.InvitationListener;
import net.sf.briar.api.invitation.InvitationState; import net.sf.briar.api.invitation.InvitationState;
import net.sf.briar.api.invitation.InvitationTask; import net.sf.briar.api.invitation.InvitationTask;
import net.sf.briar.api.invitation.InvitationTaskFactory; import net.sf.briar.api.invitation.InvitationTaskFactory;
import roboguice.activity.RoboActivity;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@@ -41,7 +40,7 @@ import android.os.Bundle;
import com.google.inject.Inject; import com.google.inject.Inject;
public class AddContactActivity extends BriarActivity public class AddContactActivity extends RoboActivity
implements InvitationListener { implements InvitationListener {
private static final Logger LOG = private static final Logger LOG =
@@ -50,7 +49,6 @@ implements InvitationListener {
private final BriarServiceConnection serviceConnection = private final BriarServiceConnection serviceConnection =
new BriarServiceConnection(); new BriarServiceConnection();
@Inject private BundleEncrypter bundleEncrypter;
@Inject private CryptoComponent crypto; @Inject private CryptoComponent crypto;
@Inject private InvitationTaskFactory invitationTaskFactory; @Inject private InvitationTaskFactory invitationTaskFactory;
@Inject private ReferenceManager referenceManager; @Inject private ReferenceManager referenceManager;
@@ -73,9 +71,9 @@ implements InvitationListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
if(state == null || !bundleEncrypter.decrypt(state)) { if(state == null) {
// This is a new activity or the app has restarted // This is a new activity
setView(new NetworkSetupView(this)); setView(new NetworkSetupView(this));
} else { } else {
// Restore the activity's state // Restore the activity's state
@@ -174,6 +172,7 @@ implements InvitationListener {
@Override @Override
public void onSaveInstanceState(Bundle state) { public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
if(localAuthorId != null) { if(localAuthorId != null) {
state.putByteArray("net.sf.briar.LOCAL_AUTHOR_ID", state.putByteArray("net.sf.briar.LOCAL_AUTHOR_ID",
localAuthorId.getBytes()); localAuthorId.getBytes());
@@ -183,7 +182,6 @@ implements InvitationListener {
state.putBoolean("net.sf.briar.FAILED", connectionFailed); state.putBoolean("net.sf.briar.FAILED", connectionFailed);
state.putString("net.sf.briar.CONTACT_NAME", contactName); state.putString("net.sf.briar.CONTACT_NAME", contactName);
if(task != null) state.putLong("net.sf.briar.TASK_HANDLE", taskHandle); if(task != null) state.putLong("net.sf.briar.TASK_HANDLE", taskHandle);
bundleEncrypter.encrypt(state);
} }
@Override @Override

View File

@@ -13,7 +13,6 @@ import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.AscendingHeaderComparator; import net.sf.briar.android.AscendingHeaderComparator;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
@@ -29,6 +28,7 @@ import net.sf.briar.api.db.event.DatabaseEvent;
import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.DatabaseListener;
import net.sf.briar.api.db.event.MessageExpiredEvent; import net.sf.briar.api.db.event.MessageExpiredEvent;
import net.sf.briar.api.db.event.PrivateMessageAddedEvent; import net.sf.briar.api.db.event.PrivateMessageAddedEvent;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -41,7 +41,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ConversationActivity extends BriarActivity public class ConversationActivity extends RoboActivity
implements DatabaseListener, OnClickListener, OnItemClickListener { implements DatabaseListener, OnClickListener, OnItemClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -62,7 +62,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1);
@@ -124,7 +124,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
displayHeaders(headers); displayHeaders(headers);
} catch(NoSuchContactException e) { } catch(NoSuchContactException e) {
if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); if(LOG.isLoggable(INFO)) LOG.info("Contact removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} catch(DbException e) { } catch(DbException e) {
if(LOG.isLoggable(WARNING)) if(LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e); LOG.log(WARNING, e.toString(), e);
@@ -192,7 +196,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener {
ContactRemovedEvent c = (ContactRemovedEvent) e; ContactRemovedEvent c = (ContactRemovedEvent) e;
if(c.getContactId().equals(contactId)) { if(c.getContactId().equals(contactId)) {
if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); if(LOG.isLoggable(INFO)) LOG.info("Contact removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} }
} else if(e instanceof MessageExpiredEvent) { } else if(e instanceof MessageExpiredEvent) {
if(LOG.isLoggable(INFO)) LOG.info("Message expired, reloading"); if(LOG.isLoggable(INFO)) LOG.info("Message expired, reloading");

View File

@@ -13,7 +13,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarFragmentActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.invitation.AddContactActivity; import net.sf.briar.android.invitation.AddContactActivity;
@@ -30,6 +29,7 @@ import net.sf.briar.api.db.event.DatabaseEvent;
import net.sf.briar.api.db.event.DatabaseListener; import net.sf.briar.api.db.event.DatabaseListener;
import net.sf.briar.api.db.event.MessageExpiredEvent; import net.sf.briar.api.db.event.MessageExpiredEvent;
import net.sf.briar.api.db.event.PrivateMessageAddedEvent; import net.sf.briar.api.db.event.PrivateMessageAddedEvent;
import roboguice.activity.RoboFragmentActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@@ -40,7 +40,7 @@ import android.widget.ListView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ConversationListActivity extends BriarFragmentActivity public class ConversationListActivity extends RoboFragmentActivity
implements OnClickListener, DatabaseListener, NoContactsDialog.Listener { implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
private static final Logger LOG = private static final Logger LOG =
@@ -58,7 +58,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(MATCH_MATCH); layout.setLayoutParams(MATCH_MATCH);
layout.setOrientation(VERTICAL); layout.setOrientation(VERTICAL);

View File

@@ -19,19 +19,18 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalBorder;
import net.sf.briar.android.widgets.HorizontalSpace; import net.sf.briar.android.widgets.HorizontalSpace;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.api.db.NoSuchMessageException; import net.sf.briar.api.db.NoSuchMessageException;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import net.sf.briar.api.messaging.Rating; import net.sf.briar.api.messaging.Rating;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
@@ -46,7 +45,7 @@ import android.widget.TextView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class ReadPrivateMessageActivity extends BriarActivity public class ReadPrivateMessageActivity extends RoboActivity
implements OnClickListener { implements OnClickListener {
static final int RESULT_REPLY = RESULT_FIRST_USER; static final int RESULT_REPLY = RESULT_FIRST_USER;
@@ -59,7 +58,6 @@ implements OnClickListener {
private final BriarServiceConnection serviceConnection = private final BriarServiceConnection serviceConnection =
new BriarServiceConnection(); new BriarServiceConnection();
@Inject private BundleEncrypter bundleEncrypter;
private ContactId contactId = null; private ContactId contactId = null;
private Rating rating = UNRATED; private Rating rating = UNRATED;
private boolean read; private boolean read;
@@ -74,7 +72,7 @@ implements OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1);
@@ -96,11 +94,11 @@ implements OnClickListener {
long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1);
if(timestamp == -1) throw new IllegalStateException(); if(timestamp == -1) throw new IllegalStateException();
if(state != null && bundleEncrypter.decrypt(state)) { if(state == null) {
read = state.getBoolean("net.sf.briar.READ");
} else {
read = false; read = false;
setReadInDatabase(true); setReadInDatabase(true);
} else {
read = state.getBoolean("net.sf.briar.READ");
} }
LinearLayout layout = new LinearLayout(this); LinearLayout layout = new LinearLayout(this);
@@ -249,7 +247,11 @@ implements OnClickListener {
}); });
} catch(NoSuchMessageException e) { } catch(NoSuchMessageException e) {
if(LOG.isLoggable(INFO)) LOG.info("Message removed"); if(LOG.isLoggable(INFO)) LOG.info("Message removed");
finishOnUiThread(); runOnUiThread(new Runnable() {
public void run() {
finish();
}
});
} catch(DbException e) { } catch(DbException e) {
if(LOG.isLoggable(WARNING)) if(LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e); LOG.log(WARNING, e.toString(), e);
@@ -266,8 +268,8 @@ implements OnClickListener {
@Override @Override
public void onSaveInstanceState(Bundle state) { public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putBoolean("net.sf.briar.READ", read); state.putBoolean("net.sf.briar.READ", read);
bundleEncrypter.encrypt(state);
} }
@Override @Override

View File

@@ -17,7 +17,6 @@ import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.R; import net.sf.briar.R;
import net.sf.briar.android.BriarActivity;
import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService;
import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.BriarService.BriarServiceConnection;
import net.sf.briar.android.contact.ContactItem; import net.sf.briar.android.contact.ContactItem;
@@ -29,16 +28,15 @@ import net.sf.briar.api.AuthorId;
import net.sf.briar.api.Contact; import net.sf.briar.api.Contact;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.LocalAuthor; import net.sf.briar.api.LocalAuthor;
import net.sf.briar.api.android.BundleEncrypter;
import net.sf.briar.api.android.DatabaseUiExecutor; import net.sf.briar.api.android.DatabaseUiExecutor;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.Message;
import net.sf.briar.api.messaging.MessageFactory; import net.sf.briar.api.messaging.MessageFactory;
import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.MessageId;
import roboguice.activity.RoboActivity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable;
import android.text.InputType; import android.text.InputType;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@@ -52,7 +50,7 @@ import android.widget.TextView;
import com.google.inject.Inject; import com.google.inject.Inject;
public class WritePrivateMessageActivity extends BriarActivity public class WritePrivateMessageActivity extends RoboActivity
implements OnItemSelectedListener, OnClickListener { implements OnItemSelectedListener, OnClickListener {
private static final Logger LOG = private static final Logger LOG =
@@ -61,7 +59,6 @@ implements OnItemSelectedListener, OnClickListener {
private final BriarServiceConnection serviceConnection = private final BriarServiceConnection serviceConnection =
new BriarServiceConnection(); new BriarServiceConnection();
@Inject private BundleEncrypter bundleEncrypter;
private TextView from = null; private TextView from = null;
private ContactSpinnerAdapter adapter = null; private ContactSpinnerAdapter adapter = null;
private Spinner spinner = null; private Spinner spinner = null;
@@ -78,7 +75,7 @@ implements OnItemSelectedListener, OnClickListener {
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
super.onCreate(null); super.onCreate(state);
Intent i = getIntent(); Intent i = getIntent();
int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1);
@@ -133,10 +130,6 @@ implements OnItemSelectedListener, OnClickListener {
int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE int inputType = TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE
| TYPE_TEXT_FLAG_CAP_SENTENCES; | TYPE_TEXT_FLAG_CAP_SENTENCES;
content.setInputType(inputType); content.setInputType(inputType);
if(state != null && bundleEncrypter.decrypt(state)) {
Parcelable p = state.getParcelable("net.sf.briar.CONTENT");
if(p != null) content.onRestoreInstanceState(p);
}
layout.addView(content); layout.addView(content);
setContentView(layout); setContentView(layout);
@@ -195,13 +188,6 @@ implements OnItemSelectedListener, OnClickListener {
}); });
} }
@Override
public void onSaveInstanceState(Bundle state) {
Parcelable p = content.onSaveInstanceState();
state.putParcelable("net.sf.briar.CONTENT", p);
bundleEncrypter.encrypt(state);
}
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();

View File

@@ -1,27 +0,0 @@
package net.sf.briar.api.android;
import android.os.Bundle;
/**
* Encrypts and decrypts the contents of bundles in case the operating system
* writes them to unencrypted storage.
* <p>
* This interface is designed to be accessed from the UI thread, so
* implementations may not be thread-safe.
*/
public interface BundleEncrypter {
/**
* Encrypts the given bundle, replacing its contents with the encrypted
* data.
*/
void encrypt(Bundle b);
/**
* Decrypts the given bundle, replacing its contents with the decrypted
* data, or returns false if the bundle contains invalid data, which may
* occur if the process that created the encrypted bundle was terminated
* and replaced by the current process.
*/
boolean decrypt(Bundle b);
}

View File

@@ -95,21 +95,6 @@ public interface CryptoComponent {
void encodeTag(byte[] tag, Cipher tagCipher, ErasableKey tagKey, void encodeTag(byte[] tag, Cipher tagCipher, ErasableKey tagKey,
long connection); long connection);
/**
* Encrypts and authenticates the given plaintext so it can be written to
* temporary storage. The ciphertext will not be decryptable after the app
* restarts.
*/
byte[] encryptTemporaryStorage(byte[] plaintext);
/**
* Decrypts and authenticates the given ciphertext that has been read from
* temporary storage. Returns null if the ciphertext cannot be decrypted
* and authenticated (for example, if it was written before the app
* restarted).
*/
byte[] decryptTemporaryStorage(byte[] ciphertext);
/** /**
* Encrypts and authenticates the given plaintext so it can be written to * Encrypts and authenticates the given plaintext so it can be written to
* storage. The encryption and authentication keys are derived from the * storage. The encryption and authentication keys are derived from the

View File

@@ -133,7 +133,6 @@ class CryptoComponentImpl implements CryptoComponent {
private final KeyPairGenerator agreementKeyPairGenerator; private final KeyPairGenerator agreementKeyPairGenerator;
private final KeyPairGenerator signatureKeyPairGenerator; private final KeyPairGenerator signatureKeyPairGenerator;
private final SecureRandom secureRandom; private final SecureRandom secureRandom;
private final ErasableKey temporaryStorageKey;
CryptoComponentImpl() { CryptoComponentImpl() {
Security.addProvider(new BouncyCastleProvider()); Security.addProvider(new BouncyCastleProvider());
@@ -156,7 +155,6 @@ class CryptoComponentImpl implements CryptoComponent {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
secureRandom = new SecureRandom(); secureRandom = new SecureRandom();
temporaryStorageKey = generateSecretKey();
} }
public ErasableKey generateSecretKey() { public ErasableKey generateSecretKey() {
@@ -372,49 +370,6 @@ class CryptoComponentImpl implements CryptoComponent {
} }
} }
public byte[] encryptTemporaryStorage(byte[] input) {
// Generate a random IV
byte[] ivBytes = new byte[STORAGE_IV_BYTES];
secureRandom.nextBytes(ivBytes);
IvParameterSpec iv = new IvParameterSpec(ivBytes);
// The output contains the IV, ciphertext and MAC
int outputLen = STORAGE_IV_BYTES + input.length + GCM_MAC_BYTES;
byte[] output = new byte[outputLen];
System.arraycopy(ivBytes, 0, output, 0, STORAGE_IV_BYTES);
// Initialise the cipher and encrypt the plaintext
Cipher cipher;
try {
cipher = Cipher.getInstance(STORAGE_CIPHER_ALGO, PROVIDER);
cipher.init(ENCRYPT_MODE, temporaryStorageKey, iv);
cipher.doFinal(input, 0, input.length, output, STORAGE_IV_BYTES);
return output;
} catch(GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
public byte[] decryptTemporaryStorage(byte[] input) {
// The input contains the IV, ciphertext and MAC
if(input.length < STORAGE_IV_BYTES + GCM_MAC_BYTES)
return null; // Invalid
IvParameterSpec iv = new IvParameterSpec(input, 0, STORAGE_IV_BYTES);
// Initialise the cipher
Cipher cipher;
try {
cipher = Cipher.getInstance(STORAGE_CIPHER_ALGO, PROVIDER);
cipher.init(DECRYPT_MODE, temporaryStorageKey, iv);
} catch(GeneralSecurityException e) {
throw new RuntimeException(e);
}
// Try to decrypt the ciphertext (may be invalid)
try {
return cipher.doFinal(input, STORAGE_IV_BYTES,
input.length - STORAGE_IV_BYTES);
} catch(GeneralSecurityException e) {
return null; // Invalid
}
}
public byte[] encryptWithPassword(byte[] input, char[] password) { public byte[] encryptWithPassword(byte[] input, char[] password) {
// Generate a random salt // Generate a random salt
byte[] salt = new byte[PBKDF_SALT_BYTES]; byte[] salt = new byte[PBKDF_SALT_BYTES];