diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index bdea4954b26f2387e13f1692855e3eff4d87a46f..d09611bf78d49bc4cfd2cebc140b20589e3f3af0 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -63,6 +63,7 @@ <string name="searching_format">Searching for contact with invitation code %06d\u2026</string> <string name="connection_failed">Connection failed</string> <string name="could_not_find_contact">Briar could not find your contact nearby</string> + <string name="could_not_open_camera">Could not access your camera. Please try again!</string> <string name="try_again_button">Try Again</string> <string name="connected_to_contact">Connected to contact</string> <string name="calculating_confirmation_code">Calculating confirmation code\u2026</string> diff --git a/briar-android/src/org/briarproject/android/BriarFragmentActivity.java b/briar-android/src/org/briarproject/android/BriarFragmentActivity.java index e6082e07f11852d6187a2672a987b5962da3816e..0d1fd99acda637c979dde8ff9bacd3b4331caab1 100644 --- a/briar-android/src/org/briarproject/android/BriarFragmentActivity.java +++ b/briar-android/src/org/briarproject/android/BriarFragmentActivity.java @@ -53,7 +53,6 @@ public abstract class BriarFragmentActivity extends BriarActivity { as in Gmail/Inbox. */ startFragment(ContactListFragment.newInstance()); - } else { super.onBackPressed(); } @@ -80,7 +79,7 @@ public abstract class BriarFragmentActivity extends BriarActivity { dialog.show(); } - private void startFragment(BaseFragment fragment, + public void startFragment(BaseFragment fragment, boolean isAddedToBackStack) { startFragment(fragment, 0, 0, isAddedToBackStack); } diff --git a/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java b/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java index e64ad7fa70e57649a47578b3637981bb6b31d9ab..3eb7f7bba94d3eeaef3b8fbd75aa65fa41246c3a 100644 --- a/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java +++ b/briar-android/src/org/briarproject/android/keyagreement/KeyAgreementActivity.java @@ -2,6 +2,7 @@ package org.briarproject.android.keyagreement; import android.os.Bundle; import android.support.v7.widget.Toolbar; +import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; @@ -9,7 +10,8 @@ import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.ActivityComponent; import org.briarproject.android.BriarFragmentActivity; -import org.briarproject.android.fragment.BaseFragment; +import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener; +import org.briarproject.android.keyagreement.ChooseIdentityFragment.IdentitySelectedListener; import org.briarproject.android.util.CustomAnimations; import org.briarproject.api.contact.ContactExchangeListener; import org.briarproject.api.contact.ContactExchangeTask; @@ -32,8 +34,7 @@ import static android.widget.Toast.LENGTH_LONG; import static java.util.logging.Level.WARNING; public class KeyAgreementActivity extends BriarFragmentActivity implements - BaseFragment.BaseFragmentListener, - ChooseIdentityFragment.IdentitySelectedListener, EventListener, + BaseFragmentListener, IdentitySelectedListener, EventListener, ContactExchangeListener { private static final Logger LOG = @@ -43,7 +44,6 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements private static final int STEP_ID = 1; private static final int STEP_QR = 2; - private static final int STEPS = 2; @Inject protected EventBus eventBus; @@ -87,15 +87,14 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements showStep(localAuthorId == null ? STEP_ID : STEP_QR); } - @SuppressWarnings("ConstantConditions") private void showStep(int step) { switch (step) { case STEP_QR: - startFragment(ShowQrCodeFragment.newInstance()); + startFragment(ShowQrCodeFragment.newInstance(), true); break; case STEP_ID: default: - startFragment(ChooseIdentityFragment.newInstance()); + startFragment(ChooseIdentityFragment.newInstance(), true); break; } } @@ -121,6 +120,26 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements } } + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onBackPressed() { + if (getSupportFragmentManager().getBackStackEntryCount() == 1) { + supportFinishAfterTransition(); + } else { + super.onBackPressed(); + } + } + @Override public void showLoadingScreen(boolean isBlocking, int stringId) { if (isBlocking) { diff --git a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java index 36d8e305b0423d072e349382e9d9a3c580cefb4f..2ea18075dc29ee444884047e1914b2f16c4181b3 100644 --- a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java +++ b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java @@ -6,7 +6,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.Camera; -import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Base64; @@ -53,7 +52,6 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; import static android.widget.Toast.LENGTH_LONG; import static java.util.logging.Level.WARNING; -@SuppressWarnings("deprecation") public class ShowQrCodeFragment extends BaseEventFragment implements QrCodeDecoder.ResultCallback { @@ -195,44 +193,24 @@ public class ShowQrCodeFragment extends BaseEventFragment }); } + @SuppressWarnings("deprecation") private void openCamera() { - AsyncTask<Void, Void, Camera> openTask = - new AsyncTask<Void, Void, Camera>() { - @Override - protected Camera doInBackground(Void... unused) { - LOG.info("Opening camera"); - try { - return Camera.open(); - } catch (RuntimeException e) { - LOG.log(WARNING, - "Error opening camera, trying again", e); - try { - Thread.sleep(1000); - } catch (InterruptedException e2) { - LOG.info("Interrupted before second attempt"); - return null; - } - try { - return Camera.open(); - } catch (RuntimeException e2) { - LOG.log(WARNING, "Error opening camera", e2); - return null; - } - } - } - - @Override - protected void onPostExecute(Camera camera) { - if (camera == null) { - // TODO better solution? - LOG.info("No Camera found, finishing..."); - getActivity().finish(); - } else { - cameraView.start(camera, decoder, 0); - } - } - }; - openTask.execute(); + LOG.info("Opening camera"); + Camera camera; + try { + camera = Camera.open(); + } catch (RuntimeException e) { + LOG.log(WARNING, e.toString(), e); + camera = null; + } + if (camera == null) { + LOG.log(WARNING, "Error opening camera"); + Toast.makeText(getActivity(), R.string.could_not_open_camera, + LENGTH_LONG).show(); + finish(); + return; + } + cameraView.start(camera, decoder, 0); } private void releaseCamera() { @@ -242,7 +220,7 @@ public class ShowQrCodeFragment extends BaseEventFragment } catch (RuntimeException e) { LOG.log(WARNING, "Error releasing camera", e); // TODO better solution - getActivity().finish(); + finish(); } } @@ -365,6 +343,10 @@ public class ShowQrCodeFragment extends BaseEventFragment }); } + private void finish() { + getActivity().getSupportFragmentManager().popBackStack(); + } + private class BluetoothStateReceiver extends BroadcastReceiver { @Override