Search in sources :

Example 1 with Status

use of com.github.moko256.latte.client.base.entity.Status in project twicalico by moko256.

the class ShowTweetActivity method onCreate.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_tweet);
    subscriptions = new CompositeSubscription();
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeAsUpIndicator(R.drawable.ic_back_white_24dp);
    }
    statusId = getIntent().getLongExtra("statusId", -1);
    if (statusId == -1) {
        ShowTweetActivity.this.finish();
        return;
    }
    Status status = GlobalApplication.statusCache.get(statusId);
    if (status == null) {
        subscriptions.add(updateStatus().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(result -> {
            if (result == null) {
                finish();
                return;
            }
            updateView(result);
        }, e -> {
            e.printStackTrace();
            finish();
        }));
    } else {
        updateView(status);
    }
    SwipeRefreshLayout swipeRefreshLayout = findViewById(R.id.tweet_show_swipe_refresh);
    swipeRefreshLayout.setColorSchemeResources(R.color.color_primary);
    swipeRefreshLayout.setOnRefreshListener(() -> subscriptions.add(updateStatus().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(result -> {
        if (result == null) {
            finish();
            return;
        }
        updateView(result);
        swipeRefreshLayout.setRefreshing(false);
    }, e -> {
        e.printStackTrace();
        Toast.makeText(this, R.string.error_occurred, Toast.LENGTH_SHORT).show();
        swipeRefreshLayout.setRefreshing(false);
    })));
}
Also used : Status(twitter4j.Status) Context(android.content.Context) Bundle(android.os.Bundle) PostTweetModel(com.github.moko256.twicalico.model.base.PostTweetModel) FrameLayout(android.widget.FrameLayout) AndroidSchedulers(rx.android.schedulers.AndroidSchedulers) Intent(android.content.Intent) LinkMovementMethod(android.text.method.LinkMovementMethod) TwitterStringUtils(com.github.moko256.twicalico.text.TwitterStringUtils) UserMentionEntity(twitter4j.UserMentionEntity) MenuItem(android.view.MenuItem) AppCompatButton(android.support.v7.widget.AppCompatButton) Single(rx.Single) AppCustomTabsKt(com.github.moko256.twicalico.intent.AppCustomTabsKt) Toast(android.widget.Toast) Menu(android.view.Menu) Schedulers(rx.schedulers.Schedulers) TwitterException(twitter4j.TwitterException) VISIBLE(android.view.View.VISIBLE) ActionBar(android.support.v7.app.ActionBar) DateFormat(java.text.DateFormat) SwipeRefreshLayout(android.support.v4.widget.SwipeRefreshLayout) StatusCacheMap(com.github.moko256.twicalico.cacheMap.StatusCacheMap) AppCompatActivity(android.support.v7.app.AppCompatActivity) ViewGroup(android.view.ViewGroup) CompositeSubscription(rx.subscriptions.CompositeSubscription) TextView(android.widget.TextView) GONE(android.view.View.GONE) Html(android.text.Html) Status(twitter4j.Status) PostTweetModelCreator(com.github.moko256.twicalico.model.impl.PostTweetModelCreator) AppCompatEditText(android.support.v7.widget.AppCompatEditText) CompositeSubscription(rx.subscriptions.CompositeSubscription) SwipeRefreshLayout(android.support.v4.widget.SwipeRefreshLayout) ActionBar(android.support.v7.app.ActionBar)

Example 2 with Status

use of com.github.moko256.latte.client.base.entity.Status in project twicalico by moko256.

the class StatusView method updateView.

