diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java index 53eda70485be8bec49e56e8f0ec2e0d9369c12d2..da1a1ba0c536c974747f2a01b1946bb21e89fc3a 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ChatPresenter.java @@ -71,6 +71,7 @@ import com.nynja.mobile.communicator.data.models.nynjamodels.RoomModel; import com.nynja.mobile.communicator.data.models.nynjamodels.RosterModel; import com.nynja.mobile.communicator.data.sdk.calls.ActiveConferenceCall; import com.nynja.mobile.communicator.data.sdk.calls.RejoinConferenceCallData; +import com.nynja.mobile.communicator.data.sticker.StickerManager; import com.nynja.mobile.communicator.data.transfer.ForwardMessageTransferData; import com.nynja.mobile.communicator.data.transfer.LanguageTransferData; import com.nynja.mobile.communicator.data.transfer.ReplyTransferData; @@ -1152,6 +1153,78 @@ public class ChatPresenter extends BaseChatPresenter { } }; + + private ResultListener imageViewerResultListener = resultData -> { + Timber.i("mPaymentResultListener"); + setInChat(true); + mRouter.removeResultListener(100); + isWaitingResultFromNavigator = false; + if (resultData instanceof Map) { + Map result = (Map) resultData; + String task = (String)result.get("name"); + MessageModel messageModel = (MessageModel)result.get("messagemodel"); + if(messageModel != null) + { + switch(task) { + case "forward": + getViewState().forwardMessage(messageModel); + return; + case "delete": + clickDeleteMessage(messageModel); + return; + case "reply": + DescModel desc = messageModel.getMessageDescIfExists(); + String text = ""; + if (desc != null) { + switch (desc.mime) { + case DescModel.MimeTypes.Audio: + text = mDataManager.getContext().getResources().getString(R.string.reply_message_audio); + break; + case DescModel.MimeTypes.Contact: + text = mDataManager.getContext().getResources().getString(R.string.reply_message_contact); + break; + case DescModel.MimeTypes.Video: + text = mDataManager.getContext().getResources().getString(R.string.reply_message_video); + break; + case DescModel.MimeTypes.Image: + text = mDataManager.getContext().getResources().getString(R.string.reply_message_photo); + break; + case DescModel.MimeTypes.Location: + case DescModel.MimeTypes.Place: + text = mDataManager.getContext().getResources().getString(R.string.reply_message_location); + break; + case DescModel.MimeTypes.File: + text = desc.getDescFileName(); + break; + case DescModel.MimeTypes.Text: + text = desc.payload; + break; + case DescModel.MimeTypes.Sticker: + Sticker sticker = DescManager.getStickerFromDesc(mDataManager.getContext(), desc); + text = StickerManager.extrudeStickerPreviewLabel(sticker); + break; + case DescModel.MimeTypes.Transfer: + text = desc.payload + " NYN"; + break; + case DescModel.MimeTypes.AudioCall: + text = mDataManager.getContext().getResources().getString(R.string.reply_audio_call); + break; + case DescModel.MimeTypes.VideoCall: + text = mDataManager.getContext().getResources().getString(R.string.reply_video_call); + break; + } + } + showReplyMessage(messageModel, text); + return; + } + + + + } + // getViewState().onPaymentResult((Intent) resultData); + } + }; + public void onPickFile() { mRouter.navigateActivityForResult(NynjaNavigator.GET_FILE, FILE_REQUEST_CODE, mFileResultListener); } @@ -2313,13 +2386,17 @@ public class ChatPresenter extends BaseChatPresenter { public void onVideoClick(MessageModel message) { getViewState().hideSnackbar(); setInChat(false); - getViewState().navigateToVideoPlay(message); + // getViewState().navigateToVideoPlay(message); + mRouter.navigateActivityForResult(NynjaNavigator.VIDEO_PLAY, 100, message,imageViewerResultListener); + } public void onPhotoClick(MessageModel message, View transitionView) { getViewState().hideSnackbar(); setInChat(false); - mRouter.navigateToWithTransition(NynjaNavigator.PREVIEW_IMAGE, new ImageViewerData(mRoom, message), transitionView, ImageViewerActivity.TRANSITION_PREVIEW); + mRouter.navigateActivityForResult(NynjaNavigator.PREVIEW_IMAGE, 100, new ImageViewerData(mRoom, message),imageViewerResultListener); + + //mRouter.navigateToWithTransition(NynjaNavigator.PREVIEW_IMAGE, new ImageViewerData(mRoom, message), transitionView, ImageViewerActivity.TRANSITION_PREVIEW); } public void onPaymentClick() { diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ImageViewerPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ImageViewerPresenter.java index d621840defc2fc881dd3703fd63b07a5ba7b923f..63ffa3bfc8abf0fff270df70a6712c41f9c52c08 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ImageViewerPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/ImageViewerPresenter.java @@ -1,18 +1,34 @@ package com.nynja.mobile.communicator.mvp.presenters; +import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.view.View; +import android.widget.Toast; import com.arellomobile.mvp.InjectViewState; +import com.nynja.mobile.communicator.R; import com.nynja.mobile.communicator.data.models.ImageViewerData; import com.nynja.mobile.communicator.data.models.nynjamodels.DescModel; import com.nynja.mobile.communicator.data.models.nynjamodels.MessageModel; +import com.nynja.mobile.communicator.data.transfer.ForwardMessageTransferData; import com.nynja.mobile.communicator.mvp.view.ImageViewerView; import com.nynja.mobile.communicator.utils.FileExtension; +import com.nynja.mobile.communicator.utils.FileUtils; +import com.nynja.mobile.communicator.utils.contextmenu.ContextMenuManager; +import com.nynja.mobile.communicator.utils.contextmenu.ContextMenuPopup; +import com.nynja.mobile.communicator.utils.exeption.FileDoesNotExistExeption; +import com.nynja.mobile.communicator.utils.navigation.navigators.HomeNavigator; +import com.nynja.mobile.communicator.utils.navigation.navigators.NynjaNavigator; +import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import io.reactivex.Completable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import timber.log.Timber; @@ -36,6 +52,71 @@ public class ImageViewerPresenter extends BasePresenter { showPhotos(); } + public void setMessageAsStarred(MessageModel message) { + mDataManager.addToFavorites(message); + } + + public void setMessageAsUnStarred(MessageModel message) { + mDataManager.removeFromFavorites(message); + } + + public void clickDeleteMessage(MessageModel item) { + // goto previous screen + } + + public void shareMessageContent(@NonNull MessageModel message, @NonNull Context context) { + DescModel desc = message.getDescForDownload(); + if (desc == null || !(message.isVideo() || message.isImage())) return; + final File descFile = FileUtils.getDownloadedFile(desc.getDescStorageFileName(), + message.isVideo() ? FileUtils.FileType.Video : FileUtils.FileType.Image); + + if (descFile != null) { + File shareFile = descFile; + openShareIntent(message, shareFile, context); + } + } + + private void openShareIntent(@NonNull MessageModel message, @Nullable File + shareFile, @NonNull Context context) { + if (shareFile == null) return; + String shareFilePath = FileUtils.getFilePath(shareFile, context); + if (shareFilePath != null && !shareFilePath.isEmpty()) { + + if (message.isImage()) { + mRouter.navigateTo(NynjaNavigator.SHARE_IMAGE, shareFilePath); + } else if (message.isVideo()) { + mRouter.navigateTo(NynjaNavigator.SHARE_VIDEO, shareFilePath); + } + } + } + + + + + public void saveToCamera(@Nullable MessageModel message) { + getViewState().showProgressDialog(); + addDisposable(Completable.fromAction(() -> mDataManager.saveFileToCamera(message)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + () -> { + getViewState().hideProgressDialog(); + // + Toast.makeText(mDataManager.getContext(), R.string.menu_context_saved_to_camera_success, Toast.LENGTH_SHORT).show(); + + }, + throwable -> { + Timber.e(throwable); + getViewState().hideProgressDialog(); + if (throwable instanceof FileDoesNotExistExeption) { + Toast.makeText(mDataManager.getContext(), R.string.menu_context_saved_to_camera_error, Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mDataManager.getContext(), R.string.menu_context_saved_to_camera_success, Toast.LENGTH_SHORT).show(); + + } + })); + } + private void showPhotos() { if (mPreviewData != null && mPreviewData.getRoom() != null && mPreviewData.getMessage() != null) { if (mPreviewData.getMessage() != null) { @@ -66,6 +147,14 @@ public class ImageViewerPresenter extends BasePresenter { return list; } + public void returnWithResult(MessageModel messageModel, String key) + { + Map operation = new HashMap(0); + operation.put("messagemodel",messageModel); + operation.put("name",key); + mRouter.exitWithResult(100, operation); + } + public void setUrl(String url) { getViewState().setImage(url); } diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/VideoPlayPresenter.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/VideoPlayPresenter.java index bd2a0128ed41daacf5491e36f4ff864775e3972c..3d9aa92fc30ad4cd2362135930037f42195fa892 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/VideoPlayPresenter.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/presenters/VideoPlayPresenter.java @@ -1,15 +1,29 @@ package com.nynja.mobile.communicator.mvp.presenters; +import android.content.Context; import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.widget.Toast; import com.arellomobile.mvp.InjectViewState; +import com.nynja.mobile.communicator.R; import com.nynja.mobile.communicator.data.audio.headphones.data.HeadphoneState; import com.nynja.mobile.communicator.data.models.events.local.Event; import com.nynja.mobile.communicator.data.models.nynjamodels.DescModel; import com.nynja.mobile.communicator.data.models.nynjamodels.MessageModel; import com.nynja.mobile.communicator.mvp.view.VideoPlayView; +import com.nynja.mobile.communicator.utils.FileUtils; +import com.nynja.mobile.communicator.utils.exeption.FileDoesNotExistExeption; +import com.nynja.mobile.communicator.utils.navigation.navigators.NynjaNavigator; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.Completable; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import timber.log.Timber; /** @@ -56,6 +70,77 @@ public class VideoPlayPresenter extends BasePresenter { ); } + public void setMessageAsStarred(MessageModel message) { + mDataManager.addToFavorites(message); + } + + public void setMessageAsUnStarred(MessageModel message) { + mDataManager.removeFromFavorites(message); + } + + + public void shareMessageContent(@NonNull MessageModel message, @NonNull Context context) { + DescModel desc = message.getDescForDownload(); + if (desc == null || !(message.isVideo() || message.isImage())) return; + final File descFile = FileUtils.getDownloadedFile(desc.getDescStorageFileName(), + message.isVideo() ? FileUtils.FileType.Video : FileUtils.FileType.Image); + + if (descFile != null) { + File shareFile = descFile; + openShareIntent(message, shareFile, context); + } + } + + private void openShareIntent(@NonNull MessageModel message, @Nullable File + shareFile, @NonNull Context context) { + if (shareFile == null) return; + String shareFilePath = FileUtils.getFilePath(shareFile, context); + if (shareFilePath != null && !shareFilePath.isEmpty()) { + + if (message.isImage()) { + mRouter.navigateTo(NynjaNavigator.SHARE_IMAGE, shareFilePath); + } else if (message.isVideo()) { + mRouter.navigateTo(NynjaNavigator.SHARE_VIDEO, shareFilePath); + } + } + } + + + + + public void saveToCamera(@Nullable MessageModel message) { + getViewState().showProgressDialog(); + addDisposable(Completable.fromAction(() -> mDataManager.saveFileToCamera(message)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + () -> { + getViewState().hideProgressDialog(); + // + Toast.makeText(mDataManager.getContext(), R.string.menu_context_saved_to_camera_success, Toast.LENGTH_SHORT).show(); + + }, + throwable -> { + Timber.e(throwable); + getViewState().hideProgressDialog(); + if (throwable instanceof FileDoesNotExistExeption) { + Toast.makeText(mDataManager.getContext(), R.string.menu_context_saved_to_camera_error, Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mDataManager.getContext(), R.string.menu_context_saved_to_camera_success, Toast.LENGTH_SHORT).show(); + + } + })); + } + + public void returnWithResult(MessageModel messageModel, String key) + { + Map operation = new HashMap(0); + operation.put("messagemodel",messageModel); + operation.put("name",key); + mRouter.exitWithResult(100, operation); + } + + private void playPauseVideo(boolean isPlaying) { if (isPlaying) { getViewState().pauseVideo(); diff --git a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatMvpView.java b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatMvpView.java index b7f3fcc50fe65dce1989558bc493e085a64b6849..ef6139d93a6cb3b331d06eaf494e46af9dd55faa 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatMvpView.java +++ b/app/src/main/java/com/nynja/mobile/communicator/mvp/view/ChatMvpView.java @@ -327,6 +327,7 @@ public interface ChatMvpView extends BaseChatMvpView { void noSelectedMessagesMessage(); + void forwardMessage(MessageModel message); void showRequestPermissionForCall(RejoinConferenceCallData rejoinData); void navigateCreateNewCall(boolean isVideo, Parcelable prevModel); diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/ImageViewerActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/ImageViewerActivity.java index 03d0360713a6801fe122f3b28e6a7fdf7efa21c4..5053448428ba96f8b18b4bc1ab9eb56fe395bf84 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/ImageViewerActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/ImageViewerActivity.java @@ -1,24 +1,34 @@ package com.nynja.mobile.communicator.ui.activities; +import android.Manifest; import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.os.Bundle; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PagerSnapHelper; import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.MenuItem; import android.view.View; +import android.widget.PopupMenu; import com.arellomobile.mvp.presenter.InjectPresenter; import com.github.chrisbanes.photoview.PhotoView; +import com.nynja.mobile.communicator.NynjaApp; import com.nynja.mobile.communicator.R; import com.nynja.mobile.communicator.data.models.ImageViewerData; import com.nynja.mobile.communicator.data.models.nynjamodels.MessageModel; +import com.nynja.mobile.communicator.mvp.presenters.CreateGroupPresenter; import com.nynja.mobile.communicator.mvp.presenters.ImageViewerPresenter; import com.nynja.mobile.communicator.mvp.view.ImageViewerView; import com.nynja.mobile.communicator.ui.adapters.ImageViewerAdapter; import com.bumptech.glide.Glide; import com.nynja.mobile.communicator.ui.base.BaseActivity; import com.nynja.mobile.communicator.ui.views.FlingLayout; +import com.nynja.mobile.communicator.utils.PermissionHelper; +import com.nynja.mobile.communicator.utils.navigation.header.NynjaHeaderView; import java.util.ArrayList; import java.util.List; @@ -26,6 +36,7 @@ import java.util.List; import butterknife.BindView; import butterknife.OnClick; import kotlin.Unit; +import timber.log.Timber; /** * Created by dmitro.boiko on 15/08/2017. @@ -40,6 +51,8 @@ public class ImageViewerActivity extends BaseActivity implements ImageViewerView private final static int SCROLL_ACCELERATION_VALUE = 20; private ImageViewerAdapter mAdapter; + // @BindView(R.id.nynja_header_view) NynjaHeaderView mNynjaHeaderView; + @InjectPresenter ImageViewerPresenter mImageViewerPresenter; @BindView(R.id.a_viewer_image_iv_photo) PhotoView mPhotoView; @@ -61,10 +74,72 @@ public class ImageViewerActivity extends BaseActivity implements ImageViewerView return intent; } + @OnClick(R.id.a_viewer_image_btn_menu) + public void onClick(View v) { + int num = ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition(); + Log.d("DEBUG", String.valueOf(num)); + MessageModel message = mAdapter.getItems().get(num); + + PopupMenu popup = new PopupMenu(NynjaApp.getComponent().context(),findViewById(R.id.a_viewer_image_btn_menu)); + popup.getMenuInflater().inflate(R.menu.media_options, popup.getMenu()); + if(message.isStarred) + { + popup.getMenu().findItem(R.id.star).setVisible(false); + popup.getMenu().findItem(R.id.unstar).setVisible(true); + + } + else + { + popup.getMenu().findItem(R.id.star).setVisible(true); + popup.getMenu().findItem(R.id.unstar).setVisible(false); + } + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + + switch(item.getItemId()) { + case R.id.star: + mImageViewerPresenter.setMessageAsStarred(message); + message.isStarred = true; + return true; + case R.id.unstar: + mImageViewerPresenter.setMessageAsUnStarred(message); + message.isStarred = false; + return true; + case R.id.share: + shareMessageContent(message); + return true; + case R.id.save_to_camera: + mImageViewerPresenter.saveToCamera(message); + return true; + case R.id.forward: + mImageViewerPresenter.returnWithResult(message,"forward"); + return true; + case R.id.delete: + mImageViewerPresenter.returnWithResult(message,"delete"); + return true; + case R.id.reply: + mImageViewerPresenter.returnWithResult(message,"reply"); + return true; + + + } + + return true; + } + }); + + popup.getMenu().removeItem(0); + popup.show(); + } + + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image_viewer); initAdapter(); + + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); if (getIntent() != null) { if (getIntent().hasExtra(BUNDLE_MESSAGE_NAME)) { mImageViewerPresenter.setPreviewData(getIntent().getParcelableExtra(BUNDLE_MESSAGE_NAME)); @@ -75,10 +150,18 @@ public class ImageViewerActivity extends BaseActivity implements ImageViewerView mRecyclerView.setVisibility(View.GONE); } } + // mNynjaHeaderView=findViewById(R.id.nynja_header_view); + +//message.isStarred + // mNynjaHeaderView.setLogoTitleText("Live Location"); + // mNynjaHeaderView.(); + //mNynjaHeaderView.subscribeOnPlusButtonEvent(v -> onClick(v)); flingLayout.setDismissListener(() -> { supportFinishAfterTransition(); return Unit.INSTANCE; + + }); flingLayout.setPositionChangeListener((top, left, dragRangeRate) -> { if (dragRangeRate > 0F) { @@ -112,16 +195,35 @@ public class ImageViewerActivity extends BaseActivity implements ImageViewerView } } + private void shareMessageContent(MessageModel message) { + if (this == null) return; + if (message != null) { + addDisposable(mRxPermissions.requestEachCombined(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .subscribe(permission -> { + if (permission.granted) { + mImageViewerPresenter.shareMessageContent(message, this); + } else if (!permission.shouldShowRequestPermissionRationale) { + PermissionHelper.getInstance().showPermissionDialog(this, + mImageViewerPresenter.getPermissionDialogListener(), Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + }, Timber::e)); + } + } + + + private void initAdapter() { mAdapter = new ImageViewerAdapter(new ArrayList<>(), this); mRecyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)); mRecyclerView.setAdapter(mAdapter); + PagerSnapHelper snapHelper = new PagerSnapHelper(); snapHelper.attachToRecyclerView(mRecyclerView); } @OnClick(R.id.a_viewer_image_btn_close) public void onCloseClick() { + supportFinishAfterTransition(); } } diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/VideoPlayActivity.java b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/VideoPlayActivity.java index 71433577c6bc6ec08079920812a683ba499d48c9..930c00a42b8bcf1bc367b5c05c5524f891fa6b5b 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/activities/VideoPlayActivity.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/activities/VideoPlayActivity.java @@ -1,11 +1,18 @@ package com.nynja.mobile.communicator.ui.activities; +import android.Manifest; import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; import android.view.Window; import android.view.WindowManager; +import android.widget.PopupMenu; import com.arellomobile.mvp.presenter.InjectPresenter; import com.google.android.exoplayer2.ExoPlayerFactory; @@ -18,15 +25,18 @@ import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; +import com.nynja.mobile.communicator.NynjaApp; import com.nynja.mobile.communicator.R; import com.nynja.mobile.communicator.data.models.nynjamodels.MessageModel; import com.nynja.mobile.communicator.mvp.presenters.VideoPlayPresenter; import com.nynja.mobile.communicator.mvp.view.VideoPlayView; import com.nynja.mobile.communicator.ui.base.BaseActivity; +import com.nynja.mobile.communicator.utils.PermissionHelper; import com.nynja.mobile.communicator.utils.video_player.widget.widget.media.AndroidMediaController; import butterknife.BindView; import butterknife.OnClick; +import timber.log.Timber; /** * Created by dmitro.boiko on 14/08/2017. @@ -58,6 +68,7 @@ public class VideoPlayActivity extends BaseActivity implements VideoPlayView { requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_video_play); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); mPlayerView.setControllerShowTimeoutMs(HIDE_VIDEO_CONTROLS_TIME_IN_MS); if (getIntent() != null && getIntent().hasExtra(BUNDLE_VIDEO_NAME)) { @@ -111,6 +122,74 @@ public class VideoPlayActivity extends BaseActivity implements VideoPlayView { } } + @OnClick(R.id.a_viewer_image_btn_menu) + public void onClick(View v) { + PopupMenu popup = new PopupMenu(NynjaApp.getComponent().context(),findViewById(R.id.a_viewer_image_btn_menu)); + popup.getMenuInflater().inflate(R.menu.media_options, popup.getMenu()); + if(mMessageModel.isStarred) + { + popup.getMenu().findItem(R.id.star).setVisible(false); + popup.getMenu().findItem(R.id.unstar).setVisible(true); + + } + else + { + popup.getMenu().findItem(R.id.star).setVisible(true); + popup.getMenu().findItem(R.id.unstar).setVisible(false); + } + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + + switch(item.getItemId()) { + case R.id.star: + mVideoPlayPresenter.setMessageAsStarred(mMessageModel); + mMessageModel.isStarred = true; + return true; + case R.id.unstar: + mVideoPlayPresenter.setMessageAsUnStarred(mMessageModel); + mMessageModel.isStarred = false; + return true; + case R.id.share: + shareMessageContent(mMessageModel); + return true; + case R.id.save_to_camera: + mVideoPlayPresenter.saveToCamera(mMessageModel); + return true; + case R.id.forward: + mVideoPlayPresenter.returnWithResult(mMessageModel,"forward"); + return true; + case R.id.delete: + mVideoPlayPresenter.returnWithResult(mMessageModel,"delete"); + return true; + case R.id.reply: + mVideoPlayPresenter.returnWithResult(mMessageModel,"reply"); + return true; + } + + return true; + } + }); + + popup.getMenu().removeItem(0); + popup.show(); + } + + private void shareMessageContent(MessageModel message) { + if (this == null) return; + if (message != null) { + addDisposable(mRxPermissions.requestEachCombined(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .subscribe(permission -> { + if (permission.granted) { + mVideoPlayPresenter.shareMessageContent(message, this); + } else if (!permission.shouldShowRequestPermissionRationale) { + PermissionHelper.getInstance().showPermissionDialog(this, + mVideoPlayPresenter.getPermissionDialogListener(), Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + }, Timber::e)); + } + } + @Override protected void onStart() { initVideoPlayer(); diff --git a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java index d54726d1a41a0f97563dd5066f6559ea0a41d47d..07a2bde68f4c4b2c2af4c9a9777c4f9fb0254536 100644 --- a/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java +++ b/app/src/main/java/com/nynja/mobile/communicator/ui/fragments/chats/ChatFragment.java @@ -2051,11 +2051,14 @@ public class ChatFragment extends BaseChatFragment implements ChatMvpView, } } - private void forwardMessage(MessageModel message) { + @Override + public void forwardMessage(MessageModel message) { if (getActivity() != null) dismissBothKeyboards(); mPresenter.forwardMessage(message); } + + @Override public void checkAndDeleteOtherMessage(MessageModel item) { List itemsRes = new ArrayList<>(); @@ -2743,6 +2746,7 @@ public class ChatFragment extends BaseChatFragment implements ChatMvpView, }); mContextMenuPopup = contextMenuPopup; Timber.d("ContextMenuPopup will SHOW for message local ID: " + mContextMenuPopup.mMessage.localId); + contextMenuPopup.showAtLocation(mRootView, contextMenuItemType -> { MessageModel item = mAdapter.getItem(position); switch (contextMenuItemType) { @@ -3025,6 +3029,8 @@ public class ChatFragment extends BaseChatFragment implements ChatMvpView, } } + + @Override public void showRequestPermissionForCall(RejoinConferenceCallData rejoinData) { addDisposable(mRxPermissions.requestEachCombined(/*Manifest.permission.CAMERA, */Manifest.permission.RECORD_AUDIO) .subscribe(permissionVideo -> { diff --git a/app/src/main/res/drawable/ic_menu.xml b/app/src/main/res/drawable/ic_menu.xml new file mode 100644 index 0000000000000000000000000000000000000000..dc22c25d89bac8644246541dd99e64ac4db98006 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_image_viewer.xml b/app/src/main/res/layout/activity_image_viewer.xml index 092772a7b4b5cf1f2fe1919fa697770ecd86e648..acb788628b881fea44dbf8bb84064d77510a3438 100644 --- a/app/src/main/res/layout/activity_image_viewer.xml +++ b/app/src/main/res/layout/activity_image_viewer.xml @@ -11,6 +11,9 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/exo_player_control_view.xml b/app/src/main/res/layout/exo_player_control_view.xml index bf2217048c89fdcedd5752d306f537baafae639a..868773106c1a63eb12f5c0497bdfe147f0e6c25f 100644 --- a/app/src/main/res/layout/exo_player_control_view.xml +++ b/app/src/main/res/layout/exo_player_control_view.xml @@ -19,6 +19,20 @@ android:background="@drawable/ic_back" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9961a7a53b222dac359f187e426691d597fb8e6..4480ffeb25b99e239cdedfd591864334a58516ea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1349,4 +1349,13 @@ Choose call to pickup You can\'t call when you are talking + Star + Unstar + Reply + Forward + + Save to camera + + +