mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 10:49:06 +01:00
Merge branch '598-remove-unused-code' into 'master'
Remove unused UI code and layouts If we ever need this code, it will be in the git history. Closes #598 See merge request !342
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user