From d5720c085f657195b3560ad04af1b248354cd87a Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 30 Apr 2013 15:05:23 +0100 Subject: [PATCH] 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. --- .../net/sf/briar/android/AndroidModule.java | 3 - .../net/sf/briar/android/BriarActivity.java | 36 ---------- .../briar/android/BriarFragmentActivity.java | 36 ---------- .../sf/briar/android/BundleEncrypterImpl.java | 68 ------------------- .../sf/briar/android/HomeScreenActivity.java | 5 +- .../net/sf/briar/android/SetupActivity.java | 5 +- .../briar/android/SplashScreenActivity.java | 2 +- .../sf/briar/android/blogs/BlogActivity.java | 18 +++-- .../briar/android/blogs/BlogListActivity.java | 6 +- .../android/blogs/ConfigureBlogActivity.java | 12 ++-- .../android/blogs/CreateBlogActivity.java | 12 ++-- .../android/blogs/ManageBlogsActivity.java | 6 +- .../android/blogs/ReadBlogPostActivity.java | 22 +++--- .../android/blogs/WriteBlogPostActivity.java | 20 +----- .../android/contact/ContactListActivity.java | 6 +- .../groups/ConfigureGroupActivity.java | 12 ++-- .../android/groups/CreateGroupActivity.java | 12 ++-- .../briar/android/groups/GroupActivity.java | 18 +++-- .../android/groups/GroupListActivity.java | 6 +- .../android/groups/ManageGroupsActivity.java | 6 +- .../android/groups/ReadGroupPostActivity.java | 22 +++--- .../groups/WriteGroupPostActivity.java | 20 +----- .../identity/CreateIdentityActivity.java | 12 ++-- .../invitation/AddContactActivity.java | 14 ++-- .../messages/ConversationActivity.java | 18 +++-- .../messages/ConversationListActivity.java | 6 +- .../messages/ReadPrivateMessageActivity.java | 22 +++--- .../messages/WritePrivateMessageActivity.java | 20 +----- .../sf/briar/api/android/BundleEncrypter.java | 27 -------- .../sf/briar/api/crypto/CryptoComponent.java | 15 ---- .../sf/briar/crypto/CryptoComponentImpl.java | 45 ------------ 31 files changed, 155 insertions(+), 377 deletions(-) delete mode 100644 briar-android/src/net/sf/briar/android/BriarActivity.java delete mode 100644 briar-android/src/net/sf/briar/android/BriarFragmentActivity.java delete mode 100644 briar-android/src/net/sf/briar/android/BundleEncrypterImpl.java delete mode 100644 briar-api/src/net/sf/briar/api/android/BundleEncrypter.java diff --git a/briar-android/src/net/sf/briar/android/AndroidModule.java b/briar-android/src/net/sf/briar/android/AndroidModule.java index b13d5756f..ceac1c7a4 100644 --- a/briar-android/src/net/sf/briar/android/AndroidModule.java +++ b/briar-android/src/net/sf/briar/android/AndroidModule.java @@ -8,7 +8,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; 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.ReferenceManager; import net.sf.briar.api.crypto.CryptoComponent; @@ -33,8 +32,6 @@ public class AndroidModule extends AbstractModule { @Override protected void configure() { bind(AndroidExecutor.class).to(AndroidExecutorImpl.class); - bind(BundleEncrypter.class).to(BundleEncrypterImpl.class).in( - Singleton.class); bind(ReferenceManager.class).to(ReferenceManagerImpl.class).in( Singleton.class); // Use a single thread so DB accesses from the UI don't overlap, with diff --git a/briar-android/src/net/sf/briar/android/BriarActivity.java b/briar-android/src/net/sf/briar/android/BriarActivity.java deleted file mode 100644 index 5afee39e1..000000000 --- a/briar-android/src/net/sf/briar/android/BriarActivity.java +++ /dev/null @@ -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(); - } - }); - } -} diff --git a/briar-android/src/net/sf/briar/android/BriarFragmentActivity.java b/briar-android/src/net/sf/briar/android/BriarFragmentActivity.java deleted file mode 100644 index 44809a3bf..000000000 --- a/briar-android/src/net/sf/briar/android/BriarFragmentActivity.java +++ /dev/null @@ -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(); - } - }); - } -} diff --git a/briar-android/src/net/sf/briar/android/BundleEncrypterImpl.java b/briar-android/src/net/sf/briar/android/BundleEncrypterImpl.java deleted file mode 100644 index 34197abd1..000000000 --- a/briar-android/src/net/sf/briar/android/BundleEncrypterImpl.java +++ /dev/null @@ -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; - } -} diff --git a/briar-android/src/net/sf/briar/android/HomeScreenActivity.java b/briar-android/src/net/sf/briar/android/HomeScreenActivity.java index 7749ef108..2798b2693 100644 --- a/briar-android/src/net/sf/briar/android/HomeScreenActivity.java +++ b/briar-android/src/net/sf/briar/android/HomeScreenActivity.java @@ -36,6 +36,7 @@ import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseConfig; import net.sf.briar.api.db.DbException; import net.sf.briar.util.StringUtils; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; @@ -58,7 +59,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class HomeScreenActivity extends BriarActivity { +public class HomeScreenActivity extends RoboActivity { // This build expires at the beginning of June 2013 private static final long EXPIRY_DATE = 1370044800000L; @@ -84,7 +85,7 @@ public class HomeScreenActivity extends BriarActivity { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); boolean quit = i.getBooleanExtra("net.sf.briar.QUIT", false); long handle = i.getLongExtra("net.sf.briar.LOCAL_AUTHOR_HANDLE", -1); diff --git a/briar-android/src/net/sf/briar/android/SetupActivity.java b/briar-android/src/net/sf/briar/android/SetupActivity.java index fbae8b829..f54e4e674 100644 --- a/briar-android/src/net/sf/briar/android/SetupActivity.java +++ b/briar-android/src/net/sf/briar/android/SetupActivity.java @@ -25,6 +25,7 @@ import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoExecutor; import net.sf.briar.api.db.DatabaseConfig; import net.sf.briar.util.StringUtils; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; @@ -40,7 +41,7 @@ import android.widget.TextView; 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; @@ -58,7 +59,7 @@ public class SetupActivity extends BriarActivity implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/SplashScreenActivity.java b/briar-android/src/net/sf/briar/android/SplashScreenActivity.java index 2c1e60005..2ff1a7d05 100644 --- a/briar-android/src/net/sf/briar/android/SplashScreenActivity.java +++ b/briar-android/src/net/sf/briar/android/SplashScreenActivity.java @@ -22,7 +22,7 @@ public class SplashScreenActivity extends RoboSplashActivity { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setGravity(CENTER); diff --git a/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java b/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java index 4e8095e9a..c1c0cf077 100644 --- a/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/BlogActivity.java @@ -15,7 +15,6 @@ import java.util.logging.Logger; import net.sf.briar.R; import net.sf.briar.android.AscendingHeaderComparator; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -44,7 +44,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class BlogActivity extends BriarFragmentActivity +public class BlogActivity extends RoboFragmentActivity implements DatabaseListener, OnClickListener, OnItemClickListener { private static final Logger LOG = @@ -65,7 +65,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -125,7 +125,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { displayHeaders(headers); } catch(NoSuchSubscriptionException e) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -204,7 +208,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e; if(s.getGroup().getId().equals(groupId)) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } } } diff --git a/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java b/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java index c7a8f1d0c..adbca52d6 100644 --- a/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/BlogListActivity.java @@ -19,7 +19,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.GroupId; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -51,7 +51,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class BlogListActivity extends BriarFragmentActivity +public class BlogListActivity extends RoboFragmentActivity implements DatabaseListener, OnClickListener, NoBlogsDialog.Listener, OnItemClickListener { @@ -72,7 +72,7 @@ OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java b/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java index e21a4f911..420eebf2b 100644 --- a/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/ConfigureBlogActivity.java @@ -15,7 +15,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.messaging.Group; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -41,7 +41,7 @@ import android.widget.RadioGroup; import com.google.inject.Inject; -public class ConfigureBlogActivity extends BriarFragmentActivity +public class ConfigureBlogActivity extends RoboFragmentActivity implements OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -66,7 +66,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -227,7 +227,11 @@ SelectContactsDialog.Listener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java b/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java index 26444d0f2..fe7d99ae6 100644 --- a/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/CreateBlogActivity.java @@ -21,7 +21,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.messaging.GroupFactory; import net.sf.briar.api.messaging.LocalGroup; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; @@ -53,7 +53,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class CreateBlogActivity extends BriarFragmentActivity +public class CreateBlogActivity extends RoboFragmentActivity implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -79,7 +79,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); @@ -254,7 +254,11 @@ SelectContactsDialog.Listener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java b/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java index 539203a68..32b453e9d 100644 --- a/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/ManageBlogsActivity.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.logging.Logger; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.messaging.Group; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -35,7 +35,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ManageBlogsActivity extends BriarFragmentActivity +public class ManageBlogsActivity extends RoboFragmentActivity implements DatabaseListener, OnItemClickListener { private static final Logger LOG = @@ -53,7 +53,7 @@ implements DatabaseListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); adapter = new ManageBlogsAdapter(this); list = new ListView(this); diff --git a/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java b/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java index f27e0ae4a..51f099304 100644 --- a/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/ReadBlogPostActivity.java @@ -19,12 +19,10 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; 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.db.DatabaseComponent; 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.MessageId; import net.sf.briar.api.messaging.Rating; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; @@ -46,7 +45,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class ReadBlogPostActivity extends BriarFragmentActivity +public class ReadBlogPostActivity extends RoboFragmentActivity implements OnClickListener { static final int RESULT_REPLY = RESULT_FIRST_USER; @@ -59,7 +58,6 @@ implements OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private GroupId groupId = null; private boolean postable = false; private Rating rating = UNRATED; @@ -76,7 +74,7 @@ implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -97,11 +95,11 @@ implements OnClickListener { long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); if(timestamp == -1) throw new IllegalStateException(); - if(state != null && bundleEncrypter.decrypt(state)) { - read = state.getBoolean("net.sf.briar.READ"); - } else { + if(state == null) { read = false; setReadInDatabase(true); + } else { + read = state.getBoolean("net.sf.briar.READ"); } LinearLayout layout = new LinearLayout(this); @@ -255,7 +253,11 @@ implements OnClickListener { }); } catch(NoSuchMessageException e) { if(LOG.isLoggable(INFO)) LOG.info("Message removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -272,8 +274,8 @@ implements OnClickListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); state.putBoolean("net.sf.briar.READ", read); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java index a6e3ab970..e8242ba17 100644 --- a/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java +++ b/briar-android/src/net/sf/briar/android/blogs/WriteBlogPostActivity.java @@ -17,7 +17,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.widgets.HorizontalSpace; 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.crypto.CryptoComponent; 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.MessageFactory; import net.sf.briar.api.messaging.MessageId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; -import android.os.Parcelable; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; @@ -53,7 +51,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class WriteBlogPostActivity extends BriarActivity +public class WriteBlogPostActivity extends RoboActivity implements OnItemSelectedListener, OnClickListener { private static final Logger LOG = @@ -62,7 +60,6 @@ implements OnItemSelectedListener, OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; @Inject private CryptoComponent crypto; @Inject private MessageFactory messageFactory; private LocalAuthorSpinnerAdapter fromAdapter = null; @@ -81,7 +78,7 @@ implements OnItemSelectedListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); 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 | TYPE_TEXT_FLAG_CAP_SENTENCES; 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); 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 public void onDestroy() { super.onDestroy(); diff --git a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java index f6ee26f87..ccc41eb1b 100644 --- a/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java +++ b/briar-android/src/net/sf/briar/android/contact/ContactListActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.transport.ConnectionListener; import net.sf.briar.api.transport.ConnectionRegistry; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -48,7 +48,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ContactListActivity extends BriarActivity +public class ContactListActivity extends RoboActivity implements OnClickListener, DatabaseListener, ConnectionListener { private static final Logger LOG = @@ -68,7 +68,7 @@ implements OnClickListener, DatabaseListener, ConnectionListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java b/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java index be6399344..d432b2833 100644 --- a/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/ConfigureGroupActivity.java @@ -15,7 +15,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.messaging.Group; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -41,7 +41,7 @@ import android.widget.RadioGroup; import com.google.inject.Inject; -public class ConfigureGroupActivity extends BriarFragmentActivity +public class ConfigureGroupActivity extends RoboFragmentActivity implements OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -66,7 +66,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -225,7 +225,11 @@ SelectContactsDialog.Listener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java b/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java index ee0dbafd2..04bd35925 100644 --- a/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/CreateGroupActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.messaging.Group; import net.sf.briar.api.messaging.GroupFactory; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; @@ -50,7 +50,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class CreateGroupActivity extends BriarFragmentActivity +public class CreateGroupActivity extends RoboFragmentActivity implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener, SelectContactsDialog.Listener { @@ -74,7 +74,7 @@ SelectContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); @@ -188,7 +188,11 @@ SelectContactsDialog.Listener { } catch(IOException e) { throw new RuntimeException(e); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/groups/GroupActivity.java b/briar-android/src/net/sf/briar/android/groups/GroupActivity.java index ee389d2fe..9604a5c82 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupActivity.java @@ -15,7 +15,6 @@ import java.util.logging.Logger; import net.sf.briar.R; import net.sf.briar.android.AscendingHeaderComparator; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.SubscriptionRemovedEvent; import net.sf.briar.api.messaging.GroupId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -44,7 +44,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class GroupActivity extends BriarActivity implements DatabaseListener, +public class GroupActivity extends RoboActivity implements DatabaseListener, OnClickListener, OnItemClickListener { private static final Logger LOG = @@ -64,7 +64,7 @@ OnClickListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -123,7 +123,11 @@ OnClickListener, OnItemClickListener { displayHeaders(headers); } catch(NoSuchSubscriptionException e) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -202,7 +206,11 @@ OnClickListener, OnItemClickListener { SubscriptionRemovedEvent s = (SubscriptionRemovedEvent) e; if(s.getGroup().getId().equals(groupId)) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } } } diff --git a/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java b/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java index dcab38c8c..1601f97f2 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java @@ -17,7 +17,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.GroupId; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -49,7 +49,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class GroupListActivity extends BriarFragmentActivity +public class GroupListActivity extends RoboFragmentActivity implements DatabaseListener, OnClickListener, NoGroupsDialog.Listener, OnItemClickListener { @@ -70,7 +70,7 @@ OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java b/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java index 976f8b9a5..a62f607c3 100644 --- a/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/ManageGroupsActivity.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.logging.Logger; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.messaging.Group; import net.sf.briar.api.messaging.GroupStatus; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -35,7 +35,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ManageGroupsActivity extends BriarFragmentActivity +public class ManageGroupsActivity extends RoboFragmentActivity implements DatabaseListener, OnItemClickListener { private static final Logger LOG = @@ -53,7 +53,7 @@ implements DatabaseListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); adapter = new ManageGroupsAdapter(this); list = new ListView(this); diff --git a/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java b/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java index bc5a33a3d..9576d90ef 100644 --- a/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/ReadGroupPostActivity.java @@ -19,13 +19,11 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalSpace; 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.db.DatabaseComponent; 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.MessageId; import net.sf.briar.api.messaging.Rating; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; @@ -47,7 +46,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class ReadGroupPostActivity extends BriarActivity +public class ReadGroupPostActivity extends RoboActivity implements OnClickListener { static final int RESULT_REPLY = RESULT_FIRST_USER; @@ -60,7 +59,6 @@ implements OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private GroupId groupId = null; private Rating rating = UNRATED; private boolean read; @@ -78,7 +76,7 @@ implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); byte[] b = i.getByteArrayExtra("net.sf.briar.GROUP_ID"); @@ -104,11 +102,11 @@ implements OnClickListener { long timestamp = i.getLongExtra("net.sf.briar.TIMESTAMP", -1); if(timestamp == -1) throw new IllegalStateException(); - if(state != null && bundleEncrypter.decrypt(state)) { - read = state.getBoolean("net.sf.briar.READ"); - } else { + if(state == null) { read = false; setReadInDatabase(true); + } else { + read = state.getBoolean("net.sf.briar.READ"); } LinearLayout layout = new LinearLayout(this); @@ -279,7 +277,11 @@ implements OnClickListener { }); } catch(NoSuchMessageException e) { if(LOG.isLoggable(INFO)) LOG.info("Message removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -296,8 +298,8 @@ implements OnClickListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); state.putBoolean("net.sf.briar.READ", read); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java index afacecf6f..cb05d3266 100644 --- a/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/WriteGroupPostActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.widgets.HorizontalSpace; 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.crypto.CryptoComponent; 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.MessageFactory; import net.sf.briar.api.messaging.MessageId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; -import android.os.Parcelable; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; @@ -56,7 +54,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class WriteGroupPostActivity extends BriarActivity +public class WriteGroupPostActivity extends RoboActivity implements OnItemSelectedListener, OnClickListener { private static final Logger LOG = @@ -65,7 +63,6 @@ implements OnItemSelectedListener, OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; @Inject private CryptoComponent crypto; @Inject private MessageFactory messageFactory; private LocalAuthorSpinnerAdapter fromAdapter = null; @@ -84,7 +81,7 @@ implements OnItemSelectedListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); 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 | TYPE_TEXT_FLAG_CAP_SENTENCES; 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); 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 public void onDestroy() { super.onDestroy(); diff --git a/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java b/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java index f5928c8ef..eeadc22e6 100644 --- a/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java +++ b/briar-android/src/net/sf/briar/android/identity/CreateIdentityActivity.java @@ -20,7 +20,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.db.DatabaseComponent; import net.sf.briar.api.db.DbException; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; @@ -45,7 +45,7 @@ import android.widget.TextView.OnEditorActionListener; import com.google.inject.Inject; -public class CreateIdentityActivity extends BriarActivity +public class CreateIdentityActivity extends RoboActivity implements OnEditorActionListener, OnClickListener { private static final Logger LOG = @@ -67,7 +67,7 @@ implements OnEditorActionListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); @@ -168,7 +168,11 @@ implements OnEditorActionListener, OnClickListener { LOG.info("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } }); } diff --git a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java index 33a43d4ad..43378046d 100644 --- a/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java +++ b/briar-android/src/net/sf/briar/android/invitation/AddContactActivity.java @@ -12,7 +12,6 @@ import java.util.Collection; import java.util.concurrent.Executor; import java.util.logging.Logger; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.api.AuthorId; 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.ReferenceManager; 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.InvitationTask; import net.sf.briar.api.invitation.InvitationTaskFactory; +import roboguice.activity.RoboActivity; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; @@ -41,7 +40,7 @@ import android.os.Bundle; import com.google.inject.Inject; -public class AddContactActivity extends BriarActivity +public class AddContactActivity extends RoboActivity implements InvitationListener { private static final Logger LOG = @@ -50,7 +49,6 @@ implements InvitationListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; @Inject private CryptoComponent crypto; @Inject private InvitationTaskFactory invitationTaskFactory; @Inject private ReferenceManager referenceManager; @@ -73,9 +71,9 @@ implements InvitationListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); - if(state == null || !bundleEncrypter.decrypt(state)) { - // This is a new activity or the app has restarted + super.onCreate(state); + if(state == null) { + // This is a new activity setView(new NetworkSetupView(this)); } else { // Restore the activity's state @@ -174,6 +172,7 @@ implements InvitationListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); if(localAuthorId != null) { state.putByteArray("net.sf.briar.LOCAL_AUTHOR_ID", localAuthorId.getBytes()); @@ -183,7 +182,6 @@ implements InvitationListener { state.putBoolean("net.sf.briar.FAILED", connectionFailed); state.putString("net.sf.briar.CONTACT_NAME", contactName); if(task != null) state.putLong("net.sf.briar.TASK_HANDLE", taskHandle); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java index b93b8be7f..68bcd1391 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java @@ -13,7 +13,6 @@ import java.util.logging.Logger; import net.sf.briar.R; import net.sf.briar.android.AscendingHeaderComparator; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.MessageExpiredEvent; import net.sf.briar.api.db.event.PrivateMessageAddedEvent; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -41,7 +41,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ConversationActivity extends BriarActivity +public class ConversationActivity extends RoboActivity implements DatabaseListener, OnClickListener, OnItemClickListener { private static final Logger LOG = @@ -62,7 +62,7 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); int id = i.getIntExtra("net.sf.briar.CONTACT_ID", -1); @@ -124,7 +124,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { displayHeaders(headers); } catch(NoSuchContactException e) { if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -192,7 +196,11 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { ContactRemovedEvent c = (ContactRemovedEvent) e; if(c.getContactId().equals(contactId)) { if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } } else if(e instanceof MessageExpiredEvent) { if(LOG.isLoggable(INFO)) LOG.info("Message expired, reloading"); diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java index 379cedee6..eacfcc1ec 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java @@ -13,7 +13,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarFragmentActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.MessageExpiredEvent; import net.sf.briar.api.db.event.PrivateMessageAddedEvent; +import roboguice.activity.RoboFragmentActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -40,7 +40,7 @@ import android.widget.ListView; import com.google.inject.Inject; -public class ConversationListActivity extends BriarFragmentActivity +public class ConversationListActivity extends RoboFragmentActivity implements OnClickListener, DatabaseListener, NoContactsDialog.Listener { private static final Logger LOG = @@ -58,7 +58,7 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); diff --git a/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java index 811bbd27a..d1b7d3d87 100644 --- a/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ReadPrivateMessageActivity.java @@ -19,19 +19,18 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; import net.sf.briar.android.widgets.HorizontalBorder; import net.sf.briar.android.widgets.HorizontalSpace; 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.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.NoSuchMessageException; import net.sf.briar.api.messaging.MessageId; import net.sf.briar.api.messaging.Rating; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; @@ -46,7 +45,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class ReadPrivateMessageActivity extends BriarActivity +public class ReadPrivateMessageActivity extends RoboActivity implements OnClickListener { static final int RESULT_REPLY = RESULT_FIRST_USER; @@ -59,7 +58,6 @@ implements OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private ContactId contactId = null; private Rating rating = UNRATED; private boolean read; @@ -74,7 +72,7 @@ implements OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); 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); if(timestamp == -1) throw new IllegalStateException(); - if(state != null && bundleEncrypter.decrypt(state)) { - read = state.getBoolean("net.sf.briar.READ"); - } else { + if(state == null) { read = false; setReadInDatabase(true); + } else { + read = state.getBoolean("net.sf.briar.READ"); } LinearLayout layout = new LinearLayout(this); @@ -249,7 +247,11 @@ implements OnClickListener { }); } catch(NoSuchMessageException e) { if(LOG.isLoggable(INFO)) LOG.info("Message removed"); - finishOnUiThread(); + runOnUiThread(new Runnable() { + public void run() { + finish(); + } + }); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -266,8 +268,8 @@ implements OnClickListener { @Override public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); state.putBoolean("net.sf.briar.READ", read); - bundleEncrypter.encrypt(state); } @Override diff --git a/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java b/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java index ef421fcc5..734652ef9 100644 --- a/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/WritePrivateMessageActivity.java @@ -17,7 +17,6 @@ import java.util.concurrent.Executor; import java.util.logging.Logger; import net.sf.briar.R; -import net.sf.briar.android.BriarActivity; import net.sf.briar.android.BriarService; import net.sf.briar.android.BriarService.BriarServiceConnection; 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.ContactId; 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.db.DatabaseComponent; import net.sf.briar.api.db.DbException; import net.sf.briar.api.messaging.Message; import net.sf.briar.api.messaging.MessageFactory; import net.sf.briar.api.messaging.MessageId; +import roboguice.activity.RoboActivity; import android.content.Intent; import android.os.Bundle; -import android.os.Parcelable; import android.text.InputType; import android.view.View; import android.view.View.OnClickListener; @@ -52,7 +50,7 @@ import android.widget.TextView; import com.google.inject.Inject; -public class WritePrivateMessageActivity extends BriarActivity +public class WritePrivateMessageActivity extends RoboActivity implements OnItemSelectedListener, OnClickListener { private static final Logger LOG = @@ -61,7 +59,6 @@ implements OnItemSelectedListener, OnClickListener { private final BriarServiceConnection serviceConnection = new BriarServiceConnection(); - @Inject private BundleEncrypter bundleEncrypter; private TextView from = null; private ContactSpinnerAdapter adapter = null; private Spinner spinner = null; @@ -78,7 +75,7 @@ implements OnItemSelectedListener, OnClickListener { @Override public void onCreate(Bundle state) { - super.onCreate(null); + super.onCreate(state); Intent i = getIntent(); 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 | TYPE_TEXT_FLAG_CAP_SENTENCES; 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); 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 public void onDestroy() { super.onDestroy(); diff --git a/briar-api/src/net/sf/briar/api/android/BundleEncrypter.java b/briar-api/src/net/sf/briar/api/android/BundleEncrypter.java deleted file mode 100644 index e2af1a832..000000000 --- a/briar-api/src/net/sf/briar/api/android/BundleEncrypter.java +++ /dev/null @@ -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. - *

- * 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); -} diff --git a/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java b/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java index 517a7c6d2..3515588e0 100644 --- a/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java +++ b/briar-api/src/net/sf/briar/api/crypto/CryptoComponent.java @@ -95,21 +95,6 @@ public interface CryptoComponent { void encodeTag(byte[] tag, Cipher tagCipher, ErasableKey tagKey, 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 * storage. The encryption and authentication keys are derived from the diff --git a/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java b/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java index c846af33a..d16009c13 100644 --- a/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java +++ b/briar-core/src/net/sf/briar/crypto/CryptoComponentImpl.java @@ -133,7 +133,6 @@ class CryptoComponentImpl implements CryptoComponent { private final KeyPairGenerator agreementKeyPairGenerator; private final KeyPairGenerator signatureKeyPairGenerator; private final SecureRandom secureRandom; - private final ErasableKey temporaryStorageKey; CryptoComponentImpl() { Security.addProvider(new BouncyCastleProvider()); @@ -156,7 +155,6 @@ class CryptoComponentImpl implements CryptoComponent { throw new RuntimeException(e); } secureRandom = new SecureRandom(); - temporaryStorageKey = 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) { // Generate a random salt byte[] salt = new byte[PBKDF_SALT_BYTES];