package awais.instagrabber.activities; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import awais.instagrabber.R; import awais.instagrabber.adapters.MessageItemsAdapter; import awais.instagrabber.asyncs.direct_messages.UserInboxFetcher; import awais.instagrabber.asyncs.UsernameFetcher; import awais.instagrabber.customviews.helpers.RecyclerLazyLoader; import awais.instagrabber.databinding.ActivityDmsBinding; import awais.instagrabber.interfaces.FetchListener; import awais.instagrabber.models.PostModel; import awais.instagrabber.models.ProfileModel; import awais.instagrabber.models.StoryModel; import awais.instagrabber.models.direct_messages.DirectItemModel; import awais.instagrabber.models.direct_messages.DirectItemModel.DirectItemMediaModel; import awais.instagrabber.models.direct_messages.InboxThreadModel; import awais.instagrabber.models.enums.DirectItemType; import awais.instagrabber.models.enums.MediaItemType; import awais.instagrabber.models.enums.UserInboxDirection; import awais.instagrabber.utils.Constants; import awais.instagrabber.utils.Utils; public final class DirectMessagesUserInbox extends AppCompatActivity { private DirectItemModel directItemModel; private final ProfileModel myProfileHolder = new ProfileModel(false, false, null, null, null, null, null, null, null, 0, 0, 0); private final ArrayList users = new ArrayList<>(); private final ArrayList directItemModels = new ArrayList<>(); private final FetchListener fetchListener = new FetchListener() { @Override public void doBefore() { dmsBinding.swipeRefreshLayout.setRefreshing(true); } @Override public void onResult(final InboxThreadModel result) { if (result == null && "MINCURSOR".equals(endCursor) || "MAXCURSOR".equals(endCursor) || Utils.isEmpty(endCursor)) Toast.makeText(DirectMessagesUserInbox.this, R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show(); if (result != null) { endCursor = result.getPrevCursor(); if ("MINCURSOR".equals(endCursor) || "MAXCURSOR".equals(endCursor)) endCursor = null; users.clear(); users.addAll(Arrays.asList(result.getUsers())); final int oldSize = directItemModels.size(); final List itemModels = Arrays.asList(result.getItems()); directItemModels.addAll(itemModels); messageItemsAdapter.notifyItemRangeInserted(oldSize, itemModels.size()); } dmsBinding.swipeRefreshLayout.setRefreshing(false); } }; private String endCursor; private ActivityDmsBinding dmsBinding; private MessageItemsAdapter messageItemsAdapter; @Override protected void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); dmsBinding = ActivityDmsBinding.inflate(getLayoutInflater()); setContentView(dmsBinding.getRoot()); final InboxThreadModel threadModel; final Intent intent = getIntent(); if (intent == null || !intent.hasExtra(Constants.EXTRAS_THREAD_MODEL) || (threadModel = (InboxThreadModel) intent.getSerializableExtra(Constants.EXTRAS_THREAD_MODEL)) == null) { Utils.errorFinish(this); return; } dmsBinding.swipeRefreshLayout.setEnabled(false); final LinearLayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, true); dmsBinding.rvDirectMessages.setLayoutManager(layoutManager); dmsBinding.rvDirectMessages.addOnScrollListener(new RecyclerLazyLoader(layoutManager, (page, totalItemsCount) -> { if (!Utils.isEmpty(endCursor)) { new UserInboxFetcher(threadModel.getThreadId(), UserInboxDirection.OLDER, endCursor, fetchListener).execute(); // serial because we don't want messages to be randomly ordered } })); dmsBinding.rvDirectMessages.setAdapter(messageItemsAdapter = new MessageItemsAdapter(directItemModels, users, v -> { // todo do something with clicked message Object tag = v.getTag(); if (tag instanceof DirectItemModel) { directItemModel = (DirectItemModel) tag; final String username = getUser(directItemModel.getUserId()).getUsername(); final DirectItemType itemType = directItemModel.getItemType(); switch(itemType) { case MEDIA_SHARE: startActivity(new Intent(this, PostViewer.class) .putExtra(Constants.EXTRAS_POST, new PostModel(directItemModel.getMediaModel().getCode()))); break; /*case STORY_SHARE: startActivity(new Intent(this, StoryViewer.class) .putExtra(Constants.EXTRAS_USERNAME, directItemModel.getReelShare().getReelOwnerName()) .putExtra(Constants.EXTRAS_STORIES, new StoryModel( directItemModel.getReelShare().getReelId(), directItemModel.getReelShare().getMedia() )) ); break;*/ case TEXT: searchUsername(username); } /* startActivity(new Intent(this, PostViewer.class) .putExtra(Constants.EXTRAS_POST, new PostModel(tag.toString()))); */ } }, (view, text, isHashtag) -> { // todo mention click stuff })); new UserInboxFetcher(threadModel.getThreadId(), UserInboxDirection.OLDER, null, fetchListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @Nullable private ProfileModel getUser(final long userId) { if (users != null) { for (final ProfileModel user : users) if (Long.toString(userId).equals(user.getId())) return user; return myProfileHolder; } return null; } private void searchUsername(final String text) { if (Main.scanHack != null) { Main.scanHack.onResult(text); setResult(6969); Intent intent = new Intent(getApplicationContext(), Main.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } } }