mirror of
https://github.com/deltachat/deltachat-android.git
synced 2025-10-03 01:39:18 +02:00
292 lines
10 KiB
Java
292 lines
10 KiB
Java
package org.thoughtcrime.securesms;
|
|
|
|
import static com.b44t.messenger.DcChat.DC_CHAT_NO_CHAT;
|
|
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.res.Configuration;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.loader.app.LoaderManager;
|
|
import androidx.loader.content.Loader;
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import androidx.appcompat.view.ActionMode;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
import android.view.LayoutInflater;
|
|
import android.view.Menu;
|
|
import android.view.MenuItem;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.Window;
|
|
import android.widget.TextView;
|
|
|
|
import com.b44t.messenger.DcContext;
|
|
import com.b44t.messenger.DcEvent;
|
|
import com.b44t.messenger.DcMsg;
|
|
import com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager;
|
|
|
|
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
|
import org.thoughtcrime.securesms.database.loaders.BucketedThreadMediaLoader;
|
|
import org.thoughtcrime.securesms.util.ViewUtil;
|
|
|
|
import java.util.Set;
|
|
|
|
public class ProfileDocumentsFragment
|
|
extends MessageSelectorFragment
|
|
implements LoaderManager.LoaderCallbacks<BucketedThreadMediaLoader.BucketedThreadMedia>,
|
|
ProfileDocumentsAdapter.ItemClickListener
|
|
{
|
|
public static final String CHAT_ID_EXTRA = "chat_id";
|
|
public static final String SHOW_AUDIO_EXTRA = "show_audio";
|
|
public static final String SHOW_WEBXDC_EXTRA = "show_webxdc";
|
|
|
|
protected TextView noMedia;
|
|
protected RecyclerView recyclerView;
|
|
private StickyHeaderGridLayoutManager gridManager;
|
|
private final ActionModeCallback actionModeCallback = new ActionModeCallback();
|
|
private boolean showAudio;
|
|
private boolean showWebxdc;
|
|
|
|
protected int chatId;
|
|
|
|
@Override
|
|
public void onCreate(Bundle bundle) {
|
|
super.onCreate(bundle);
|
|
|
|
dcContext = DcHelper.getContext(getContext());
|
|
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
|
|
showAudio = getArguments().getBoolean(SHOW_AUDIO_EXTRA, false);
|
|
showWebxdc = getArguments().getBoolean(SHOW_WEBXDC_EXTRA, false);
|
|
|
|
getLoaderManager().initLoader(0, null, this);
|
|
}
|
|
|
|
@Override
|
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
View view = inflater.inflate(R.layout.profile_documents_fragment, container, false);
|
|
|
|
this.recyclerView = ViewUtil.findById(view, R.id.recycler_view);
|
|
this.noMedia = ViewUtil.findById(view, R.id.no_documents);
|
|
this.gridManager = new StickyHeaderGridLayoutManager(1);
|
|
|
|
this.recyclerView.setAdapter(new ProfileDocumentsAdapter(getContext(),
|
|
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
|
|
this));
|
|
this.recyclerView.setLayoutManager(gridManager);
|
|
this.recyclerView.setHasFixedSize(true);
|
|
|
|
DcEventCenter eventCenter = DcHelper.getEventCenter(getContext());
|
|
eventCenter.addObserver(DcContext.DC_EVENT_MSGS_CHANGED, this);
|
|
eventCenter.addObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
|
return view;
|
|
}
|
|
|
|
@Override
|
|
public void onDestroyView() {
|
|
DcHelper.getEventCenter(getContext()).removeObservers(this);
|
|
super.onDestroyView();
|
|
}
|
|
|
|
@Override
|
|
public void handleEvent(@NonNull DcEvent event) {
|
|
getLoaderManager().restartLoader(0, null, this);
|
|
}
|
|
|
|
@Override
|
|
public void onConfigurationChanged(Configuration newConfig) {
|
|
super.onConfigurationChanged(newConfig);
|
|
if (gridManager != null) {
|
|
this.gridManager = new StickyHeaderGridLayoutManager(1);
|
|
this.recyclerView.setLayoutManager(gridManager);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Loader<BucketedThreadMediaLoader.BucketedThreadMedia> onCreateLoader(int i, Bundle bundle) {
|
|
if (showAudio) {
|
|
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0);
|
|
} else if (showWebxdc) {
|
|
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_WEBXDC, 0, 0);
|
|
} else {
|
|
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_FILE, 0, 0);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onLoadFinished(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> loader, BucketedThreadMediaLoader.BucketedThreadMedia bucketedThreadMedia) {
|
|
((ProfileDocumentsAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
|
|
((ProfileDocumentsAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
|
|
|
|
noMedia.setVisibility(recyclerView.getAdapter().getItemCount() > 0 ? View.GONE : View.VISIBLE);
|
|
if (chatId == DC_CHAT_NO_CHAT) {
|
|
if (showWebxdc) {
|
|
noMedia.setText(R.string.all_apps_empty_hint);
|
|
} else if (!showAudio){
|
|
noMedia.setText(R.string.all_files_empty_hint);
|
|
} else {
|
|
noMedia.setText(R.string.tab_all_media_empty_hint);
|
|
}
|
|
} else if (showAudio) {
|
|
noMedia.setText(R.string.tab_audio_empty_hint);
|
|
} else if (showWebxdc) {
|
|
noMedia.setText(R.string.tab_webxdc_empty_hint);
|
|
}
|
|
getActivity().invalidateOptionsMenu();
|
|
}
|
|
|
|
@Override
|
|
public void onLoaderReset(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> cursorLoader) {
|
|
((ProfileDocumentsAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
|
|
}
|
|
|
|
@Override
|
|
public void onMediaClicked(@NonNull DcMsg mediaRecord) {
|
|
if (actionMode != null) {
|
|
handleMediaMultiSelectClick(mediaRecord);
|
|
} else {
|
|
handleMediaPreviewClick(mediaRecord);
|
|
}
|
|
}
|
|
|
|
private void updateActionModeBar() {
|
|
actionMode.setTitle(String.valueOf(getListAdapter().getSelectedMediaCount()));
|
|
setCorrectMenuVisibility(actionMode.getMenu());
|
|
}
|
|
|
|
private void handleMediaMultiSelectClick(@NonNull DcMsg mediaRecord) {
|
|
ProfileDocumentsAdapter adapter = getListAdapter();
|
|
|
|
adapter.toggleSelection(mediaRecord);
|
|
if (adapter.getSelectedMediaCount() == 0) {
|
|
actionMode.finish();
|
|
actionMode = null;
|
|
} else {
|
|
updateActionModeBar();
|
|
}
|
|
}
|
|
|
|
private void handleMediaPreviewClick(@NonNull DcMsg dcMsg) {
|
|
// audio is started by the play-button
|
|
if (dcMsg.getType()==DcMsg.DC_MSG_AUDIO || dcMsg.getType()==DcMsg.DC_MSG_VOICE) {
|
|
return;
|
|
}
|
|
|
|
Context context = getContext();
|
|
if (context == null) {
|
|
return;
|
|
}
|
|
|
|
if (dcMsg.getType() == DcMsg.DC_MSG_WEBXDC) {
|
|
WebxdcActivity.openWebxdcActivity(context, dcMsg);
|
|
} else {
|
|
DcHelper.openForViewOrShare(getActivity(), dcMsg.getId(), Intent.ACTION_VIEW);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onMediaLongClicked(DcMsg mediaRecord) {
|
|
if (actionMode == null) {
|
|
((ProfileDocumentsAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
|
|
|
|
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void setCorrectMenuVisibility(Menu menu) {
|
|
Set<DcMsg> messageRecords = getListAdapter().getSelectedMedia();
|
|
|
|
if (actionMode != null && messageRecords.size() == 0) {
|
|
actionMode.finish();
|
|
return;
|
|
}
|
|
|
|
boolean singleSelection = messageRecords.size() == 1;
|
|
menu.findItem(R.id.details).setVisible(singleSelection);
|
|
menu.findItem(R.id.show_in_chat).setVisible(singleSelection);
|
|
menu.findItem(R.id.share).setVisible(singleSelection);
|
|
|
|
boolean canResend = true;
|
|
for (DcMsg messageRecord : messageRecords) {
|
|
if (!messageRecord.isOutgoing()) {
|
|
canResend = false;
|
|
break;
|
|
}
|
|
}
|
|
menu.findItem(R.id.menu_resend).setVisible(canResend);
|
|
|
|
boolean webxdcApp = singleSelection && messageRecords.iterator().next().getType() == DcMsg.DC_MSG_WEBXDC;
|
|
menu.findItem(R.id.menu_add_to_home_screen).setVisible(webxdcApp);
|
|
}
|
|
|
|
private ProfileDocumentsAdapter getListAdapter() {
|
|
return (ProfileDocumentsAdapter) recyclerView.getAdapter();
|
|
}
|
|
|
|
private class ActionModeCallback implements ActionMode.Callback {
|
|
|
|
private int originalStatusBarColor;
|
|
|
|
@Override
|
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
mode.getMenuInflater().inflate(R.menu.profile_context, menu);
|
|
mode.setTitle("1");
|
|
|
|
Window window = getActivity().getWindow();
|
|
originalStatusBarColor = window.getStatusBarColor();
|
|
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
|
|
setCorrectMenuVisibility(menu);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
|
|
int itemId = menuItem.getItemId();
|
|
if (itemId == R.id.details) {
|
|
handleDisplayDetails(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
|
|
mode.finish();
|
|
return true;
|
|
} else if (itemId == R.id.delete) {
|
|
handleDeleteMessages(chatId, getListAdapter().getSelectedMedia());
|
|
mode.finish();
|
|
return true;
|
|
} else if (itemId == R.id.share) {
|
|
handleShare(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
|
|
return true;
|
|
} else if (itemId == R.id.menu_add_to_home_screen) {
|
|
WebxdcActivity.addToHomeScreen(getActivity(), getSelectedMessageRecord(getListAdapter().getSelectedMedia()).getId());
|
|
mode.finish();
|
|
return true;
|
|
} else if (itemId == R.id.show_in_chat) {
|
|
handleShowInChat(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
|
|
return true;
|
|
} else if (itemId == R.id.save) {
|
|
handleSaveAttachment(getListAdapter().getSelectedMedia());
|
|
return true;
|
|
} else if (itemId == R.id.menu_resend) {
|
|
handleResendMessage(getListAdapter().getSelectedMedia());
|
|
return true;
|
|
} else if (itemId == R.id.menu_select_all) {
|
|
getListAdapter().selectAll();
|
|
updateActionModeBar();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void onDestroyActionMode(ActionMode mode) {
|
|
actionMode = null;
|
|
getListAdapter().clearSelection();
|
|
|
|
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
|
|
}
|
|
}
|
|
}
|