use of com.github.moko256.twitlatte.entity.Client in project twicalico by moko256.
the class PostTweetModelImpl method postTweet.
@Override
public Single<Status> postTweet() {
return Single.create(subscriber -> {
try {
List<Long> ids = null;
if (uriList.size() > 0) {
ids = new ArrayList<>(uriList.size());
for (Uri uri : uriList) {
InputStream image = contentResolver.openInputStream(uri);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (true) {
int len = image.read(buffer);
if (len < 0) {
break;
}
bout.write(buffer, 0, len);
}
Attachment attachment = new Media(((MastodonTwitterImpl) GlobalApplication.twitter).client).postMedia(MultipartBody.Part.createFormData("file", uri.getLastPathSegment(), RequestBody.create(MediaType.parse(contentResolver.getType(uri)), bout.toByteArray()))).execute();
ids.add(attachment.getId());
}
}
subscriber.onSuccess(new MTStatus(new Statuses(client).postStatus(tweetText, inReplyToStatusId == -1 ? null : inReplyToStatusId, ids, possiblySensitive, null, com.sys1yagi.mastodon4j.api.entity.Status.Visibility.Public).execute()));
} catch (IOException | Mastodon4jRequestException e) {
subscriber.onError(e);
}
});
}
use of com.github.moko256.twitlatte.entity.Client in project twicalico by moko256.
the class PostActivity method onCreate.
@SuppressLint("SetTextI18n")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
TypedValue value = new TypedValue();
getTheme().resolveAttribute(android.R.attr.textColorTertiary, value, true);
COLOR_STABLE = ContextCompat.getColor(this, value.resourceId);
getTheme().resolveAttribute(R.attr.colorError, value, true);
COLOR_ERROR = ContextCompat.getColor(this, value.resourceId);
RequestManager requestManager = Glide.with(this);
client = GlobalApplicationKt.getClient(this);
model = new PostStatusModelImpl(getContentResolver(), client.getApiClient());
disposable = new CompositeDisposable();
rootViewGroup = findViewById(android.R.id.content);
actionBar = Objects.requireNonNull(getSupportActionBar());
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_clear_white_24dp);
actionBar.setDisplayShowCustomEnabled(true);
userIcon = new ImageView(this);
final int dp36 = DpToPxKt.dpToPx(this, 36);
ActionBar.LayoutParams userIconParams = new ActionBar.LayoutParams(dp36, dp36);
userIconParams.setMarginStart(dp36 / 3 * 2);
actionBar.setCustomView(userIcon, userIconParams);
disposable.add(Single.create(new VerifyCredentialOnSubscribe(client)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(user -> requestManager.load(client.getMediaUrlConverter().convertProfileIconUriBySize(user, dp36)).circleCrop().into(userIcon), Throwable::printStackTrace));
counterTextView = findViewById(R.id.tweet_text_edit_counter);
editText = findViewById(R.id.tweet_text_edit);
editText.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) {
model.getUpdateStatus().setContext(s.toString());
updateCounter();
}
@Override
public void afterTextChanged(Editable s) {
}
});
editText.setFilters(NoSpanInputFilterKt.getNoSpanInputFilter());
editText.setImageAddedListener(imageUri -> {
if (model.getUriList().size() < model.getUriListSizeLimit()) {
addedImagesAdapter.addImageAndUpdateView(imageUri);
model.getUriList().add(imageUri);
updateCounter();
isPossiblySensitive.setEnabled(true);
return true;
} else {
return false;
}
});
editText.setOnKeyListener((v, keyCode, event) -> {
if (!isPosting && event.getAction() == KeyEvent.ACTION_DOWN && event.isCtrlPressed() && keyCode == KeyEvent.KEYCODE_ENTER) {
postOrConfirmIfValid();
return true;
}
return false;
});
imagesRecyclerView = findViewById(R.id.activity_tweet_send_images_recycler_view);
addedImagesAdapter = new AddedImagesAdapter(this, requestManager);
imagesRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
imagesRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
outRect.right = DpToPxKt.oneDpToPx(getResources().getDisplayMetrics().density);
}
});
addedImagesAdapter.limit = model.getUriListSizeLimit();
addedImagesAdapter.onAddButtonClickListener = v -> startActivityForResult(Intent.createChooser(new Intent(Intent.ACTION_GET_CONTENT).addCategory(Intent.CATEGORY_OPENABLE).putExtra(Intent.EXTRA_MIME_TYPES, new String[] { "image/*", "video/*" }).putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true).setType("*/*"), getString(R.string.add_media)), REQUEST_GET_IMAGE);
addedImagesAdapter.onDeleteButtonListener = position -> {
addedImagesAdapter.removeImageAndUpdateView(position);
model.getUriList().remove(position);
boolean enabled = model.getUriList().size() > 0;
updateCounter();
isPossiblySensitive.setEnabled(enabled);
isPossiblySensitive.setChecked(isPossiblySensitive.isChecked() && enabled);
};
addedImagesAdapter.onImageClickListener = position -> {
try {
Intent open = new Intent(Intent.ACTION_VIEW).setData(model.getUriList().get(position)).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(open, getString(R.string.open_media)));
} catch (Throwable e) {
e.printStackTrace();
}
};
imagesRecyclerView.setAdapter(addedImagesAdapter);
emojiInputRecyclerView = findViewById(R.id.suggestions_of_emoji);
isPossiblySensitive = findViewById(R.id.activity_tweet_is_possibly_sensitive);
isPossiblySensitive.setEnabled(addedImagesAdapter.getImagesList().size() > 0);
isPossiblySensitive.setOnCheckedChangeListener((buttonView, isChecked) -> model.getUpdateStatus().setPossiblySensitive(isChecked));
postVisibility = findViewById(R.id.activity_tweet_visibility_spinner);
contentWarningText = findViewById(R.id.tweet_text_warning);
contentWarningEnabled = findViewById(R.id.activity_tweet_add_content_warning);
pollsText = new EditText[] { findViewById(R.id.edit_poll_0), findViewById(R.id.edit_poll_1), findViewById(R.id.edit_poll_2), findViewById(R.id.edit_poll_3) };
pollsExpiredAt = findViewById(R.id.edit_poll_expired_at);
pollsExpireAtLabel = findViewById(R.id.edit_poll_expired_at_description);
pollsMultiple = findViewById(R.id.poll_multiple);
pollsHideTotals = findViewById(R.id.hide_totals);
addPoll = findViewById(R.id.activity_add_poll);
ArraysKt.forEach(pollsText, editText -> {
editText.setVisibility(View.GONE);
return Unit.INSTANCE;
});
pollsExpiredAt.setVisibility(View.GONE);
pollsMultiple.setVisibility(View.GONE);
pollsHideTotals.setVisibility(View.GONE);
pollsExpireAtLabel.setVisibility(View.GONE);
if (client.getAccessToken().getClientType() == CLIENT_TYPE_MASTODON) {
emojiAdapter = new EmojiAdapter(emojiList, this, requestManager, emoji -> {
int selectionEnd = editText.getSelectionEnd();
String shortCode = emoji.getShortCode();
Editable text = editText.getText();
if (text != null) {
text.insert(selectionEnd, ":").insert(selectionEnd + 1, shortCode).insert(selectionEnd + 1 + shortCode.length(), ": ");
} else {
editText.setText(":" + shortCode + ": ");
}
editText.setSelection(selectionEnd + shortCode.length() + 3);
return Unit.INSTANCE;
}, () -> {
disposable.add(model.requestCustomEmojis().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(emojis -> {
emojiList.clear();
emojiList.addAll(emojis);
emojiAdapter.notifyDataSetChanged();
}, this::errorNotify));
return Unit.INSTANCE;
});
contentWarningText.setFilters(NoSpanInputFilterKt.getNoSpanInputFilter());
emojiInputRecyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false));
emojiInputRecyclerView.setAdapter(emojiAdapter);
contentWarningText.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) {
model.getUpdateStatus().setContentWarning(s.toString());
updateCounter();
}
@Override
public void afterTextChanged(Editable s) {
}
});
contentWarningEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
contentWarningText.setVisibility(View.VISIBLE);
contentWarningText.requestFocus();
} else {
contentWarningText.setVisibility(View.GONE);
model.getUpdateStatus().setContentWarning("");
}
});
postVisibility.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
model.getUpdateStatus().setVisibility(POST_VISIBILITY[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
ArrayList<String> options = new ArrayList<>(4);
ArraysKt.forEachIndexed(pollsText, (i, editText) -> {
if (i < 2) {
editText.setHint(getString(R.string.poll_n, i + 1));
} else {
editText.setHint(getString(R.string.poll_n_optional, i + 1));
}
options.add("");
editText.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) {
options.set(i, s.toString());
model.getUpdateStatus().setPollList(options);
}
@Override
public void afterTextChanged(Editable s) {
}
});
return Unit.INSTANCE;
});
pollsExpiredAt.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
model.getUpdateStatus().setPollExpiredSecond(POLL_EXPIRED_AT[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
pollsMultiple.setOnCheckedChangeListener((buttonView, isChecked) -> model.getUpdateStatus().setPollSelectableMultiple(isChecked));
pollsHideTotals.setOnCheckedChangeListener((buttonView, isChecked) -> model.getUpdateStatus().setPollHideTotalsUntilExpired(isChecked));
addPoll.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
ArraysKt.forEach(pollsText, editText -> {
editText.setVisibility(View.VISIBLE);
return Unit.INSTANCE;
});
pollsExpiredAt.setVisibility(View.VISIBLE);
pollsMultiple.setVisibility(View.VISIBLE);
pollsHideTotals.setVisibility(View.VISIBLE);
pollsExpireAtLabel.setVisibility(View.VISIBLE);
} else {
model.getUpdateStatus().setPollList(null);
ArraysKt.forEach(pollsText, editText -> {
editText.setVisibility(View.GONE);
editText.setText("");
return Unit.INSTANCE;
});
pollsExpiredAt.setVisibility(View.GONE);
pollsMultiple.setVisibility(View.GONE);
pollsHideTotals.setVisibility(View.GONE);
pollsExpireAtLabel.setVisibility(View.GONE);
}
});
} else {
emojiInputRecyclerView.setVisibility(View.GONE);
contentWarningEnabled.setVisibility(View.GONE);
postVisibility.setVisibility(View.GONE);
findViewById(R.id.activity_tweet_visibility_description).setVisibility(View.GONE);
addPoll.setVisibility(View.GONE);
}
addLocation = findViewById(R.id.activity_tweet_add_location);
if (client.getAccessToken().getClientType() == CLIENT_TYPE_TWITTER) {
addLocation.setVisibility(View.VISIBLE);
addLocation.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
locationText.setVisibility(View.VISIBLE);
if (PermissionChecker.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PermissionChecker.PERMISSION_GRANTED) {
updateLocation();
} else {
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, REQUEST_CODE_PERMISSION_LOCATION);
}
} else {
model.getUpdateStatus().setLocation(null);
locationText.setVisibility(View.GONE);
locationText.setText("");
}
});
} else {
addLocation.setVisibility(View.GONE);
}
locationText = findViewById(R.id.activity_tweet_location_result);
locationText.setVisibility(View.GONE);
if (getIntent() != null) {
model.getUpdateStatus().setInReplyToStatusId(getIntent().getLongExtra(INTENT_EXTRA_IN_REPLY_TO_STATUS_ID, -1));
if (savedInstanceState == null) {
String text = getIntent().getStringExtra(INTENT_EXTRA_TWEET_TEXT);
if (text != null) {
editText.setText(text);
editText.setSelection(text.length());
} else {
editText.setText("");
}
ArrayList<Uri> uris = getIntent().getParcelableArrayListExtra(INTENT_EXTRA_IMAGE_URI);
if (uris != null) {
addedImagesAdapter.getImagesList().addAll(uris);
model.getUriList().addAll(uris);
updateCounter();
isPossiblySensitive.setEnabled(true);
}
}
}
editText.setHint(model.isReply() ? R.string.reply : R.string.post);
}
use of com.github.moko256.twitlatte.entity.Client in project twicalico by moko256.
the class ShowTweetActivity method onCreate.
@SuppressLint("WrongConstant")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_tweet);
statusId = getIntent().getLongExtra("statusId", -1);
client = GlobalApplicationKt.getClient(this);
requestManager = Glide.with(this);
statusActionModel = new StatusActionModelImpl(client.getApiClient(), client.getPostCache());
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_back_white_24dp);
tweetIsReply = findViewById(R.id.tweet_show_is_reply_text);
statusViewBinder = new StatusViewBinder(findViewById(R.id.tweet_show_tweet));
timestampText = findViewById(R.id.tweet_show_timestamp);
viaText = findViewById(R.id.tweet_show_via);
replyFab = findViewById(R.id.tweet_show_fab);
SwipeRefreshLayout swipeRefreshLayout = findViewById(R.id.tweet_show_swipe_refresh);
swipeRefreshLayout.setColorSchemeResources(R.color.color_primary);
swipeRefreshLayout.setOnRefreshListener(() -> statusActionModel.updateStatus(statusId));
disposables.addAll(statusActionModel.getStatusObservable().subscribe(id -> {
Post post = client.getPostCache().getPost(statusId);
if (post != null) {
if (!isVisible) {
isVisible = true;
swipeRefreshLayout.getChildAt(0).setVisibility(VISIBLE);
}
updateView(post);
}
swipeRefreshLayout.setRefreshing(false);
}), statusActionModel.getDidActionObservable().subscribe(it -> Toast.makeText(this, TwitterStringUtils.getDidActionStringRes(client.getAccessToken().getClientType(), it), Toast.LENGTH_SHORT).show()), statusActionModel.getErrorObservable().subscribe(error -> {
error.printStackTrace();
Toast.makeText(this, error.getMessage(), Toast.LENGTH_LONG).show();
swipeRefreshLayout.setRefreshing(false);
if (client.getPostCache().getPost(statusId) == null) {
finish();
}
}));
Post status = client.getPostCache().getPost(statusId);
if (status != null) {
updateView(status);
} else {
swipeRefreshLayout.setRefreshing(true);
isVisible = false;
swipeRefreshLayout.getChildAt(0).setVisibility(GONE);
statusActionModel.updateStatus(statusId);
}
}
use of com.github.moko256.twitlatte.entity.Client in project twicalico by moko256.
the class ShowTweetActivity method updateView.
private void updateView(Post item) {
shareUrl = item.getStatus().getUrl();
long replyTweetId = item.getStatus().getInReplyToStatusId();
if (replyTweetId != -1) {
tweetIsReply.setVisibility(VISIBLE);
tweetIsReply.setOnClickListener(v -> startActivity(GlobalApplicationKt.setAccountKeyForActivity(getIntent(this, replyTweetId), this)));
} else {
tweetIsReply.setVisibility(GONE);
}
statusViewBinder.getTweetSpoilerText().setOnLongClickListener(v -> {
Toast.makeText(this, R.string.did_copy, Toast.LENGTH_SHORT).show();
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard.setPrimaryClip(ClipData.newPlainText("spoiler_text", item.getStatus().getSpoilerText()));
return true;
});
statusViewBinder.getTweetContext().setOnLongClickListener(v -> {
Toast.makeText(this, R.string.did_copy, Toast.LENGTH_SHORT).show();
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard.setPrimaryClip(ClipData.newPlainText("post_context", item.getStatus().getText()));
return true;
});
statusViewBinder.getUserImage().setOnClickListener(v -> {
ActivityOptionsCompat animation = ActivityOptionsCompat.makeSceneTransitionAnimation(this, v, "icon_image");
startActivity(GlobalApplicationKt.setAccountKeyForActivity(ShowUserActivity.getIntent(this, item.getUser().getId()), this), animation.toBundle());
});
statusViewBinder.setOnQuotedStatusClicked(v -> startActivity(GlobalApplicationKt.setAccountKeyForActivity(ShowTweetActivity.getIntent(this, item.getQuotedRepeatingStatus().getId()), this)));
statusViewBinder.setOnCardClicked(v -> AppCustomTabsKt.launchChromeCustomTabs(this, item.getStatus().getCard().getUrl(), false));
statusViewBinder.getLikeButton().setOnCheckedChangeListener((compoundButton, b) -> {
if (b) {
statusActionModel.createFavorite(item.getId());
} else {
statusActionModel.removeFavorite(item.getId());
}
return Unit.INSTANCE;
});
statusViewBinder.getRepeatButton().setOnCheckedChangeListener((compoundButton, b) -> {
if (b) {
statusActionModel.createRepeat(item.getId());
} else {
statusActionModel.removeRepeat(item.getId());
}
return Unit.INSTANCE;
});
View.OnClickListener replyOnClickListener = v -> startActivity(PostActivity.getIntent(this, item.getStatus().getId(), TwitterStringUtils.convertToReplyTopString(client.getUserCache().get(client.getAccessToken().getUserId()).getScreenName(), item.getUser().getScreenName(), item.getStatus().getMentions()).toString()));
statusViewBinder.getReplyButton().setOnClickListener(replyOnClickListener);
replyFab.setOnClickListener(replyOnClickListener);
statusViewBinder.setStatus(client, requestManager, item.getRepeatedUser(), item.getRepeat(), item.getUser(), item.getStatus(), item.getQuotedRepeatingUser(), item.getQuotedRepeatingStatus());
statusViewBinder.getSendVote().setOnClickListener(v -> statusActionModel.sendVote(statusId, item.getStatus().getPoll().getId(), statusViewBinder.getPollAdapter().getSelections()));
timestampText.setText(DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(item.getStatus().getCreatedAt()));
if (item.getStatus().getSourceName() != null) {
viaText.setText(TwitterStringUtils.appendLinkAtViaText(item.getStatus().getSourceName(), item.getStatus().getSourceWebsite()));
viaText.setMovementMethod(new LinkMovementMethod());
} else {
viaText.setVisibility(GONE);
}
}
use of com.github.moko256.twitlatte.entity.Client in project twicalico by moko256.
the class ShowUserActivity method onCreate.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_user);
client = GlobalApplicationKt.getClient(this);
viewModel = ViewModelProviders.of(this).get(UserInfoViewModel.class);
setSupportActionBar(findViewById(R.id.toolbar_show_user));
actionBar = Objects.requireNonNull(getSupportActionBar());
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_back_white_24dp);
swipeRefreshLayout = findViewById(R.id.activity_show_user_swipe_refresh_layout);
swipeRefreshLayout.setColorSchemeResources(R.color.color_primary);
appBarLayout = findViewById(R.id.appbar_show_user);
collapsingToolbarLayout = findViewById(R.id.collapsing_toolbar_show_user);
collapsingToolbarLayout.setCollapsedTitleTextColor(Color.WHITE);
viewPager = findViewById(R.id.show_user_view_pager);
new ScrollListener(appBarLayout, viewPager, swipeRefreshLayout, collapsingToolbarLayout);
adapter = new ShowUserFragmentsPagerAdapter(client.getAccessToken(), getSupportFragmentManager(), this);
adapter.initAdapter(viewPager);
tabLayout = findViewById(R.id.tab_show_user);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.addOnTabSelectedListener(this);
recycledViewPool = new RecyclerView.RecycledViewPool();
findViewById(R.id.activity_show_user_fab).setOnClickListener(v -> {
User user = viewModel.getUser().getValue();
if (user != null) {
startActivity(PostActivity.getIntent(this, TwitterStringUtils.plusAtMark(user.getScreenName()) + " "));
}
});
viewModel.setUserName(getIntent().getStringExtra("userScreenName"));
viewModel.setUserId(getIntent().getLongExtra("userId", -1));
viewModel.client = client;
viewModel.getUser().observe(this, user -> {
adapter.setUserId(user.getId());
collapsingToolbarLayout.setTitle(user.getName());
});
viewModel.getAction().observe(this, message -> Snackbar.make(getViewForSnackBar(), message, Snackbar.LENGTH_LONG).show());
viewModel.getError().observe(this, throwable -> {
throwable.printStackTrace();
Snackbar.make(getViewForSnackBar(), throwable.getMessage(), Snackbar.LENGTH_LONG).show();
});
if (savedInstanceState == null) {
viewModel.loadData(true);
}
}
Aggregations