private void updateView() {
    final Status item = status.isRetweet() ? status.getRetweetedStatus() : status;
    if (status.isRetweet()) {
        if (retweetUserName.getVisibility() != View.VISIBLE) {
            retweetUserName.setVisibility(View.VISIBLE);
        }
        retweetUserName.setText(getContext().getString(R.string.repeat_by, status.getUser().getName()));
    } else {
        if (retweetUserName.getVisibility() != View.GONE) {
            retweetUserName.setVisibility(View.GONE);
        }
    }
    boolean isReply = item.getInReplyToScreenName() != null;
    if (isReply) {
        if (replyUserName.getVisibility() != View.VISIBLE) {
            replyUserName.setVisibility(View.VISIBLE);
        }
        replyUserName.setText(getContext().getString((item.getInReplyToStatusId() != -1) ? R.string.reply_to : R.string.mention_to, item.getInReplyToScreenName()));
    } else {
        if (replyUserName.getVisibility() != View.GONE) {
            replyUserName.setVisibility(View.GONE);
        }
    }
    if (status.isRetweet() || isReply) {
        if (headerBottomMargin.getVisibility() != VISIBLE) {
            headerBottomMargin.setVisibility(VISIBLE);
        }
    } else {
        if (headerBottomMargin.getVisibility() != GONE) {
            headerBottomMargin.setVisibility(GONE);
        }
    }
    if (GlobalApplication.configuration.isTimelineImageLoad) {
        glideRequests.load(item.getUser().get400x400ProfileImageURLHttps()).circleCrop().into(userImage);
    } else {
        userImage.setImageResource(R.drawable.border_frame_round);
    }
    userName.setText(item.getUser().getName());
    userId.setText(TwitterStringUtils.plusAtMark(item.getUser().getScreenName()));
    TwitterStringUtils.setLinkedSequenceTo(item, tweetContext);
    if (!tweetContext.getText().toString().trim().isEmpty()) {
        tweetContext.setMovementMethod(LinkMovementMethod.getInstance());
        if (tweetContext.getVisibility() != VISIBLE) {
            tweetContext.setVisibility(VISIBLE);
        }
    } else {
        tweetContext.setMovementMethod(null);
        if (tweetContext.getVisibility() != GONE) {
            tweetContext.setVisibility(GONE);
        }
    }
    timeStampText.setText(DateUtils.getRelativeTimeSpanString(item.getCreatedAt().getTime(), System.currentTimeMillis(), 0));
    userImage.setOnClickListener(v -> {
        ActivityOptionsCompat animation = ActivityOptionsCompat.makeSceneTransitionAnimation(((Activity) getContext()), v, "icon_image");
        getContext().startActivity(ShowUserActivity.getIntent(getContext(), item.getUser().getId()), animation.toBundle());
    });
    setOnClickListener(v -> {
        ActivityOptionsCompat animation = ActivityOptionsCompat.makeSceneTransitionAnimation(((Activity) getContext()), userImage, "icon_image");
        getContext().startActivity(ShowTweetActivity.getIntent(getContext(), item.getId()), animation.toBundle());
    });
    Status quotedStatus = item.getQuotedStatus();
    if (quotedStatus != null) {
        if (quoteTweetLayout.getVisibility() != View.VISIBLE) {
            quoteTweetLayout.setVisibility(View.VISIBLE);
        }
        quoteTweetLayout.setOnClickListener(v -> getContext().startActivity(ShowTweetActivity.getIntent(getContext(), quotedStatus.getId())));
        quoteTweetUserName.setText(quotedStatus.getUser().getName());
        quoteTweetUserId.setText(TwitterStringUtils.plusAtMark(quotedStatus.getUser().getScreenName()));
        quoteTweetContext.setText(quotedStatus.getText());
    } else {
        if (quoteTweetLayout.getVisibility() != View.GONE) {
            quoteTweetLayout.setVisibility(View.GONE);
        }
    }
    MediaEntity[] mediaEntities = item.getMediaEntities();
    if (mediaEntities.length != 0) {
        imageTableView.setVisibility(View.VISIBLE);
        imageTableView.setMediaEntities(mediaEntities, item.isPossiblySensitive());
    } else {
        imageTableView.setVisibility(View.GONE);
    }
    likeButton.setOnCheckedChangeListener((compoundButton, b) -> Single.create(subscriber -> {
        try {
            if (b && (!item.isFavorited())) {
                subscriber.onSuccess(GlobalApplication.twitter.createFavorite(item.getId()));
            } else if ((!b) && item.isFavorited()) {
                subscriber.onSuccess(GlobalApplication.twitter.destroyFavorite(item.getId()));
            }
        } catch (TwitterException e) {
            subscriber.onError(e);
        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(result -> {
        Status status = (Status) result;
        GlobalApplication.statusCache.add(status);
        setStatus(GlobalApplication.statusCache.get(this.status.getId()));
        Toast.makeText(getContext(), R.string.succeeded, Toast.LENGTH_SHORT).show();
    }, throwable -> {
        throwable.printStackTrace();
        Toast.makeText(getContext(), R.string.error_occurred, Toast.LENGTH_SHORT).show();
    }));
    likeButton.setChecked(item.isFavorited());
    retweetButton.setOnCheckedChangeListener((compoundButton, b) -> Single.create(subscriber -> {
        try {
            if (b && (!item.isRetweeted())) {
                subscriber.onSuccess(GlobalApplication.twitter.retweetStatus(item.getId()));
            } else if ((!b) && item.isRetweeted()) {
                subscriber.onSuccess(GlobalApplication.twitter.unRetweetStatus(item.getId()));
            }
        } catch (TwitterException e) {
            subscriber.onError(e);
        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(result -> {
        Status status = (Status) result;
        GlobalApplication.statusCache.add(status);
        setStatus(GlobalApplication.statusCache.get(this.status.getId()));
        Toast.makeText(getContext(), R.string.succeeded, Toast.LENGTH_SHORT).show();
    }, throwable -> {
        throwable.printStackTrace();
        Toast.makeText(getContext(), R.string.error_occurred, Toast.LENGTH_SHORT).show();
    }));
    retweetButton.setChecked(item.isRetweeted());
    retweetButton.setEnabled(GlobalApplication.clientType == Type.MASTODON || !(item.getUser().isProtected()) || item.getUser().getId() == GlobalApplication.userId);
    replyButton.setOnClickListener(v -> getContext().startActivity(PostActivity.getIntent(getContext(), item.getId(), TwitterStringUtils.convertToReplyTopString(GlobalApplication.userCache.get(GlobalApplication.userId).getScreenName(), item.getUser().getScreenName(), item.getUserMentionEntities()).toString())));
    likeCount.setText((item.getFavoriteCount() != 0) ? TwitterStringUtils.convertToSIUnitString(item.getFavoriteCount()) : "");
    retweetCount.setText((item.getRetweetCount() != 0) ? TwitterStringUtils.convertToSIUnitString(item.getRetweetCount()) : "");
}
Also used : Status(twitter4j.Status) Context(android.content.Context) ImageButton(android.widget.ImageButton) Type(com.github.moko256.twicalico.entity.Type) DateUtils(android.text.format.DateUtils) Space(android.widget.Space) FrameLayout(android.widget.FrameLayout) ImageView(android.widget.ImageView) AndroidSchedulers(rx.android.schedulers.AndroidSchedulers) LinkMovementMethod(android.text.method.LinkMovementMethod) TwitterStringUtils(com.github.moko256.twicalico.text.TwitterStringUtils) MediaEntity(twitter4j.MediaEntity) Single(rx.Single) AttributeSet(android.util.AttributeSet) CheckBox(android.widget.CheckBox) Toast(android.widget.Toast) Schedulers(rx.schedulers.Schedulers) View(android.view.View) TwitterException(twitter4j.TwitterException) LayoutInflater(android.view.LayoutInflater) TweetImageTableView(com.github.moko256.twicalico.widget.TweetImageTableView) ActivityOptionsCompat(android.support.v4.app.ActivityOptionsCompat) TextView(android.widget.TextView) Status(twitter4j.Status) RelativeLayout(android.widget.RelativeLayout) Activity(android.app.Activity) Activity(android.app.Activity) ActivityOptionsCompat(android.support.v4.app.ActivityOptionsCompat) TwitterException(twitter4j.TwitterException) MediaEntity(twitter4j.MediaEntity)

Example 3 with Status

use of com.github.moko256.latte.client.base.entity.Status in project twicalico by moko256.

the class BaseTweetListFragment method onCreateView.

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = super.onCreateView(inflater, container, savedInstanceState);
    int dp8 = Math.round(8f * getResources().getDisplayMetrics().density);
    getRecyclerView().setPadding(dp8, 0, 0, 0);
    getRecyclerView().addItemDecoration(new RecyclerView.ItemDecoration() {

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            outRect.right = dp8;
            outRect.top = dp8;
        }
    });
    if (getActivity() instanceof GetRecyclerViewPool) {
        getRecyclerView().setRecycledViewPool(((GetRecyclerViewPool) getActivity()).getTweetListViewPool());
    }
    adapter = new StatusesAdapter(getContext(), list);
    adapter.setOnLoadMoreClick(position -> subscription.add(getResponseSingle(new Paging().maxId(list.get(position - 1) - 1L).sinceId(list.get(list.size() >= position + 2 ? position + 2 : position + 1)).count(GlobalApplication.statusLimit)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(result -> {
        if (result.size() > 0) {
            list.remove(position);
            statusIdsDatabase.deleteIds(ArrayUtils.convertToLongList(-1L));
            adapter.notifyItemRemoved(position);
            List<Long> ids = Observable.from(result).map(Status::getId).toList().toSingle().toBlocking().value();
            if (ids.get(ids.size() - 1).equals(list.get(position))) {
                ids.remove(ids.size() - 1);
            } else {
                ids.add(-1L);
            }
            list.addAll(position, ids);
            statusIdsDatabase.insertIds(position, ids);
            adapter.notifyItemRangeInserted(position, ids.size());
        } else {
            list.remove(position);
            statusIdsDatabase.deleteIds(ArrayUtils.convertToLongList(-1L));
            adapter.notifyItemRemoved(position);
        }
    }, e -> {
        e.printStackTrace();
        Snackbar.make(getSnackBarParentContainer(), TwitterStringUtils.convertErrorToText(e), Snackbar.LENGTH_INDEFINITE).setAction(R.string.retry, v -> onLoadMoreList()).show();
    })));
    setAdapter(adapter);
    if (!isInitializedList()) {
        adapter.notifyDataSetChanged();
    }
    LAST_SAVED_LIST_POSITION = statusIdsDatabase.getListViewPosition();
    getRecyclerView().getLayoutManager().scrollToPosition(LAST_SAVED_LIST_POSITION);
    return view;
}
Also used : Status(twitter4j.Status) Context(android.content.Context) Rect(android.graphics.Rect) Arrays(java.util.Arrays) Bundle(android.os.Bundle) WindowManager(android.view.WindowManager) AndroidSchedulers(rx.android.schedulers.AndroidSchedulers) NonNull(android.support.annotation.NonNull) TwitterStringUtils(com.github.moko256.twicalico.text.TwitterStringUtils) ArrayList(java.util.ArrayList) Observable(rx.Observable) CachedIdListSQLiteOpenHelper(com.github.moko256.twicalico.database.CachedIdListSQLiteOpenHelper) Single(rx.Single) Toast(android.widget.Toast) Schedulers(rx.schedulers.Schedulers) Display(android.view.Display) View(android.view.View) TwitterException(twitter4j.TwitterException) ResponseList(twitter4j.ResponseList) StaggeredGridLayoutManager(android.support.v7.widget.StaggeredGridLayoutManager) LayoutInflater(android.view.LayoutInflater) Point(android.graphics.Point) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) ViewGroup(android.view.ViewGroup) CompositeSubscription(rx.subscriptions.CompositeSubscription) RecyclerView(android.support.v7.widget.RecyclerView) Gravity(android.view.Gravity) List(java.util.List) TypedValue(android.util.TypedValue) Status(twitter4j.Status) Paging(twitter4j.Paging) Snackbar(android.support.design.widget.Snackbar) ArrayUtils(com.github.moko256.twicalico.array.ArrayUtils) Rect(android.graphics.Rect) Paging(twitter4j.Paging) View(android.view.View) RecyclerView(android.support.v7.widget.RecyclerView) Point(android.graphics.Point) RecyclerView(android.support.v7.widget.RecyclerView)

Example 4 with Status

use of com.github.moko256.latte.client.base.entity.Status in project twicalico by moko256.

the class CachedStatusesSQLiteOpenHelperTest method updateCacheTest.

private void updateCacheTest() {
    helper.addCachedStatus(generateStatus(TEST_DUMMY_STATUS_ID_1, TEST_DUMMY_STATUS_TEXT_1), false);
    StatusObject updatedStatusResult = helper.getCachedStatus(TEST_DUMMY_STATUS_ID_1);
    assertEquals(((Status) updatedStatusResult).getText(), TEST_DUMMY_STATUS_TEXT_1);
}
Also used : StatusObject(com.github.moko256.latte.client.base.entity.StatusObject)

Example 5 with Status

use of com.github.moko256.latte.client.base.entity.Status in project twicalico by moko256.

the class ShowTweetActivity method updateView.

private void updateView(Status item) {
    TextView tweetIsReply = findViewById(R.id.tweet_show_is_reply_text);
    long replyTweetId = item.getInReplyToStatusId();
    if (replyTweetId != -1) {
        tweetIsReply.setVisibility(VISIBLE);
        tweetIsReply.setOnClickListener(v -> startActivity(getIntent(this, replyTweetId)));
    } else {
        tweetIsReply.setVisibility(GONE);
    }
    StatusView statusView = new StatusView(this);
    statusView.setStatus(item);
    ViewGroup cview = (ViewGroup) statusView.getChildAt(0);
    ViewGroup sview = (ViewGroup) cview.getChildAt(0);
    cview.removeView(sview);
    FrameLayout statusViewFrame = findViewById(R.id.tweet_show_tweet);
    statusViewFrame.removeAllViews();
    statusViewFrame.addView(sview);
    ((TextView) findViewById(R.id.tweet_show_timestamp)).setText(DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(item.getCreatedAt()));
    TextView viaText = findViewById(R.id.tweet_show_via);
    viaText.setText(TwitterStringUtils.convertUrlSpanToCustomTabs(Html.fromHtml("via:" + item.getSource()), this));
    viaText.setMovementMethod(new LinkMovementMethod());
    AppCompatEditText replyText = findViewById(R.id.tweet_show_tweet_reply_text);
    AppCompatButton replyButton = findViewById(R.id.tweet_show_tweet_reply_button);
    UserMentionEntity[] users = item.getUserMentionEntities();
    replyText.setText(TwitterStringUtils.convertToReplyTopString(GlobalApplication.userCache.get(GlobalApplication.userId).getScreenName(), item.getUser().getScreenName(), users));
    replyButton.setOnClickListener(v -> {
        replyButton.setEnabled(false);
        PostTweetModel model = PostTweetModelCreator.getInstance(GlobalApplication.twitter, getContentResolver());
        model.setTweetText(replyText.getText().toString());
        model.setInReplyToStatusId(item.getId());
        subscriptions.add(model.postTweet().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(it -> {
            replyText.setText(TwitterStringUtils.convertToReplyTopString(GlobalApplication.userCache.get(GlobalApplication.userId).getScreenName(), item.getUser().getScreenName(), users));
            replyButton.setEnabled(true);
            Toast.makeText(ShowTweetActivity.this, R.string.succeeded, Toast.LENGTH_SHORT).show();
        }, e -> {
            e.printStackTrace();
            Toast.makeText(ShowTweetActivity.this, R.string.error_occurred, Toast.LENGTH_SHORT).show();
            replyButton.setEnabled(true);
        }));
    });
}
Also used : Context(android.content.Context) Bundle(android.os.Bundle) PostTweetModel(com.github.moko256.twicalico.model.base.PostTweetModel) FrameLayout(android.widget.FrameLayout) AndroidSchedulers(rx.android.schedulers.AndroidSchedulers) Intent(android.content.Intent) LinkMovementMethod(android.text.method.LinkMovementMethod) TwitterStringUtils(com.github.moko256.twicalico.text.TwitterStringUtils) UserMentionEntity(twitter4j.UserMentionEntity) MenuItem(android.view.MenuItem) AppCompatButton(android.support.v7.widget.AppCompatButton) Single(rx.Single) AppCustomTabsKt(com.github.moko256.twicalico.intent.AppCustomTabsKt) Toast(android.widget.Toast) Menu(android.view.Menu) Schedulers(rx.schedulers.Schedulers) TwitterException(twitter4j.TwitterException) VISIBLE(android.view.View.VISIBLE) ActionBar(android.support.v7.app.ActionBar) DateFormat(java.text.DateFormat) SwipeRefreshLayout(android.support.v4.widget.SwipeRefreshLayout) StatusCacheMap(com.github.moko256.twicalico.cacheMap.StatusCacheMap) AppCompatActivity(android.support.v7.app.AppCompatActivity) ViewGroup(android.view.ViewGroup) CompositeSubscription(rx.subscriptions.CompositeSubscription) TextView(android.widget.TextView) GONE(android.view.View.GONE) Html(android.text.Html) Status(twitter4j.Status) PostTweetModelCreator(com.github.moko256.twicalico.model.impl.PostTweetModelCreator) AppCompatEditText(android.support.v7.widget.AppCompatEditText) AppCompatEditText(android.support.v7.widget.AppCompatEditText) UserMentionEntity(twitter4j.UserMentionEntity) ViewGroup(android.view.ViewGroup) FrameLayout(android.widget.FrameLayout) LinkMovementMethod(android.text.method.LinkMovementMethod) TextView(android.widget.TextView) PostTweetModel(com.github.moko256.twicalico.model.base.PostTweetModel) AppCompatButton(android.support.v7.widget.AppCompatButton)

Aggregations

Status (twitter4j.Status)9 Context (android.content.Context)8 Toast (android.widget.Toast)7 Bundle (android.os.Bundle)6 View (android.view.View)6 TwitterStringUtils (com.github.moko256.twicalico.text.TwitterStringUtils)6 Single (rx.Single)6 AndroidSchedulers (rx.android.schedulers.AndroidSchedulers)6 Schedulers (rx.schedulers.Schedulers)6 TwitterException (twitter4j.TwitterException)6 ViewGroup (android.view.ViewGroup)5 TextView (android.widget.TextView)5 CompositeSubscription (rx.subscriptions.CompositeSubscription)5 LinkMovementMethod (android.text.method.LinkMovementMethod)4 LayoutInflater (android.view.LayoutInflater)4 Intent (android.content.Intent)3 Point (android.graphics.Point)3 Rect (android.graphics.Rect)3 NonNull (android.support.annotation.NonNull)3 Snackbar (android.support.design.widget.Snackbar)3