diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 21f18eb159812b0ce656574ecd9170d0b8a82542..86c5239e549e81befe949a9b2b32ce3a7e4c0db8 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -184,16 +184,6 @@ /> </activity> - <activity - android:name=".android.blogs.CreateBlogActivity" - android:label="@string/blogs_my_blogs_label" - android:parentActivityName=".android.NavDrawerActivity"> - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value=".android.NavDrawerActivity" - /> - </activity> - <activity android:name=".android.blogs.BlogActivity" android:parentActivityName=".android.NavDrawerActivity"> @@ -246,12 +236,6 @@ /> </activity> - <activity - android:name=".android.identity.CreateIdentityActivity" - android:label="@string/new_identity_title" - android:windowSoftInputMode="stateVisible"> - </activity> - <activity android:name=".android.invitation.AddContactActivity" android:label="@string/add_contact_title" diff --git a/briar-android/res/layout/activity_create_blog.xml b/briar-android/res/layout/activity_create_blog.xml deleted file mode 100644 index 31a1c3df85e8983dc973c65a3529486432c3e86b..0000000000000000000000000000000000000000 --- a/briar-android/res/layout/activity_create_blog.xml +++ /dev/null @@ -1,69 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ScrollView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_horizontal" - android:orientation="vertical" - android:padding="@dimen/margin_activity_horizontal" - tools:context=".android.blogs.CreateBlogActivity"> - - <android.support.design.widget.TextInputLayout - android:id="@+id/titleLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:counterEnabled="true" - app:counterOverflowTextAppearance="@style/BriarTextCounter.Overflow"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/titleInput" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/blogs_my_blogs_create_hint_title"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:id="@+id/descLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:counterEnabled="true" - app:counterOverflowTextAppearance="@style/BriarTextCounter.Overflow"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/descInput" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/blogs_my_blogs_create_hint_desc"/> - - </android.support.design.widget.TextInputLayout> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/blogs_my_blogs_create_hint_desc_explanation"/> - - <Button - android:id="@+id/createBlogButton" - style="@style/BriarButton" - android:layout_marginTop="@dimen/margin_activity_vertical" - android:enabled="false" - android:text="@string/blogs_my_blogs_create"/> - - <ProgressBar - android:id="@+id/createBlogProgressBar" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/margin_activity_vertical" - android:indeterminate="true" - android:visibility="gone"/> - - </LinearLayout> - -</ScrollView> \ No newline at end of file diff --git a/briar-android/res/layout/activity_create_identity.xml b/briar-android/res/layout/activity_create_identity.xml deleted file mode 100644 index 5919662cfba59435b0dfb13028e77fa63c8a26cb..0000000000000000000000000000000000000000 --- a/briar-android/res/layout/activity_create_identity.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:padding="@dimen/margin_activity_horizontal"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:text="@string/choose_nickname" - android:textSize="@dimen/text_size_large"/> - - <android.support.design.widget.TextInputLayout - android:id="@+id/nicknameInputLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:errorEnabled="true"> - - <EditText - android:id="@+id/nicknameEntry" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:ems="10" - android:inputType="textPersonName" - android:maxLines="1"/> - - </android.support.design.widget.TextInputLayout> - - <Button - android:id="@+id/createIdentityButton" - style="@style/BriarButton" - android:layout_gravity="center_horizontal" - android:enabled="false" - android:text="@string/create_identity_button"/> - - <ProgressBar - android:id="@+id/progressBar" - style="?android:attr/progressBarStyleLarge" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:indeterminate="true" - android:visibility="gone"/> - -</LinearLayout> diff --git a/briar-android/res/layout/fragment_blogs_list.xml b/briar-android/res/layout/fragment_blogs_list.xml deleted file mode 100644 index a552dc0fce49e2a0f2c2ca14340ab4c38ae51fff..0000000000000000000000000000000000000000 --- a/briar-android/res/layout/fragment_blogs_list.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- This is just a placeholder to be replaced by the real My Blogs list --> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <TextView - android:id="@+id/num" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_horizontal" - android:padding="@dimen/margin_activity_horizontal" - android:textSize="128sp" - tools:text="1"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="@dimen/margin_activity_horizontal" - android:text="There is nothing for you to see here.\n\nMove along and come back later." - android:textSize="@dimen/text_size_large"/> - -</LinearLayout> \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/ActivityComponent.java b/briar-android/src/org/briarproject/android/ActivityComponent.java index 3fbe8d3f27d289d0ada890690b6ca6c565a08c64..990aea7a2e13af338a3bf12fa09acbcca70ce50c 100644 --- a/briar-android/src/org/briarproject/android/ActivityComponent.java +++ b/briar-android/src/org/briarproject/android/ActivityComponent.java @@ -4,12 +4,10 @@ import android.app.Activity; import org.briarproject.android.blogs.BlogActivity; import org.briarproject.android.blogs.BlogFragment; -import org.briarproject.android.blogs.BlogListFragment; import org.briarproject.android.blogs.BlogPostFragment; import org.briarproject.android.blogs.BlogPostPagerFragment; -import org.briarproject.android.blogs.CreateBlogActivity; -import org.briarproject.android.blogs.FeedPostFragment; import org.briarproject.android.blogs.FeedFragment; +import org.briarproject.android.blogs.FeedPostFragment; import org.briarproject.android.blogs.FeedPostPagerFragment; import org.briarproject.android.blogs.ReblogActivity; import org.briarproject.android.blogs.ReblogFragment; @@ -21,7 +19,6 @@ import org.briarproject.android.contact.ConversationActivity; import org.briarproject.android.forum.CreateForumActivity; import org.briarproject.android.forum.ForumActivity; import org.briarproject.android.forum.ForumListFragment; -import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.introduction.ContactChooserFragment; import org.briarproject.android.introduction.IntroductionActivity; import org.briarproject.android.introduction.IntroductionMessageFragment; @@ -70,8 +67,6 @@ public interface ActivityComponent { void inject(ConversationActivity activity); - void inject(CreateIdentityActivity activity); - void inject(InvitationsForumActivity activity); void inject(InvitationsBlogActivity activity); @@ -88,8 +83,6 @@ public interface ActivityComponent { void inject(ForumActivity activity); - void inject(CreateBlogActivity activity); - void inject(BlogActivity activity); void inject(WriteBlogPostActivity activity); @@ -122,7 +115,6 @@ public interface ActivityComponent { // Fragments void inject(ContactListFragment fragment); void inject(ForumListFragment fragment); - void inject(BlogListFragment fragment); void inject(FeedFragment fragment); void inject(IntroFragment fragment); void inject(ShowQrCodeFragment fragment); diff --git a/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java b/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java deleted file mode 100644 index 590a24fba8db3e64bc001cb5288623cbf34161d6..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java +++ /dev/null @@ -1,205 +0,0 @@ -package org.briarproject.android.blogs; - -import android.app.Activity; -import android.content.Intent; -import android.support.annotation.Nullable; -import android.support.v4.app.ActivityCompat; -import android.support.v4.app.ActivityOptionsCompat; -import android.support.v4.content.ContextCompat; -import android.support.v7.util.SortedList; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import org.briarproject.R; -import org.briarproject.android.util.AndroidUtils; -import org.briarproject.android.view.TextAvatarView; -import org.briarproject.api.blogs.Blog; -import org.briarproject.api.sync.GroupId; - -import java.util.Collection; - -import static android.view.View.GONE; -import static android.view.View.VISIBLE; -import static org.briarproject.android.BriarActivity.GROUP_ID; -import static org.briarproject.android.blogs.BlogActivity.BLOG_NAME; - -class BlogListAdapter extends - RecyclerView.Adapter<BlogListAdapter.BlogViewHolder> { - - private SortedList<BlogItem> blogs = new SortedList<>( - BlogItem.class, new SortedList.Callback<BlogItem>() { - - @Override - public int compare(BlogItem a, BlogItem b) { - if (a == b) return 0; - // The blog with the newest message comes first - long aTime = a.getTimestamp(), bTime = b.getTimestamp(); - if (aTime > bTime) return -1; - if (aTime < bTime) return 1; - // Break ties by blog name - String aName = a.getName(); - String bName = b.getName(); - return String.CASE_INSENSITIVE_ORDER.compare(aName, bName); - } - - @Override - public void onInserted(int position, int count) { - notifyItemRangeInserted(position, count); - } - - @Override - public void onRemoved(int position, int count) { - notifyItemRangeRemoved(position, count); - } - - @Override - public void onMoved(int fromPosition, int toPosition) { - notifyItemMoved(fromPosition, toPosition); - } - - @Override - public void onChanged(int position, int count) { - notifyItemRangeChanged(position, count); - } - - @Override - public boolean areContentsTheSame(BlogItem a, BlogItem b) { - return a.getBlog().equals(b.getBlog()) && - a.getTimestamp() == b.getTimestamp() && - a.getUnreadCount() == b.getUnreadCount(); - } - - @Override - public boolean areItemsTheSame(BlogItem a, BlogItem b) { - return a.getBlog().equals(b.getBlog()); - } - }); - - private final Activity ctx; - - BlogListAdapter(Activity ctx) { - this.ctx = ctx; - } - - @Override - public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View v = LayoutInflater.from(ctx).inflate( - R.layout.list_item_blog, parent, false); - return new BlogViewHolder(v); - } - - @Override - public void onBindViewHolder(BlogViewHolder ui, int position) { - final BlogItem item = getItem(position); - - // Avatar - ui.avatar.setText(item.getName().substring(0, 1)); - ui.avatar.setBackgroundBytes(item.getBlog().getId().getBytes()); - ui.avatar.setUnreadCount(item.getUnreadCount()); - - // Blog Name - ui.name.setText(item.getName()); - - // Post Count - int postCount = item.getPostCount(); - ui.postCount.setText(ctx.getResources() - .getQuantityString(R.plurals.posts, postCount, postCount)); - ui.postCount.setTextColor( - ContextCompat.getColor(ctx, R.color.briar_text_secondary)); - - // Date and Status - if (item.isEmpty()) { - ui.date.setVisibility(GONE); - ui.avatar.setProblem(true); - ui.status.setText(ctx.getString(R.string.blogs_blog_is_empty)); - ui.status.setVisibility(VISIBLE); - } else { - long timestamp = item.getTimestamp(); - ui.date.setText(AndroidUtils.formatDate(ctx, timestamp)); - ui.date.setVisibility(VISIBLE); - ui.avatar.setProblem(false); - ui.status.setVisibility(GONE); - } - - // Open Blog on Click - ui.layout.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent i = new Intent(ctx, BlogActivity.class); - Blog b = item.getBlog(); - i.putExtra(GROUP_ID, b.getId().getBytes()); - i.putExtra(BLOG_NAME, b.getName()); - ActivityOptionsCompat options = ActivityOptionsCompat - .makeCustomAnimation(ctx, android.R.anim.fade_in, - android.R.anim.fade_out); - ActivityCompat.startActivity(ctx, i, options.toBundle()); - } - }); - } - - @Override - public int getItemCount() { - return blogs.size(); - } - - public BlogItem getItem(int position) { - return blogs.get(position); - } - - @Nullable - public BlogItem getItem(GroupId g) { - for (int i = 0; i < blogs.size(); i++) { - BlogItem item = blogs.get(i); - if (item.getBlog().getGroup().getId().equals(g)) { - return item; - } - } - return null; - } - - public void addAll(Collection<BlogItem> items) { - blogs.addAll(items); - } - - void updateItem(BlogItem item) { - BlogItem oldItem = getItem(item.getBlog().getGroup().getId()); - int position = blogs.indexOf(oldItem); - blogs.updateItemAt(position, item); - } - - public void remove(BlogItem item) { - blogs.remove(item); - } - - public void clear() { - blogs.clear(); - } - - public boolean isEmpty() { - return blogs.size() == 0; - } - - static class BlogViewHolder extends RecyclerView.ViewHolder { - - private final ViewGroup layout; - private final TextAvatarView avatar; - private final TextView name; - private final TextView postCount; - private final TextView date; - private final TextView status; - - BlogViewHolder(View v) { - super(v); - - layout = (ViewGroup) v; - avatar = (TextAvatarView) v.findViewById(R.id.avatarView); - name = (TextView) v.findViewById(R.id.nameView); - postCount = (TextView) v.findViewById(R.id.postCountView); - date = (TextView) v.findViewById(R.id.dateView); - status = (TextView) v.findViewById(R.id.statusView); - } - } -} diff --git a/briar-android/src/org/briarproject/android/blogs/BlogListFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogListFragment.java deleted file mode 100644 index 61f3dff54a547415013d1dc473f3406b763f2021..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/blogs/BlogListFragment.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.briarproject.android.blogs; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import org.briarproject.R; -import org.briarproject.android.ActivityComponent; -import org.briarproject.android.fragment.BaseFragment; - -public class BlogListFragment extends BaseFragment { - - public final static String TAG = BlogListFragment.class.getName(); - - static BlogListFragment newInstance(int num) { - BlogListFragment f = new BlogListFragment(); - - Bundle args = new Bundle(); - args.putInt("num", num); - f.setArguments(args); - - return f; - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View v = inflater.inflate(R.layout.fragment_blogs_list, container, - false); - - TextView numView = (TextView) v.findViewById(R.id.num); - String num = String.valueOf(getArguments().getInt("num")); - numView.setText(num); - - return v; - } - - @Override - public void injectFragment(ActivityComponent component) { - component.inject(this); - } - - @Override - public String getUniqueTag() { - return TAG; - } - -} diff --git a/briar-android/src/org/briarproject/android/blogs/CreateBlogActivity.java b/briar-android/src/org/briarproject/android/blogs/CreateBlogActivity.java deleted file mode 100644 index 5bac574b5cf4dbd64ba64ffbb90f8baa91bb57e7..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/blogs/CreateBlogActivity.java +++ /dev/null @@ -1,191 +0,0 @@ -package org.briarproject.android.blogs; - -import android.content.Intent; -import android.os.Bundle; -import android.support.design.widget.TextInputEditText; -import android.support.design.widget.TextInputLayout; -import android.support.v4.app.ActivityCompat; -import android.support.v4.app.ActivityOptionsCompat; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.KeyEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; - -import org.briarproject.R; -import org.briarproject.android.ActivityComponent; -import org.briarproject.android.BriarActivity; -import org.briarproject.api.blogs.Blog; -import org.briarproject.api.blogs.BlogManager; -import org.briarproject.api.db.DbException; -import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.identity.LocalAuthor; -import org.briarproject.util.StringUtils; - -import java.util.Collection; -import java.util.logging.Logger; - -import javax.inject.Inject; - -import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation; -import static android.view.View.GONE; -import static android.view.View.VISIBLE; -import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; -import static org.briarproject.android.blogs.BlogActivity.BLOG_NAME; -import static org.briarproject.android.blogs.BlogActivity.IS_NEW_BLOG; -import static org.briarproject.api.blogs.BlogConstants.MAX_BLOG_DESC_LENGTH; -import static org.briarproject.api.blogs.BlogConstants.MAX_BLOG_TITLE_LENGTH; - -public class CreateBlogActivity extends BriarActivity - implements OnEditorActionListener, OnClickListener { - - private static final Logger LOG = - Logger.getLogger(CreateBlogActivity.class.getName()); - - private TextInputEditText titleInput, descInput; - private Button button; - private ProgressBar progress; - - // Fields that are accessed from background threads must be volatile - @Inject - protected volatile IdentityManager identityManager; - @Inject - volatile BlogManager blogManager; - - @Override - public void onCreate(Bundle state) { - super.onCreate(state); - - setContentView(R.layout.activity_create_blog); - - TextInputLayout titleLayout = - (TextInputLayout) findViewById(R.id.titleLayout); - if (titleLayout != null) { - titleLayout.setCounterMaxLength(MAX_BLOG_TITLE_LENGTH); - } - titleInput = (TextInputEditText) findViewById(R.id.titleInput); - TextWatcher nameEntryWatcher = new TextWatcher() { - @Override - public void afterTextChanged(Editable s) { - } - @Override - public void beforeTextChanged(CharSequence s, int start, int count, - int after) { - } - @Override - public void onTextChanged(CharSequence text, int start, - int lengthBefore, int lengthAfter) { - enableOrDisableCreateButton(); - } - }; - titleInput.setOnEditorActionListener(this); - titleInput.addTextChangedListener(nameEntryWatcher); - - TextInputLayout descLayout = - (TextInputLayout) findViewById(R.id.descLayout); - if (descLayout != null) { - descLayout.setCounterMaxLength(MAX_BLOG_DESC_LENGTH); - } - descInput = (TextInputEditText) findViewById(R.id.descInput); - if (descInput != null) { - descInput.addTextChangedListener(nameEntryWatcher); - } - - button = (Button) findViewById(R.id.createBlogButton); - if (button != null) { - button.setOnClickListener(this); - } - - progress = (ProgressBar) findViewById(R.id.createBlogProgressBar); - } - - @Override - public void injectActivity(ActivityComponent component) { - component.inject(this); - } - - private void enableOrDisableCreateButton() { - if (progress == null) return; // Not created yet - button.setEnabled(validateTitle() && validateDescription()); - } - - @Override - public boolean onEditorAction(TextView textView, int actionId, KeyEvent e) { - descInput.requestFocus(); - return true; - } - - private boolean validateTitle() { - String name = titleInput.getText().toString(); - int length = StringUtils.toUtf8(name).length; - return length <= MAX_BLOG_TITLE_LENGTH && length > 0; - } - - private boolean validateDescription() { - String name = descInput.getText().toString(); - int length = StringUtils.toUtf8(name).length; - return length <= MAX_BLOG_DESC_LENGTH && length > 0; - } - - @Override - public void onClick(View view) { - if (view == button) { - hideSoftKeyboard(view); - if (!validateTitle()) return; - button.setVisibility(GONE); - progress.setVisibility(VISIBLE); - addBlog(titleInput.getText().toString(), - descInput.getText().toString()); - } - } - - private void addBlog(final String title, final String description) { - runOnDbThread(new Runnable() { - @Override - public void run() { - try { - long now = System.currentTimeMillis(); - Collection<LocalAuthor> authors = - identityManager.getLocalAuthors(); - // take first identity, don't support more for now - LocalAuthor author = authors.iterator().next(); - Blog f = blogManager.addBlog(author, title, description); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Storing blog took " + duration + " ms"); - displayBlog(f); - } catch (DbException e) { - // TODO show error, e.g. blog with same title exists - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - finishOnUiThread(); - } - } - }); - } - - private void displayBlog(final Blog b) { - runOnUiThread(new Runnable() { - @Override - public void run() { - Intent i = - new Intent(CreateBlogActivity.this, BlogActivity.class); - i.putExtra(GROUP_ID, b.getId().getBytes()); - i.putExtra(BLOG_NAME, b.getName()); - i.putExtra(IS_NEW_BLOG, true); - ActivityOptionsCompat options = - makeCustomAnimation(CreateBlogActivity.this, - android.R.anim.fade_in, - android.R.anim.fade_out); - ActivityCompat.startActivity(CreateBlogActivity.this, i, - options.toBundle()); - supportFinishAfterTransition(); - } - }); - } -} diff --git a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java b/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java deleted file mode 100644 index c960bda8f7b680c41e0f5c37db88bb586c6b62af..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/identity/CreateIdentityActivity.java +++ /dev/null @@ -1,179 +0,0 @@ -package org.briarproject.android.identity; - -import android.content.Intent; -import android.os.Bundle; -import android.support.design.widget.TextInputLayout; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.KeyEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; -import android.widget.Toast; - -import org.briarproject.R; -import org.briarproject.android.ActivityComponent; -import org.briarproject.android.BriarActivity; -import org.briarproject.android.util.AndroidUtils; -import org.briarproject.api.crypto.CryptoComponent; -import org.briarproject.api.crypto.CryptoExecutor; -import org.briarproject.api.crypto.KeyPair; -import org.briarproject.api.db.DbException; -import org.briarproject.api.identity.AuthorFactory; -import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.identity.LocalAuthor; -import org.briarproject.util.StringUtils; - -import java.util.concurrent.Executor; -import java.util.logging.Logger; - -import javax.inject.Inject; - -import static android.view.View.GONE; -import static android.view.View.VISIBLE; -import static android.widget.Toast.LENGTH_LONG; -import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; -import static org.briarproject.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; - -public class CreateIdentityActivity extends BriarActivity - implements OnEditorActionListener, OnClickListener { - - private static final Logger LOG = - Logger.getLogger(CreateIdentityActivity.class.getName()); - - @Inject - @CryptoExecutor - protected Executor cryptoExecutor; - - private TextInputLayout nicknameInput; - private EditText nicknameEntry; - private Button createIdentityButton; - private ProgressBar progress; - - // Fields that are accessed from background threads must be volatile - @Inject - protected volatile CryptoComponent crypto; - @Inject - protected volatile AuthorFactory authorFactory; - @Inject - protected volatile IdentityManager identityManager; - - @Override - public void onCreate(Bundle state) { - super.onCreate(state); - - setContentView(R.layout.activity_create_identity); - - nicknameInput = (TextInputLayout) findViewById(R.id.nicknameInputLayout); - nicknameEntry = (EditText) findViewById(R.id.nicknameEntry); - nicknameEntry.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, - int after) {} - - @Override - public void onTextChanged(CharSequence s, int start, int before, - int count) { - enableOrDisableCreateButton(); - } - - @Override - public void afterTextChanged(Editable s) {} - }); - nicknameEntry.setOnEditorActionListener(this); - - createIdentityButton = (Button) findViewById(R.id.createIdentityButton); - if (createIdentityButton != null) - createIdentityButton.setOnClickListener(this); - - progress = (ProgressBar) findViewById(R.id.progressBar); - } - - @Override - public void injectActivity(ActivityComponent component) { - component.inject(this); - } - - private void enableOrDisableCreateButton() { - if (progress == null) return; // Not created yet - createIdentityButton.setEnabled(validateNickname()); - } - - @Override - public boolean onEditorAction(TextView textView, int actionId, KeyEvent e) { - hideSoftKeyboard(textView); - return true; - } - - private boolean validateNickname() { - String nickname = nicknameEntry.getText().toString(); - int length = StringUtils.toUtf8(nickname).length; - if (length > MAX_AUTHOR_NAME_LENGTH) { - String str = getString(R.string.name_too_long); - AndroidUtils.setError(nicknameInput, str, true); - return false; - } - AndroidUtils.setError(nicknameInput, null, false); - return length > 0; - } - - @Override - public void onClick(View view) { - hideSoftKeyboard(view); - if (!validateNickname()) return; - // Replace the button with a progress bar - createIdentityButton.setVisibility(GONE); - progress.setVisibility(VISIBLE); - // Create the identity in a background thread - final String nickname = nicknameEntry.getText().toString(); - cryptoExecutor.execute(new Runnable() { - @Override - public void run() { - KeyPair keyPair = crypto.generateSignatureKeyPair(); - final byte[] publicKey = keyPair.getPublic().getEncoded(); - final byte[] privateKey = keyPair.getPrivate().getEncoded(); - LocalAuthor a = authorFactory.createLocalAuthor(nickname, - publicKey, privateKey); - storeLocalAuthor(a); - } - }); - } - - private void storeLocalAuthor(final LocalAuthor a) { - dbController.runOnDbThread(new Runnable() { - @Override - public void run() { - try { - long now = System.currentTimeMillis(); - identityManager.addLocalAuthor(a); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Storing author took " + duration + " ms"); - } catch (DbException e) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - setResultAndFinish(a); - } - }); - } - - private void setResultAndFinish(final LocalAuthor a) { - runOnUiThread(new Runnable() { - @Override - public void run() { - Intent i = new Intent(); - i.putExtra("briar.LOCAL_AUTHOR_ID", a.getId().getBytes()); - setResult(RESULT_OK, i); - Toast.makeText(CreateIdentityActivity.this, - R.string.identity_created_toast, LENGTH_LONG).show(); - finish(); - } - }); - } -} diff --git a/briar-android/src/org/briarproject/android/identity/LocalAuthorItem.java b/briar-android/src/org/briarproject/android/identity/LocalAuthorItem.java deleted file mode 100644 index a005144f5e2dfd54049ebc51d0b08ca2b4d6c9b5..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/identity/LocalAuthorItem.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.briarproject.android.identity; - -import org.briarproject.api.identity.LocalAuthor; - -public class LocalAuthorItem { - - public static final LocalAuthorItem ANONYMOUS = new LocalAuthorItem(null); - public static final LocalAuthorItem NEW = new LocalAuthorItem(null); - - private final LocalAuthor localAuthor; - - public LocalAuthorItem(LocalAuthor localAuthor) { - this.localAuthor = localAuthor; - } - - public LocalAuthor getLocalAuthor() { - return localAuthor; - } -} diff --git a/briar-android/src/org/briarproject/android/identity/LocalAuthorItemComparator.java b/briar-android/src/org/briarproject/android/identity/LocalAuthorItemComparator.java deleted file mode 100644 index 634d062e4cb317d40b625b512a85063eabdd99c6..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/identity/LocalAuthorItemComparator.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.briarproject.android.identity; - -import static org.briarproject.android.identity.LocalAuthorItem.ANONYMOUS; -import static org.briarproject.android.identity.LocalAuthorItem.NEW; - -import java.util.Comparator; - -public class LocalAuthorItemComparator implements Comparator<LocalAuthorItem> { - - public static final LocalAuthorItemComparator INSTANCE = - new LocalAuthorItemComparator(); - - public int compare(LocalAuthorItem a, LocalAuthorItem b) { - if (a == b) return 0; - // NEW comes after everything else - if (a == NEW) return 1; - if (b == NEW) return -1; - // ANONYMOUS comes after everything else except NEW - if (a == ANONYMOUS) return 1; - if (b == ANONYMOUS) return -1; - // Sort items in order of creation, so the oldest item is the default - long aCreated = a.getLocalAuthor().getTimeCreated(); - long bCreated = b.getLocalAuthor().getTimeCreated(); - if (aCreated < bCreated) return -1; - if (aCreated > bCreated) return 1; - return 0; - } -}