mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 10:49:06 +01:00
Choose the visibility of blogs and groups when creating them.
This commit is contained in:
@@ -51,10 +51,14 @@
|
||||
<string name="no_posts">(No posts)</string>
|
||||
<string name="create_group_title">New Group</string>
|
||||
<string name="choose_group_name">Choose a name for your group:</string>
|
||||
<string name="group_visible_to_all">Share this group with all contacts</string>
|
||||
<string name="group_visible_to_some">Share this group with chosen contacts</string>
|
||||
<string name="compose_group_title">New Post</string>
|
||||
<string name="blogs_title">Blogs</string>
|
||||
<string name="create_blog_title">New Blog</string>
|
||||
<string name="choose_blog_name">Choose a name for your blog:</string>
|
||||
<string name="blog_visible_to_all">Share this blog with all contacts</string>
|
||||
<string name="blog_visible_to_some">Share this blog with chosen contacts</string>
|
||||
<string name="compose_blog_title">New Post</string>
|
||||
<string name="create_nickname_item">New nickname\u2026</string>
|
||||
<string name="create_identity_title">Create an Identity</string>
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package net.sf.briar.android;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sf.briar.R;
|
||||
import net.sf.briar.api.Contact;
|
||||
import net.sf.briar.api.ContactId;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
|
||||
public class SelectContactsDialog extends DialogFragment
|
||||
implements DialogInterface.OnMultiChoiceClickListener {
|
||||
|
||||
private final Set<ContactId> selected = new HashSet<ContactId>();
|
||||
|
||||
private Listener listener = null;
|
||||
private Contact[] contacts = null;
|
||||
|
||||
public void setListener(Listener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
public void setContacts(Collection<Contact> contacts) {
|
||||
this.contacts = contacts.toArray(this.contacts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle state) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
String[] names = new String[contacts.length];
|
||||
for(int i = 0; i < contacts.length; i++)
|
||||
names[i] = contacts[i].getAuthor().getName();
|
||||
builder.setMultiChoiceItems(names, new boolean[contacts.length], this);
|
||||
builder.setPositiveButton(R.string.done_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.contactsSelected(selected);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.contactSelectionCancelled();
|
||||
}
|
||||
});
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
|
||||
if(isChecked) selected.add(contacts[which].getId());
|
||||
else selected.remove(contacts[which].getId());
|
||||
}
|
||||
|
||||
public interface Listener {
|
||||
|
||||
void contactsSelected(Collection<ContactId> selected);
|
||||
|
||||
void contactSelectionCancelled();
|
||||
}
|
||||
}
|
||||
@@ -65,7 +65,14 @@ implements OnEditorActionListener, OnClickListener {
|
||||
chooseNickname.setText(R.string.choose_nickname);
|
||||
layout.addView(chooseNickname);
|
||||
|
||||
nicknameEntry = new EditText(this);
|
||||
nicknameEntry = new EditText(this) {
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int start,
|
||||
int lengthBefore, int lengthAfter) {
|
||||
if(createButton != null)
|
||||
createButton.setEnabled(lengthAfter > 0);
|
||||
}
|
||||
};
|
||||
nicknameEntry.setTextSize(18);
|
||||
nicknameEntry.setMaxLines(1);
|
||||
nicknameEntry.setPadding(10, 10, 10, 10);
|
||||
@@ -77,6 +84,7 @@ implements OnEditorActionListener, OnClickListener {
|
||||
createButton = new Button(this);
|
||||
createButton.setLayoutParams(WRAP_WRAP);
|
||||
createButton.setText(R.string.create_button);
|
||||
createButton.setEnabled(false);
|
||||
createButton.setOnClickListener(this);
|
||||
layout.addView(createButton);
|
||||
|
||||
|
||||
@@ -289,13 +289,11 @@ implements OnClickListener, DatabaseListener, NoBlogsDialog.Listener {
|
||||
});
|
||||
}
|
||||
|
||||
public void createGroupButtonClicked() {
|
||||
public void blogCreationSelected() {
|
||||
startActivity(new Intent(this, CreateBlogActivity.class));
|
||||
}
|
||||
|
||||
public void cancelButtonClicked() {
|
||||
// That's nice dear
|
||||
}
|
||||
public void blogCreationCancelled() {}
|
||||
|
||||
private static class GroupComparator implements Comparator<BlogListItem> {
|
||||
|
||||
|
||||
@@ -15,13 +15,20 @@ import static net.sf.briar.android.widgets.CommonLayoutParams.WRAP_WRAP;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.KeyPair;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
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.BriarFragmentActivity;
|
||||
import net.sf.briar.android.BriarService;
|
||||
import net.sf.briar.android.BriarService.BriarServiceConnection;
|
||||
import net.sf.briar.android.SelectContactsDialog;
|
||||
import net.sf.briar.android.invitation.AddContactActivity;
|
||||
import net.sf.briar.android.messages.NoContactsDialog;
|
||||
import net.sf.briar.api.Contact;
|
||||
import net.sf.briar.api.ContactId;
|
||||
import net.sf.briar.api.android.DatabaseUiExecutor;
|
||||
import net.sf.briar.api.crypto.CryptoComponent;
|
||||
import net.sf.briar.api.crypto.CryptoExecutor;
|
||||
@@ -39,13 +46,16 @@ import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.TextView;
|
||||
import android.widget.TextView.OnEditorActionListener;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
|
||||
public class CreateBlogActivity extends BriarActivity
|
||||
implements OnEditorActionListener, OnClickListener {
|
||||
public class CreateBlogActivity extends BriarFragmentActivity
|
||||
implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener,
|
||||
SelectContactsDialog.Listener {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(CreateBlogActivity.class.getName());
|
||||
@@ -55,6 +65,8 @@ implements OnEditorActionListener, OnClickListener {
|
||||
|
||||
@Inject @CryptoExecutor private Executor cryptoExecutor;
|
||||
private EditText nameEntry = null;
|
||||
private RadioGroup radioGroup = null;
|
||||
private RadioButton visibleToAll = null, visibleToSome = null;
|
||||
private Button createButton = null;
|
||||
private ProgressBar progress = null;
|
||||
|
||||
@@ -63,6 +75,7 @@ implements OnEditorActionListener, OnClickListener {
|
||||
@Inject private volatile GroupFactory groupFactory;
|
||||
@Inject private volatile DatabaseComponent db;
|
||||
@Inject @DatabaseUiExecutor private volatile Executor dbUiExecutor;
|
||||
private volatile Collection<ContactId> selected = Collections.emptyList();
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle state) {
|
||||
@@ -72,25 +85,45 @@ implements OnEditorActionListener, OnClickListener {
|
||||
layout.setOrientation(VERTICAL);
|
||||
layout.setGravity(CENTER_HORIZONTAL);
|
||||
|
||||
TextView chooseNickname = new TextView(this);
|
||||
chooseNickname.setGravity(CENTER);
|
||||
chooseNickname.setTextSize(18);
|
||||
chooseNickname.setPadding(10, 10, 10, 10);
|
||||
chooseNickname.setText(R.string.choose_blog_name);
|
||||
layout.addView(chooseNickname);
|
||||
TextView chooseName = new TextView(this);
|
||||
chooseName.setGravity(CENTER);
|
||||
chooseName.setTextSize(18);
|
||||
chooseName.setPadding(10, 10, 10, 10);
|
||||
chooseName.setText(R.string.choose_blog_name);
|
||||
layout.addView(chooseName);
|
||||
|
||||
nameEntry = new EditText(this);
|
||||
nameEntry = new EditText(this) {
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int start,
|
||||
int lengthBefore, int lengthAfter) {
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
};
|
||||
nameEntry.setTextSize(18);
|
||||
nameEntry.setMaxLines(1);
|
||||
nameEntry.setPadding(10, 10, 10, 10);
|
||||
int inputType = TYPE_CLASS_TEXT | TYPE_TEXT_FLAG_CAP_SENTENCES;
|
||||
nameEntry.setInputType(inputType);
|
||||
nameEntry.setInputType(TYPE_CLASS_TEXT | TYPE_TEXT_FLAG_CAP_SENTENCES);
|
||||
nameEntry.setOnEditorActionListener(this);
|
||||
layout.addView(nameEntry);
|
||||
|
||||
radioGroup = new RadioGroup(this);
|
||||
radioGroup.setOrientation(VERTICAL);
|
||||
|
||||
visibleToAll = new RadioButton(this);
|
||||
visibleToAll.setText(R.string.blog_visible_to_all);
|
||||
visibleToAll.setOnClickListener(this);
|
||||
radioGroup.addView(visibleToAll);
|
||||
|
||||
visibleToSome = new RadioButton(this);
|
||||
visibleToSome.setText(R.string.blog_visible_to_some);
|
||||
visibleToSome.setOnClickListener(this);
|
||||
radioGroup.addView(visibleToSome);
|
||||
layout.addView(radioGroup);
|
||||
|
||||
createButton = new Button(this);
|
||||
createButton.setLayoutParams(WRAP_WRAP);
|
||||
createButton.setText(R.string.create_button);
|
||||
createButton.setEnabled(false);
|
||||
createButton.setOnClickListener(this);
|
||||
layout.addView(createButton);
|
||||
|
||||
@@ -107,6 +140,14 @@ implements OnEditorActionListener, OnClickListener {
|
||||
serviceConnection, 0);
|
||||
}
|
||||
|
||||
private void enableOrDisableCreateButton() {
|
||||
if(nameEntry == null || radioGroup == null || createButton == null)
|
||||
return; // Activity not created yet
|
||||
boolean nameNotEmpty = nameEntry.getText().length() > 0;
|
||||
boolean visibilitySelected = radioGroup.getCheckedRadioButtonId() != -1;
|
||||
createButton.setEnabled(nameNotEmpty && visibilitySelected);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
@@ -119,30 +160,82 @@ implements OnEditorActionListener, OnClickListener {
|
||||
}
|
||||
|
||||
public void onClick(View view) {
|
||||
if(!validateName()) return;
|
||||
final String name = nameEntry.getText().toString();
|
||||
// Replace the button with a progress bar
|
||||
createButton.setVisibility(GONE);
|
||||
progress.setVisibility(VISIBLE);
|
||||
// Create the blog in a background thread
|
||||
cryptoExecutor.execute(new Runnable() {
|
||||
public void run() {
|
||||
KeyPair keyPair = crypto.generateSignatureKeyPair();
|
||||
final byte[] publicKey = keyPair.getPublic().getEncoded();
|
||||
final byte[] privateKey = keyPair.getPrivate().getEncoded();
|
||||
LocalGroup g;
|
||||
try {
|
||||
g = groupFactory.createLocalGroup(name, publicKey,
|
||||
privateKey);
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
if(view == visibleToAll) {
|
||||
enableOrDisableCreateButton();
|
||||
} else if(view == visibleToSome) {
|
||||
loadContacts();
|
||||
} else if(view == createButton) {
|
||||
if(!validateName()) return;
|
||||
final String name = nameEntry.getText().toString();
|
||||
final boolean all = visibleToAll.isChecked();
|
||||
final Collection<ContactId> visible =
|
||||
Collections.unmodifiableCollection(selected);
|
||||
// Replace the button with a progress bar
|
||||
createButton.setVisibility(GONE);
|
||||
progress.setVisibility(VISIBLE);
|
||||
// Create the blog in a background thread
|
||||
cryptoExecutor.execute(new Runnable() {
|
||||
public void run() {
|
||||
KeyPair keyPair = crypto.generateSignatureKeyPair();
|
||||
final byte[] publicKey = keyPair.getPublic().getEncoded();
|
||||
final byte[] privateKey = keyPair.getPrivate().getEncoded();
|
||||
LocalGroup g;
|
||||
try {
|
||||
g = groupFactory.createLocalGroup(name, publicKey,
|
||||
privateKey);
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
storeLocalGroup(g, all, visible);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void loadContacts() {
|
||||
dbUiExecutor.execute(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
serviceConnection.waitForStartup();
|
||||
long now = System.currentTimeMillis();
|
||||
Collection<Contact> contacts = db.getContacts();
|
||||
long duration = System.currentTimeMillis() - now;
|
||||
if(LOG.isLoggable(INFO))
|
||||
LOG.info("Load took " + duration + " ms");
|
||||
displayContacts(contacts);
|
||||
} catch(DbException e) {
|
||||
if(LOG.isLoggable(WARNING))
|
||||
LOG.log(WARNING, e.toString(), e);
|
||||
} catch(InterruptedException e) {
|
||||
if(LOG.isLoggable(INFO))
|
||||
LOG.info("Interrupted while waiting for service");
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
storeLocalGroup(g);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void storeLocalGroup(final LocalGroup g) {
|
||||
private void displayContacts(final Collection<Contact> contacts) {
|
||||
runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
if(contacts.isEmpty()) {
|
||||
NoContactsDialog dialog = new NoContactsDialog();
|
||||
dialog.setListener(CreateBlogActivity.this);
|
||||
dialog.show(getSupportFragmentManager(),
|
||||
"NoContactsDialog");
|
||||
} else {
|
||||
SelectContactsDialog dialog = new SelectContactsDialog();
|
||||
dialog.setListener(CreateBlogActivity.this);
|
||||
dialog.setContacts(contacts);
|
||||
dialog.show(getSupportFragmentManager(),
|
||||
"SelectContactsDialog");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void storeLocalGroup(final LocalGroup g, final boolean all,
|
||||
final Collection<ContactId> visible) {
|
||||
dbUiExecutor.execute(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
@@ -150,6 +243,8 @@ implements OnEditorActionListener, OnClickListener {
|
||||
long now = System.currentTimeMillis();
|
||||
db.addLocalGroup(g);
|
||||
db.subscribe(g);
|
||||
if(all) db.setVisibleToAll(g.getId(), true);
|
||||
else db.setVisibility(g.getId(), visible);
|
||||
long duration = System.currentTimeMillis() - now;
|
||||
if(LOG.isLoggable(INFO))
|
||||
LOG.info("Storing group took " + duration + " ms");
|
||||
@@ -177,4 +272,21 @@ implements OnEditorActionListener, OnClickListener {
|
||||
((InputMethodManager) o).toggleSoftInput(HIDE_IMPLICIT_ONLY, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void contactCreationSelected() {
|
||||
startActivity(new Intent(this, AddContactActivity.class));
|
||||
}
|
||||
|
||||
public void contactCreationCancelled() {
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
|
||||
public void contactsSelected(Collection<ContactId> selected) {
|
||||
this.selected = selected;
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
|
||||
public void contactSelectionCancelled() {
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,13 +22,13 @@ public class NoBlogsDialog extends DialogFragment {
|
||||
builder.setPositiveButton(R.string.create_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.createGroupButtonClicked();
|
||||
listener.blogCreationSelected();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.cancelButtonClicked();
|
||||
listener.blogCreationCancelled();
|
||||
}
|
||||
});
|
||||
return builder.create();
|
||||
@@ -36,8 +36,8 @@ public class NoBlogsDialog extends DialogFragment {
|
||||
|
||||
interface Listener {
|
||||
|
||||
void createGroupButtonClicked();
|
||||
void blogCreationSelected();
|
||||
|
||||
void cancelButtonClicked();
|
||||
void blogCreationCancelled();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,13 +14,20 @@ import static net.sf.briar.android.widgets.CommonLayoutParams.MATCH_MATCH;
|
||||
import static net.sf.briar.android.widgets.CommonLayoutParams.WRAP_WRAP;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
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.BriarFragmentActivity;
|
||||
import net.sf.briar.android.BriarService;
|
||||
import net.sf.briar.android.BriarService.BriarServiceConnection;
|
||||
import net.sf.briar.android.SelectContactsDialog;
|
||||
import net.sf.briar.android.invitation.AddContactActivity;
|
||||
import net.sf.briar.android.messages.NoContactsDialog;
|
||||
import net.sf.briar.api.Contact;
|
||||
import net.sf.briar.api.ContactId;
|
||||
import net.sf.briar.api.android.DatabaseUiExecutor;
|
||||
import net.sf.briar.api.db.DatabaseComponent;
|
||||
import net.sf.briar.api.db.DbException;
|
||||
@@ -36,13 +43,16 @@ import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.TextView;
|
||||
import android.widget.TextView.OnEditorActionListener;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
|
||||
public class CreateGroupActivity extends BriarActivity
|
||||
implements OnEditorActionListener, OnClickListener {
|
||||
public class CreateGroupActivity extends BriarFragmentActivity
|
||||
implements OnEditorActionListener, OnClickListener, NoContactsDialog.Listener,
|
||||
SelectContactsDialog.Listener {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(CreateGroupActivity.class.getName());
|
||||
@@ -51,6 +61,8 @@ implements OnEditorActionListener, OnClickListener {
|
||||
new BriarServiceConnection();
|
||||
|
||||
private EditText nameEntry = null;
|
||||
private RadioGroup radioGroup = null;
|
||||
private RadioButton visibleToAll = null, visibleToSome = null;
|
||||
private Button createButton = null;
|
||||
private ProgressBar progress = null;
|
||||
|
||||
@@ -58,6 +70,7 @@ implements OnEditorActionListener, OnClickListener {
|
||||
@Inject private volatile GroupFactory groupFactory;
|
||||
@Inject private volatile DatabaseComponent db;
|
||||
@Inject @DatabaseUiExecutor private volatile Executor dbUiExecutor;
|
||||
private volatile Collection<ContactId> selected = Collections.emptyList();
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle state) {
|
||||
@@ -67,22 +80,41 @@ implements OnEditorActionListener, OnClickListener {
|
||||
layout.setOrientation(VERTICAL);
|
||||
layout.setGravity(CENTER_HORIZONTAL);
|
||||
|
||||
TextView chooseNickname = new TextView(this);
|
||||
chooseNickname.setGravity(CENTER);
|
||||
chooseNickname.setTextSize(18);
|
||||
chooseNickname.setPadding(10, 10, 10, 10);
|
||||
chooseNickname.setText(R.string.choose_group_name);
|
||||
layout.addView(chooseNickname);
|
||||
TextView chooseName = new TextView(this);
|
||||
chooseName.setGravity(CENTER);
|
||||
chooseName.setTextSize(18);
|
||||
chooseName.setPadding(10, 10, 10, 10);
|
||||
chooseName.setText(R.string.choose_group_name);
|
||||
layout.addView(chooseName);
|
||||
|
||||
nameEntry = new EditText(this);
|
||||
nameEntry = new EditText(this) {
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int start,
|
||||
int lengthBefore, int lengthAfter) {
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
};
|
||||
nameEntry.setTextSize(18);
|
||||
nameEntry.setMaxLines(1);
|
||||
nameEntry.setPadding(10, 10, 10, 10);
|
||||
int inputType = TYPE_CLASS_TEXT | TYPE_TEXT_FLAG_CAP_SENTENCES;
|
||||
nameEntry.setInputType(inputType);
|
||||
nameEntry.setInputType(TYPE_CLASS_TEXT | TYPE_TEXT_FLAG_CAP_SENTENCES);
|
||||
nameEntry.setOnEditorActionListener(this);
|
||||
layout.addView(nameEntry);
|
||||
|
||||
radioGroup = new RadioGroup(this);
|
||||
radioGroup.setOrientation(VERTICAL);
|
||||
|
||||
visibleToAll = new RadioButton(this);
|
||||
visibleToAll.setText(R.string.blog_visible_to_all);
|
||||
visibleToAll.setOnClickListener(this);
|
||||
radioGroup.addView(visibleToAll);
|
||||
|
||||
visibleToSome = new RadioButton(this);
|
||||
visibleToSome.setText(R.string.blog_visible_to_some);
|
||||
visibleToSome.setOnClickListener(this);
|
||||
radioGroup.addView(visibleToSome);
|
||||
layout.addView(radioGroup);
|
||||
|
||||
createButton = new Button(this);
|
||||
createButton.setLayoutParams(WRAP_WRAP);
|
||||
createButton.setText(R.string.create_button);
|
||||
@@ -102,6 +134,14 @@ implements OnEditorActionListener, OnClickListener {
|
||||
serviceConnection, 0);
|
||||
}
|
||||
|
||||
private void enableOrDisableCreateButton() {
|
||||
if(nameEntry == null || radioGroup == null || createButton == null)
|
||||
return; // Activity not created yet
|
||||
boolean nameNotEmpty = nameEntry.getText().length() > 0;
|
||||
boolean visibilitySelected = radioGroup.getCheckedRadioButtonId() != -1;
|
||||
createButton.setEnabled(nameNotEmpty && visibilitySelected);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
@@ -114,22 +154,64 @@ implements OnEditorActionListener, OnClickListener {
|
||||
}
|
||||
|
||||
public void onClick(View view) {
|
||||
if(!validateName()) return;
|
||||
final String name = nameEntry.getText().toString();
|
||||
// Replace the button with a progress bar
|
||||
createButton.setVisibility(GONE);
|
||||
progress.setVisibility(VISIBLE);
|
||||
// Create and store the group in a background thread
|
||||
if(view == visibleToAll) {
|
||||
enableOrDisableCreateButton();
|
||||
} else if(view == visibleToSome) {
|
||||
loadContacts();
|
||||
} else if(view == createButton) {
|
||||
if(!validateName()) return;
|
||||
final String name = nameEntry.getText().toString();
|
||||
final boolean all = visibleToAll.isChecked();
|
||||
final Collection<ContactId> visible =
|
||||
Collections.unmodifiableCollection(selected);
|
||||
// Replace the button with a progress bar
|
||||
createButton.setVisibility(GONE);
|
||||
progress.setVisibility(VISIBLE);
|
||||
// Create and store the group in a background thread
|
||||
dbUiExecutor.execute(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
serviceConnection.waitForStartup();
|
||||
Group g = groupFactory.createGroup(name);
|
||||
long now = System.currentTimeMillis();
|
||||
db.subscribe(g);
|
||||
if(all) db.setVisibleToAll(g.getId(), true);
|
||||
else db.setVisibility(g.getId(), visible);
|
||||
long duration = System.currentTimeMillis() - now;
|
||||
if(LOG.isLoggable(INFO))
|
||||
LOG.info("Storing group took " + duration + " ms");
|
||||
} catch(DbException e) {
|
||||
if(LOG.isLoggable(WARNING))
|
||||
LOG.log(WARNING, e.toString(), e);
|
||||
} catch(InterruptedException e) {
|
||||
if(LOG.isLoggable(INFO))
|
||||
LOG.info("Interrupted while waiting for service");
|
||||
Thread.currentThread().interrupt();
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void loadContacts() {
|
||||
dbUiExecutor.execute(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
serviceConnection.waitForStartup();
|
||||
Group g = groupFactory.createGroup(name);
|
||||
long now = System.currentTimeMillis();
|
||||
db.subscribe(g);
|
||||
Collection<Contact> contacts = db.getContacts();
|
||||
long duration = System.currentTimeMillis() - now;
|
||||
if(LOG.isLoggable(INFO))
|
||||
LOG.info("Storing group took " + duration + " ms");
|
||||
LOG.info("Load took " + duration + " ms");
|
||||
displayContacts(contacts);
|
||||
} catch(DbException e) {
|
||||
if(LOG.isLoggable(WARNING))
|
||||
LOG.log(WARNING, e.toString(), e);
|
||||
@@ -137,14 +219,26 @@ implements OnEditorActionListener, OnClickListener {
|
||||
if(LOG.isLoggable(INFO))
|
||||
LOG.info("Interrupted while waiting for service");
|
||||
Thread.currentThread().interrupt();
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void displayContacts(final Collection<Contact> contacts) {
|
||||
runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
if(contacts.isEmpty()) {
|
||||
NoContactsDialog dialog = new NoContactsDialog();
|
||||
dialog.setListener(CreateGroupActivity.this);
|
||||
dialog.show(getSupportFragmentManager(),
|
||||
"NoContactsDialog");
|
||||
} else {
|
||||
SelectContactsDialog dialog = new SelectContactsDialog();
|
||||
dialog.setListener(CreateGroupActivity.this);
|
||||
dialog.setContacts(contacts);
|
||||
dialog.show(getSupportFragmentManager(),
|
||||
"SelectContactsDialog");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -156,4 +250,21 @@ implements OnEditorActionListener, OnClickListener {
|
||||
((InputMethodManager) o).toggleSoftInput(HIDE_IMPLICIT_ONLY, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void contactCreationSelected() {
|
||||
startActivity(new Intent(this, AddContactActivity.class));
|
||||
}
|
||||
|
||||
public void contactCreationCancelled() {
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
|
||||
public void contactsSelected(Collection<ContactId> selected) {
|
||||
this.selected = selected;
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
|
||||
public void contactSelectionCancelled() {
|
||||
enableOrDisableCreateButton();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,13 +276,11 @@ implements OnClickListener, DatabaseListener, NoGroupsDialog.Listener {
|
||||
});
|
||||
}
|
||||
|
||||
public void createButtonClicked() {
|
||||
public void groupCreationSelected() {
|
||||
startActivity(new Intent(this, CreateGroupActivity.class));
|
||||
}
|
||||
|
||||
public void cancelButtonClicked() {
|
||||
// That's nice dear
|
||||
}
|
||||
public void groupCreationCancelled() {}
|
||||
|
||||
private static class GroupComparator implements Comparator<GroupListItem> {
|
||||
|
||||
|
||||
@@ -22,13 +22,13 @@ public class NoGroupsDialog extends DialogFragment {
|
||||
builder.setPositiveButton(R.string.create_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.createButtonClicked();
|
||||
listener.groupCreationSelected();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.cancelButtonClicked();
|
||||
listener.groupCreationCancelled();
|
||||
}
|
||||
});
|
||||
return builder.create();
|
||||
@@ -36,8 +36,8 @@ public class NoGroupsDialog extends DialogFragment {
|
||||
|
||||
interface Listener {
|
||||
|
||||
void createButtonClicked();
|
||||
void groupCreationSelected();
|
||||
|
||||
void cancelButtonClicked();
|
||||
void groupCreationCancelled();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +79,14 @@ implements OnEditorActionListener, OnClickListener {
|
||||
chooseNickname.setText(R.string.choose_nickname);
|
||||
layout.addView(chooseNickname);
|
||||
|
||||
nicknameEntry = new EditText(this);
|
||||
nicknameEntry = new EditText(this) {
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int start,
|
||||
int lengthBefore, int lengthAfter) {
|
||||
if(createButton != null)
|
||||
createButton.setEnabled(lengthAfter > 0);
|
||||
}
|
||||
};
|
||||
nicknameEntry.setTextSize(18);
|
||||
nicknameEntry.setMaxLines(1);
|
||||
nicknameEntry.setPadding(10, 10, 10, 10);
|
||||
@@ -91,6 +98,7 @@ implements OnEditorActionListener, OnClickListener {
|
||||
createButton = new Button(this);
|
||||
createButton.setLayoutParams(WRAP_WRAP);
|
||||
createButton.setText(R.string.create_button);
|
||||
createButton.setEnabled(false);
|
||||
createButton.setOnClickListener(this);
|
||||
layout.addView(createButton);
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ implements OnEditorActionListener, OnClickListener {
|
||||
|
||||
private CodeEntryListener listener = null;
|
||||
private EditText codeEntry = null;
|
||||
private Button continueButton = null;
|
||||
|
||||
public CodeEntryWidget(Context ctx) {
|
||||
super(ctx);
|
||||
@@ -45,17 +46,12 @@ implements OnEditorActionListener, OnClickListener {
|
||||
innerLayout.setOrientation(HORIZONTAL);
|
||||
innerLayout.setGravity(CENTER);
|
||||
|
||||
final Button continueButton = new Button(ctx);
|
||||
continueButton.setLayoutParams(WRAP_WRAP);
|
||||
continueButton.setText(R.string.continue_button);
|
||||
continueButton.setEnabled(false);
|
||||
continueButton.setOnClickListener(this);
|
||||
|
||||
codeEntry = new EditText(ctx) {
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int start,
|
||||
int lengthBefore, int lengthAfter) {
|
||||
continueButton.setEnabled(text.length() == 6);
|
||||
if(continueButton != null)
|
||||
continueButton.setEnabled(lengthAfter == 6);
|
||||
}
|
||||
};
|
||||
codeEntry.setTextSize(26);
|
||||
@@ -66,6 +62,12 @@ implements OnEditorActionListener, OnClickListener {
|
||||
codeEntry.setMaxLines(1);
|
||||
codeEntry.setInputType(TYPE_CLASS_NUMBER);
|
||||
innerLayout.addView(codeEntry);
|
||||
|
||||
continueButton = new Button(ctx);
|
||||
continueButton.setLayoutParams(WRAP_WRAP);
|
||||
continueButton.setText(R.string.continue_button);
|
||||
continueButton.setEnabled(false);
|
||||
continueButton.setOnClickListener(this);
|
||||
innerLayout.addView(continueButton);
|
||||
addView(innerLayout);
|
||||
}
|
||||
@@ -89,8 +91,8 @@ implements OnEditorActionListener, OnClickListener {
|
||||
}
|
||||
// Hide the soft keyboard
|
||||
Object o = getContext().getSystemService(INPUT_METHOD_SERVICE);
|
||||
((InputMethodManager) o).toggleSoftInput(HIDE_IMPLICIT_ONLY, 0);
|
||||
listener.codeEntered(remoteCode);
|
||||
((InputMethodManager) o).toggleSoftInput(HIDE_IMPLICIT_ONLY, 0);
|
||||
listener.codeEntered(remoteCode);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -238,13 +238,11 @@ implements OnClickListener, DatabaseListener, NoContactsDialog.Listener {
|
||||
});
|
||||
}
|
||||
|
||||
public void addContactButtonClicked() {
|
||||
public void contactCreationSelected() {
|
||||
startActivity(new Intent(this, AddContactActivity.class));
|
||||
}
|
||||
|
||||
public void cancelButtonClicked() {
|
||||
// That's nice dear
|
||||
}
|
||||
public void contactCreationCancelled() {}
|
||||
|
||||
private static class ConversationComparator
|
||||
implements Comparator<ConversationListItem> {
|
||||
|
||||
@@ -11,7 +11,7 @@ public class NoContactsDialog extends DialogFragment {
|
||||
|
||||
private Listener listener = null;
|
||||
|
||||
void setListener(Listener listener) {
|
||||
public void setListener(Listener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@@ -22,22 +22,22 @@ public class NoContactsDialog extends DialogFragment {
|
||||
builder.setPositiveButton(R.string.add_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.addContactButtonClicked();
|
||||
listener.contactCreationSelected();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel_button,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
listener.cancelButtonClicked();
|
||||
listener.contactCreationCancelled();
|
||||
}
|
||||
});
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
interface Listener {
|
||||
public interface Listener {
|
||||
|
||||
void addContactButtonClicked();
|
||||
void contactCreationSelected();
|
||||
|
||||
void cancelButtonClicked();
|
||||
void contactCreationCancelled();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user