mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-16 20:59:54 +01:00
Remove lots of unused code for identity selection
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
@@ -22,6 +23,7 @@
|
|||||||
android:src="@drawable/qr_code_intro"/>
|
android:src="@drawable/qr_code_intro"/>
|
||||||
|
|
||||||
<ScrollView
|
<ScrollView
|
||||||
|
android:id="@+id/scrollView"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_weight="1">
|
android:layout_weight="1">
|
||||||
@@ -37,22 +39,6 @@
|
|||||||
android:paddingStart="@dimen/margin_activity_horizontal"
|
android:paddingStart="@dimen/margin_activity_horizontal"
|
||||||
android:paddingTop="@dimen/margin_activity_vertical">
|
android:paddingTop="@dimen/margin_activity_vertical">
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/BriarTextBody"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/your_nickname"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<Spinner
|
|
||||||
android:id="@+id/spinner"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/margin_medium"
|
|
||||||
android:background="@drawable/border_spinner"
|
|
||||||
android:spinnerMode="dropdown"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@@ -65,7 +51,8 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:padding="@dimen/margin_medium"
|
android:padding="@dimen/margin_medium"
|
||||||
android:src="@drawable/qr_code_explanation"/>
|
android:src="@drawable/qr_code_explanation"
|
||||||
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
style="@style/BriarTextBody"
|
style="@style/BriarTextBody"
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<ScrollView
|
<ScrollView
|
||||||
|
android:id="@+id/scrollView"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
@@ -15,22 +17,6 @@
|
|||||||
android:paddingStart="@dimen/margin_activity_horizontal"
|
android:paddingStart="@dimen/margin_activity_horizontal"
|
||||||
android:paddingTop="@dimen/margin_activity_vertical">
|
android:paddingTop="@dimen/margin_activity_vertical">
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/BriarTextBody"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/your_nickname"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<Spinner
|
|
||||||
android:id="@+id/spinner"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/margin_medium"
|
|
||||||
android:background="@drawable/border_spinner"
|
|
||||||
android:spinnerMode="dropdown"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/imageView"
|
android:id="@+id/imageView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -38,7 +24,8 @@
|
|||||||
android:layout_marginTop="@dimen/margin_xlarge"
|
android:layout_marginTop="@dimen/margin_xlarge"
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
android:src="@drawable/qr_code_intro"/>
|
android:src="@drawable/qr_code_intro"
|
||||||
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import org.briarproject.android.introduction.ContactChooserFragment;
|
|||||||
import org.briarproject.android.introduction.IntroductionActivity;
|
import org.briarproject.android.introduction.IntroductionActivity;
|
||||||
import org.briarproject.android.introduction.IntroductionMessageFragment;
|
import org.briarproject.android.introduction.IntroductionMessageFragment;
|
||||||
import org.briarproject.android.invitation.AddContactActivity;
|
import org.briarproject.android.invitation.AddContactActivity;
|
||||||
import org.briarproject.android.keyagreement.ChooseIdentityFragment;
|
import org.briarproject.android.keyagreement.IntroFragment;
|
||||||
import org.briarproject.android.keyagreement.KeyAgreementActivity;
|
import org.briarproject.android.keyagreement.KeyAgreementActivity;
|
||||||
import org.briarproject.android.keyagreement.ShowQrCodeFragment;
|
import org.briarproject.android.keyagreement.ShowQrCodeFragment;
|
||||||
import org.briarproject.android.panic.PanicPreferencesActivity;
|
import org.briarproject.android.panic.PanicPreferencesActivity;
|
||||||
@@ -110,7 +110,7 @@ public interface ActivityComponent {
|
|||||||
void inject(BlogListFragment fragment);
|
void inject(BlogListFragment fragment);
|
||||||
void inject(FeedFragment fragment);
|
void inject(FeedFragment fragment);
|
||||||
void inject(MyBlogsFragment fragment);
|
void inject(MyBlogsFragment fragment);
|
||||||
void inject(ChooseIdentityFragment fragment);
|
void inject(IntroFragment fragment);
|
||||||
void inject(ShowQrCodeFragment fragment);
|
void inject(ShowQrCodeFragment fragment);
|
||||||
void inject(ContactChooserFragment fragment);
|
void inject(ContactChooserFragment fragment);
|
||||||
void inject(ContactSelectorFragment fragment);
|
void inject(ContactSelectorFragment fragment);
|
||||||
|
|||||||
@@ -1,124 +0,0 @@
|
|||||||
package org.briarproject.android.identity;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.SpinnerAdapter;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import org.briarproject.R;
|
|
||||||
import org.briarproject.api.crypto.CryptoComponent;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import im.delight.android.identicons.IdenticonDrawable;
|
|
||||||
|
|
||||||
import static org.briarproject.android.identity.LocalAuthorItem.ANONYMOUS;
|
|
||||||
import static org.briarproject.android.identity.LocalAuthorItem.NEW;
|
|
||||||
|
|
||||||
public class LocalAuthorSpinnerAdapter extends BaseAdapter
|
|
||||||
implements SpinnerAdapter {
|
|
||||||
|
|
||||||
private final Context ctx;
|
|
||||||
private final boolean includeAnonymous;
|
|
||||||
private final List<LocalAuthorItem> list = new ArrayList<LocalAuthorItem>();
|
|
||||||
|
|
||||||
public LocalAuthorSpinnerAdapter(Context ctx, boolean includeAnonymous) {
|
|
||||||
this.ctx = ctx;
|
|
||||||
this.includeAnonymous = includeAnonymous;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void add(LocalAuthorItem item) {
|
|
||||||
list.add(item);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clear() {
|
|
||||||
list.clear();
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCount() {
|
|
||||||
if (list.isEmpty()) return 0;
|
|
||||||
return includeAnonymous ? list.size() + 2 : list.size() + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View getDropDownView(int position, View convertView,
|
|
||||||
ViewGroup parent) {
|
|
||||||
View view;
|
|
||||||
if (convertView == null) {
|
|
||||||
LayoutInflater inflater =
|
|
||||||
(LayoutInflater) ctx
|
|
||||||
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
|
||||||
view = inflater.inflate(R.layout.dropdown_author, parent, false);
|
|
||||||
} else
|
|
||||||
view = convertView;
|
|
||||||
|
|
||||||
TextView name = (TextView) view.findViewById(R.id.nameView);
|
|
||||||
ImageView avatar =
|
|
||||||
(ImageView) view.findViewById(R.id.avatarView);
|
|
||||||
|
|
||||||
LocalAuthorItem item = getItem(position);
|
|
||||||
if (item == ANONYMOUS) {
|
|
||||||
name.setText(R.string.anonymous);
|
|
||||||
avatar.setVisibility(View.INVISIBLE);
|
|
||||||
} else if (item == NEW) {
|
|
||||||
name.setText(R.string.new_identity_item);
|
|
||||||
avatar.setVisibility(View.INVISIBLE);
|
|
||||||
} else {
|
|
||||||
name.setText(item.getLocalAuthor().getName());
|
|
||||||
avatar.setVisibility(View.VISIBLE);
|
|
||||||
avatar.setImageDrawable(new IdenticonDrawable(
|
|
||||||
item.getLocalAuthor().getId().getBytes()));
|
|
||||||
}
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalAuthorItem getItem(int position) {
|
|
||||||
if (includeAnonymous) {
|
|
||||||
if (position == list.size()) return ANONYMOUS;
|
|
||||||
if (position == list.size() + 1) return NEW;
|
|
||||||
return list.get(position);
|
|
||||||
} else {
|
|
||||||
if (position == list.size()) return NEW;
|
|
||||||
return list.get(position);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return android.R.layout.simple_spinner_item;
|
|
||||||
}
|
|
||||||
|
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
|
||||||
View view = getDropDownView(position, convertView, parent);
|
|
||||||
Drawable d = ctx.getResources()
|
|
||||||
.getDrawable(R.drawable.ic_expand_more_black_24dp);
|
|
||||||
if (d != null) {
|
|
||||||
d.setColorFilter(
|
|
||||||
ctx.getResources().getColor(R.color.spinner_arrow),
|
|
||||||
PorterDuff.Mode.SRC_IN);
|
|
||||||
}
|
|
||||||
((TextView) view.findViewById(R.id.nameView))
|
|
||||||
.setCompoundDrawablesWithIntrinsicBounds(null, null, d, null);
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return list.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sort(Comparator<LocalAuthorItem> comparator) {
|
|
||||||
Collections.sort(list, comparator);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -18,7 +18,6 @@ import org.briarproject.api.invitation.InvitationState;
|
|||||||
import org.briarproject.api.invitation.InvitationTask;
|
import org.briarproject.api.invitation.InvitationTask;
|
||||||
import org.briarproject.api.invitation.InvitationTaskFactory;
|
import org.briarproject.api.invitation.InvitationTaskFactory;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
@@ -31,10 +30,9 @@ import static org.briarproject.android.invitation.ConfirmationCodeView.Confirmat
|
|||||||
import static org.briarproject.android.invitation.ConfirmationCodeView.ConfirmationState.WAIT_FOR_CONTACT;
|
import static org.briarproject.android.invitation.ConfirmationCodeView.ConfirmationState.WAIT_FOR_CONTACT;
|
||||||
|
|
||||||
public class AddContactActivity extends BriarActivity
|
public class AddContactActivity extends BriarActivity
|
||||||
implements InvitationListener {
|
implements InvitationListener {
|
||||||
|
|
||||||
static final int REQUEST_BLUETOOTH = 1;
|
static final int REQUEST_BLUETOOTH = 1;
|
||||||
static final int REQUEST_CREATE_IDENTITY = 2;
|
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
Logger.getLogger(AddContactActivity.class.getName());
|
Logger.getLogger(AddContactActivity.class.getName());
|
||||||
@@ -181,11 +179,6 @@ implements InvitationListener {
|
|||||||
public void onActivityResult(int request, int result, Intent data) {
|
public void onActivityResult(int request, int result, Intent data) {
|
||||||
if (request == REQUEST_BLUETOOTH) {
|
if (request == REQUEST_BLUETOOTH) {
|
||||||
if (result != RESULT_CANCELED) reset(new InvitationCodeView(this));
|
if (result != RESULT_CANCELED) reset(new InvitationCodeView(this));
|
||||||
} else if (request == REQUEST_CREATE_IDENTITY && result == RESULT_OK) {
|
|
||||||
byte[] b = data.getByteArrayExtra("briar.LOCAL_AUTHOR_ID");
|
|
||||||
if (b == null) throw new IllegalStateException();
|
|
||||||
localAuthorId = new AuthorId(b);
|
|
||||||
setView(new ChooseIdentityView(this));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,17 +203,16 @@ implements InvitationListener {
|
|||||||
setView(view);
|
setView(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadLocalAuthors() {
|
void loadLocalAuthor() {
|
||||||
runOnDbThread(new Runnable() {
|
runOnDbThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
Collection<LocalAuthor> authors =
|
LocalAuthor author = identityManager.getLocalAuthor();
|
||||||
identityManager.getLocalAuthors();
|
|
||||||
long duration = System.currentTimeMillis() - now;
|
long duration = System.currentTimeMillis() - now;
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO))
|
||||||
LOG.info("Loading authors took " + duration + " ms");
|
LOG.info("Loading author took " + duration + " ms");
|
||||||
displayLocalAuthors(authors);
|
setLocalAuthorId(author.getId());
|
||||||
} 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);
|
||||||
@@ -229,25 +221,15 @@ implements InvitationListener {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: The interaction between views and the container is horrible
|
void setLocalAuthorId(final AuthorId localAuthorId) {
|
||||||
private void displayLocalAuthors(final Collection<LocalAuthor> authors) {
|
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
AddContactView view = AddContactActivity.this.view;
|
AddContactActivity.this.localAuthorId = localAuthorId;
|
||||||
if (view instanceof ChooseIdentityView)
|
|
||||||
((ChooseIdentityView) view).displayLocalAuthors(authors);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLocalAuthorId(AuthorId localAuthorId) {
|
|
||||||
this.localAuthorId = localAuthorId;
|
|
||||||
}
|
|
||||||
|
|
||||||
AuthorId getLocalAuthorId() {
|
|
||||||
return localAuthorId;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getLocalInvitationCode() {
|
int getLocalInvitationCode() {
|
||||||
if (localInvitationCode == -1)
|
if (localInvitationCode == -1)
|
||||||
localInvitationCode = crypto.generateBTInvitationCode();
|
localInvitationCode = crypto.generateBTInvitationCode();
|
||||||
|
|||||||
@@ -5,32 +5,15 @@ import android.content.Intent;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.AdapterView.OnItemSelectedListener;
|
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.Spinner;
|
|
||||||
|
|
||||||
import org.briarproject.R;
|
import org.briarproject.R;
|
||||||
import org.briarproject.android.identity.CreateIdentityActivity;
|
|
||||||
import org.briarproject.android.identity.LocalAuthorItem;
|
|
||||||
import org.briarproject.android.identity.LocalAuthorItemComparator;
|
|
||||||
import org.briarproject.android.identity.LocalAuthorSpinnerAdapter;
|
|
||||||
import org.briarproject.api.identity.AuthorId;
|
|
||||||
import org.briarproject.api.identity.LocalAuthor;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE;
|
import static android.bluetooth.BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE;
|
||||||
import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION;
|
import static android.bluetooth.BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION;
|
||||||
import static org.briarproject.android.identity.LocalAuthorItem.NEW;
|
|
||||||
import static org.briarproject.android.invitation.AddContactActivity.REQUEST_BLUETOOTH;
|
import static org.briarproject.android.invitation.AddContactActivity.REQUEST_BLUETOOTH;
|
||||||
import static org.briarproject.android.invitation.AddContactActivity.REQUEST_CREATE_IDENTITY;
|
|
||||||
|
|
||||||
class ChooseIdentityView extends AddContactView
|
class ChooseIdentityView extends AddContactView implements OnClickListener {
|
||||||
implements OnItemSelectedListener, OnClickListener {
|
|
||||||
|
|
||||||
private LocalAuthorSpinnerAdapter adapter = null;
|
|
||||||
private Spinner spinner = null;
|
|
||||||
|
|
||||||
ChooseIdentityView(Context ctx) {
|
ChooseIdentityView(Context ctx) {
|
||||||
super(ctx);
|
super(ctx);
|
||||||
@@ -44,50 +27,10 @@ implements OnItemSelectedListener, OnClickListener {
|
|||||||
(Context.LAYOUT_INFLATER_SERVICE);
|
(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
View view = inflater.inflate(R.layout.invitation_bluetooth_start, this);
|
View view = inflater.inflate(R.layout.invitation_bluetooth_start, this);
|
||||||
|
|
||||||
adapter = new LocalAuthorSpinnerAdapter(ctx, false);
|
|
||||||
spinner = (Spinner) view.findViewById(R.id.spinner);
|
|
||||||
spinner.setAdapter(adapter);
|
|
||||||
spinner.setOnItemSelectedListener(this);
|
|
||||||
|
|
||||||
Button continueButton = (Button) view.findViewById(R.id.continueButton);
|
Button continueButton = (Button) view.findViewById(R.id.continueButton);
|
||||||
continueButton.setOnClickListener(this);
|
continueButton.setOnClickListener(this);
|
||||||
|
|
||||||
container.loadLocalAuthors();
|
container.loadLocalAuthor();
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: The interaction between views and the container is horrible
|
|
||||||
void displayLocalAuthors(Collection<LocalAuthor> authors) {
|
|
||||||
adapter.clear();
|
|
||||||
for (LocalAuthor a : authors) adapter.add(new LocalAuthorItem(a));
|
|
||||||
adapter.sort(LocalAuthorItemComparator.INSTANCE);
|
|
||||||
// If a local author has been selected, select it again
|
|
||||||
AuthorId localAuthorId = container.getLocalAuthorId();
|
|
||||||
if (localAuthorId == null) return;
|
|
||||||
int count = adapter.getCount();
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
LocalAuthorItem item = adapter.getItem(i);
|
|
||||||
if (item == NEW) continue;
|
|
||||||
if (item.getLocalAuthor().getId().equals(localAuthorId)) {
|
|
||||||
spinner.setSelection(i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onItemSelected(AdapterView<?> parent, View view, int position,
|
|
||||||
long id) {
|
|
||||||
LocalAuthorItem item = adapter.getItem(position);
|
|
||||||
if (item == NEW) {
|
|
||||||
container.setLocalAuthorId(null);
|
|
||||||
Intent i = new Intent(container, CreateIdentityActivity.class);
|
|
||||||
container.startActivityForResult(i, REQUEST_CREATE_IDENTITY);
|
|
||||||
} else {
|
|
||||||
container.setLocalAuthorId(item.getLocalAuthor().getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onNothingSelected(AdapterView<?> parent) {
|
|
||||||
container.setLocalAuthorId(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
|||||||
@@ -1,210 +0,0 @@
|
|||||||
package org.briarproject.android.keyagreement;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.View.OnClickListener;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.AdapterView.OnItemSelectedListener;
|
|
||||||
import android.widget.ScrollView;
|
|
||||||
import android.widget.Spinner;
|
|
||||||
|
|
||||||
import org.briarproject.R;
|
|
||||||
import org.briarproject.android.ActivityComponent;
|
|
||||||
import org.briarproject.android.fragment.BaseFragment;
|
|
||||||
import org.briarproject.android.identity.CreateIdentityActivity;
|
|
||||||
import org.briarproject.android.identity.LocalAuthorItem;
|
|
||||||
import org.briarproject.android.identity.LocalAuthorSpinnerAdapter;
|
|
||||||
import org.briarproject.api.db.DbException;
|
|
||||||
import org.briarproject.api.identity.AuthorId;
|
|
||||||
import org.briarproject.api.identity.IdentityManager;
|
|
||||||
import org.briarproject.api.identity.LocalAuthor;
|
|
||||||
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import static android.app.Activity.RESULT_OK;
|
|
||||||
import static java.util.logging.Level.INFO;
|
|
||||||
import static java.util.logging.Level.WARNING;
|
|
||||||
import static org.briarproject.android.identity.LocalAuthorItem.NEW;
|
|
||||||
|
|
||||||
public class ChooseIdentityFragment extends BaseFragment
|
|
||||||
implements OnItemSelectedListener {
|
|
||||||
|
|
||||||
interface IdentitySelectedListener {
|
|
||||||
void identitySelected(AuthorId localAuthorId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final String TAG = "ChooseIdentityFragment";
|
|
||||||
|
|
||||||
private static final Logger LOG =
|
|
||||||
Logger.getLogger(ChooseIdentityFragment.class.getName());
|
|
||||||
|
|
||||||
private static final int REQUEST_CREATE_IDENTITY = 1;
|
|
||||||
|
|
||||||
private IdentitySelectedListener lsnr;
|
|
||||||
private LocalAuthorSpinnerAdapter adapter;
|
|
||||||
private ScrollView scrollView;
|
|
||||||
private Spinner spinner;
|
|
||||||
private View button;
|
|
||||||
private AuthorId localAuthorId;
|
|
||||||
|
|
||||||
// Fields that are accessed from background threads must be volatile
|
|
||||||
@Inject
|
|
||||||
protected volatile IdentityManager identityManager;
|
|
||||||
|
|
||||||
public static ChooseIdentityFragment newInstance() {
|
|
||||||
|
|
||||||
Bundle args = new Bundle();
|
|
||||||
|
|
||||||
ChooseIdentityFragment fragment = new ChooseIdentityFragment();
|
|
||||||
fragment.setArguments(args);
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void injectFragment(ActivityComponent component) {
|
|
||||||
component.inject(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAttach(Context context) {
|
|
||||||
super.onAttach(context);
|
|
||||||
try {
|
|
||||||
lsnr = (IdentitySelectedListener) context;
|
|
||||||
} catch (ClassCastException e) {
|
|
||||||
throw new ClassCastException(
|
|
||||||
"Using class must implement IdentitySelectedListener");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUniqueTag() {
|
|
||||||
return TAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
return inflater.inflate(R.layout.fragment_keyagreement_id, container,
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
|
||||||
super.onViewCreated(view, savedInstanceState);
|
|
||||||
|
|
||||||
scrollView = (ScrollView) view;
|
|
||||||
|
|
||||||
adapter = new LocalAuthorSpinnerAdapter(getActivity(), false);
|
|
||||||
spinner = (Spinner) view.findViewById(R.id.spinner);
|
|
||||||
spinner.setAdapter(adapter);
|
|
||||||
spinner.setOnItemSelectedListener(this);
|
|
||||||
|
|
||||||
button = view.findViewById(R.id.continueButton);
|
|
||||||
button.setEnabled(false);
|
|
||||||
button.setOnClickListener(new OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
lsnr.identitySelected(localAuthorId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStart() {
|
|
||||||
super.onStart();
|
|
||||||
loadLocalAuthors();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadLocalAuthors() {
|
|
||||||
listener.runOnDbThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
LocalAuthor author = identityManager.getLocalAuthor();
|
|
||||||
long duration = System.currentTimeMillis() - now;
|
|
||||||
if (LOG.isLoggable(INFO))
|
|
||||||
LOG.info("Loading author took " + duration + " ms");
|
|
||||||
displayLocalAuthor(author);
|
|
||||||
} catch (DbException e) {
|
|
||||||
if (LOG.isLoggable(WARNING))
|
|
||||||
LOG.log(WARNING, e.toString(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void displayLocalAuthor(final LocalAuthor author) {
|
|
||||||
listener.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
setLocalAuthorId(author.getId());
|
|
||||||
// TODO remove comment below when supporting multiple identities
|
|
||||||
/* adapter.clear();
|
|
||||||
for (LocalAuthor a : authors)
|
|
||||||
adapter.add(new LocalAuthorItem(a));
|
|
||||||
adapter.sort(LocalAuthorItemComparator.INSTANCE);
|
|
||||||
// If a local author has been selected, select it again
|
|
||||||
if (localAuthorId == null) return;
|
|
||||||
int count = adapter.getCount();
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
LocalAuthorItem item = adapter.getItem(i);
|
|
||||||
if (item == NEW) continue;
|
|
||||||
if (item.getLocalAuthor().getId().equals(localAuthorId)) {
|
|
||||||
spinner.setSelection(i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/ }
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setLocalAuthorId(final AuthorId authorId) {
|
|
||||||
listener.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
localAuthorId = authorId;
|
|
||||||
scrollView.fullScroll(View.FOCUS_DOWN);
|
|
||||||
button.setEnabled(localAuthorId != null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onItemSelected(AdapterView<?> parent, View view, int position,
|
|
||||||
long id) {
|
|
||||||
LocalAuthorItem item = adapter.getItem(position);
|
|
||||||
if (item == NEW) {
|
|
||||||
setLocalAuthorId(null);
|
|
||||||
Intent i = new Intent(getActivity(), CreateIdentityActivity.class);
|
|
||||||
startActivityForResult(i, REQUEST_CREATE_IDENTITY);
|
|
||||||
} else {
|
|
||||||
setLocalAuthorId(item.getLocalAuthor().getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onNothingSelected(AdapterView<?> parent) {
|
|
||||||
setLocalAuthorId(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityResult(int request, int result, Intent data) {
|
|
||||||
if (request == REQUEST_CREATE_IDENTITY && result == RESULT_OK) {
|
|
||||||
byte[] b = data.getByteArrayExtra("briar.LOCAL_AUTHOR_ID");
|
|
||||||
if (b == null) throw new IllegalStateException();
|
|
||||||
setLocalAuthorId(new AuthorId(b));
|
|
||||||
loadLocalAuthors();
|
|
||||||
} else
|
|
||||||
super.onActivityResult(request, result, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
package org.briarproject.android.keyagreement;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ScrollView;
|
||||||
|
|
||||||
|
import org.briarproject.R;
|
||||||
|
import org.briarproject.android.ActivityComponent;
|
||||||
|
import org.briarproject.android.fragment.BaseFragment;
|
||||||
|
|
||||||
|
import static android.view.View.FOCUS_DOWN;
|
||||||
|
|
||||||
|
public class IntroFragment extends BaseFragment {
|
||||||
|
|
||||||
|
interface IntroScreenSeenListener {
|
||||||
|
void showNextScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String TAG = IntroFragment.class.getName();
|
||||||
|
|
||||||
|
private IntroScreenSeenListener screenSeenListener;
|
||||||
|
private ScrollView scrollView;
|
||||||
|
|
||||||
|
public static IntroFragment newInstance() {
|
||||||
|
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
|
||||||
|
IntroFragment fragment = new IntroFragment();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectFragment(ActivityComponent component) {
|
||||||
|
component.inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Context context) {
|
||||||
|
super.onAttach(context);
|
||||||
|
try {
|
||||||
|
screenSeenListener = (IntroScreenSeenListener) context;
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
throw new ClassCastException(
|
||||||
|
"Using class must implement IntroScreenSeenListener");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUniqueTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
View v = inflater.inflate(R.layout.fragment_keyagreement_id, container,
|
||||||
|
false);
|
||||||
|
scrollView = (ScrollView) v.findViewById(R.id.scrollView);
|
||||||
|
View button = v.findViewById(R.id.continueButton);
|
||||||
|
button.setOnClickListener(new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
screenSeenListener.showNextScreen();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
scrollView.post(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
scrollView.fullScroll(FOCUS_DOWN);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -11,7 +11,7 @@ import org.briarproject.R;
|
|||||||
import org.briarproject.android.ActivityComponent;
|
import org.briarproject.android.ActivityComponent;
|
||||||
import org.briarproject.android.BriarFragmentActivity;
|
import org.briarproject.android.BriarFragmentActivity;
|
||||||
import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
|
import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
|
||||||
import org.briarproject.android.keyagreement.ChooseIdentityFragment.IdentitySelectedListener;
|
import org.briarproject.android.keyagreement.IntroFragment.IntroScreenSeenListener;
|
||||||
import org.briarproject.android.util.CustomAnimations;
|
import org.briarproject.android.util.CustomAnimations;
|
||||||
import org.briarproject.api.contact.ContactExchangeListener;
|
import org.briarproject.api.contact.ContactExchangeListener;
|
||||||
import org.briarproject.api.contact.ContactExchangeTask;
|
import org.briarproject.api.contact.ContactExchangeTask;
|
||||||
@@ -21,7 +21,6 @@ import org.briarproject.api.event.EventBus;
|
|||||||
import org.briarproject.api.event.EventListener;
|
import org.briarproject.api.event.EventListener;
|
||||||
import org.briarproject.api.event.KeyAgreementFinishedEvent;
|
import org.briarproject.api.event.KeyAgreementFinishedEvent;
|
||||||
import org.briarproject.api.identity.Author;
|
import org.briarproject.api.identity.Author;
|
||||||
import org.briarproject.api.identity.AuthorId;
|
|
||||||
import org.briarproject.api.identity.IdentityManager;
|
import org.briarproject.api.identity.IdentityManager;
|
||||||
import org.briarproject.api.identity.LocalAuthor;
|
import org.briarproject.api.identity.LocalAuthor;
|
||||||
import org.briarproject.api.keyagreement.KeyAgreementResult;
|
import org.briarproject.api.keyagreement.KeyAgreementResult;
|
||||||
@@ -34,15 +33,13 @@ import static android.widget.Toast.LENGTH_LONG;
|
|||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
|
|
||||||
public class KeyAgreementActivity extends BriarFragmentActivity implements
|
public class KeyAgreementActivity extends BriarFragmentActivity implements
|
||||||
BaseFragmentListener, IdentitySelectedListener, EventListener,
|
BaseFragmentListener, IntroScreenSeenListener, EventListener,
|
||||||
ContactExchangeListener {
|
ContactExchangeListener {
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
Logger.getLogger(KeyAgreementActivity.class.getName());
|
Logger.getLogger(KeyAgreementActivity.class.getName());
|
||||||
|
|
||||||
private static final String LOCAL_AUTHOR_ID = "briar.LOCAL_AUTHOR_ID";
|
private static final int STEP_INTRO = 1;
|
||||||
|
|
||||||
private static final int STEP_ID = 1;
|
|
||||||
private static final int STEP_QR = 2;
|
private static final int STEP_QR = 2;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -52,8 +49,6 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
|
|||||||
private View progressContainer;
|
private View progressContainer;
|
||||||
private TextView progressTitle;
|
private TextView progressTitle;
|
||||||
|
|
||||||
private AuthorId localAuthorId;
|
|
||||||
|
|
||||||
// Fields that are accessed from background threads must be volatile
|
// Fields that are accessed from background threads must be volatile
|
||||||
@Inject
|
@Inject
|
||||||
protected volatile ContactExchangeTask contactExchangeTask;
|
protected volatile ContactExchangeTask contactExchangeTask;
|
||||||
@@ -78,13 +73,8 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
|
|||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
if (state != null) {
|
|
||||||
byte[] b = state.getByteArray(LOCAL_AUTHOR_ID);
|
|
||||||
if (b != null)
|
|
||||||
localAuthorId = new AuthorId(b);
|
|
||||||
}
|
|
||||||
getSupportActionBar().setTitle(R.string.add_contact_title);
|
getSupportActionBar().setTitle(R.string.add_contact_title);
|
||||||
showStep(localAuthorId == null ? STEP_ID : STEP_QR);
|
if (state == null) showStep(STEP_INTRO);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showStep(int step) {
|
private void showStep(int step) {
|
||||||
@@ -92,9 +82,9 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
|
|||||||
case STEP_QR:
|
case STEP_QR:
|
||||||
startFragment(ShowQrCodeFragment.newInstance(), true);
|
startFragment(ShowQrCodeFragment.newInstance(), true);
|
||||||
break;
|
break;
|
||||||
case STEP_ID:
|
case STEP_INTRO:
|
||||||
default:
|
default:
|
||||||
startFragment(ChooseIdentityFragment.newInstance(), true);
|
startFragment(IntroFragment.newInstance(), true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,15 +101,6 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
|
|||||||
eventBus.removeListener(this);
|
eventBus.removeListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(Bundle state) {
|
|
||||||
super.onSaveInstanceState(state);
|
|
||||||
if (localAuthorId != null) {
|
|
||||||
byte[] b = localAuthorId.getBytes();
|
|
||||||
state.putByteArray(LOCAL_AUTHOR_ID, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(final MenuItem item) {
|
public boolean onOptionsItemSelected(final MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
@@ -156,8 +137,7 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void identitySelected(AuthorId localAuthorId) {
|
public void showNextScreen() {
|
||||||
this.localAuthorId = localAuthorId;
|
|
||||||
showStep(STEP_QR);
|
showStep(STEP_QR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,7 +166,7 @@ public class KeyAgreementActivity extends BriarFragmentActivity implements
|
|||||||
LocalAuthor localAuthor;
|
LocalAuthor localAuthor;
|
||||||
// Load the local pseudonym
|
// Load the local pseudonym
|
||||||
try {
|
try {
|
||||||
localAuthor = identityManager.getLocalAuthor(localAuthorId);
|
localAuthor = identityManager.getLocalAuthor();
|
||||||
} 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);
|
||||||
|
|||||||
Reference in New Issue
Block a user