diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml index 23e483f50b..c905f83113 100644 --- a/vector/src/main/AndroidManifest.xml +++ b/vector/src/main/AndroidManifest.xml @@ -92,7 +92,6 @@ - - diff --git a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt index 17ec00952b..fde40f9195 100644 --- a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt +++ b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt @@ -51,9 +51,7 @@ import im.vector.app.features.invite.VectorInviteView import im.vector.app.features.link.LinkHandlerActivity import im.vector.app.features.login.LoginActivity import im.vector.app.features.media.BigImageViewerActivity -import im.vector.app.features.media.ImageMediaViewerActivity import im.vector.app.features.media.VectorAttachmentViewerActivity -import im.vector.app.features.media.VideoMediaViewerActivity import im.vector.app.features.navigation.Navigator import im.vector.app.features.permalink.PermalinkHandlerActivity import im.vector.app.features.pin.PinLocker @@ -125,10 +123,8 @@ interface ScreenComponent { fun inject(activity: MainActivity) fun inject(activity: RoomDirectoryActivity) fun inject(activity: BugReportActivity) - fun inject(activity: ImageMediaViewerActivity) fun inject(activity: FilteredRoomsActivity) fun inject(activity: CreateRoomActivity) - fun inject(activity: VideoMediaViewerActivity) fun inject(activity: CreateDirectRoomActivity) fun inject(activity: IncomingShareActivity) fun inject(activity: SoftLogoutActivity) diff --git a/vector/src/main/java/im/vector/app/features/media/ImageMediaViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/ImageMediaViewerActivity.kt deleted file mode 100644 index fa7f397b8f..0000000000 --- a/vector/src/main/java/im/vector/app/features/media/ImageMediaViewerActivity.kt +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.media - -import android.content.Context -import android.content.Intent -import android.graphics.drawable.Drawable -import android.os.Bundle -import android.view.MenuItem -import android.view.View -import android.view.ViewTreeObserver -import androidx.appcompat.widget.Toolbar -import androidx.core.net.toUri -import androidx.core.transition.addListener -import androidx.core.view.ViewCompat -import androidx.core.view.isInvisible -import androidx.core.view.isVisible -import androidx.transition.Transition -import com.bumptech.glide.load.DataSource -import com.bumptech.glide.load.engine.GlideException -import com.bumptech.glide.request.RequestListener -import com.bumptech.glide.request.target.Target -import com.github.piasy.biv.indicator.progresspie.ProgressPieIndicator -import com.github.piasy.biv.view.GlideImageViewFactory -import im.vector.app.R -import im.vector.app.core.di.ScreenComponent -import im.vector.app.core.glide.GlideApp -import im.vector.app.core.intent.getMimeTypeFromUri -import im.vector.app.core.platform.VectorBaseActivity -import im.vector.app.core.utils.shareMedia -import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.file.FileService -import kotlinx.android.synthetic.main.activity_image_media_viewer.* -import timber.log.Timber -import java.io.File -import javax.inject.Inject - -class ImageMediaViewerActivity : VectorBaseActivity() { - - @Inject lateinit var session: Session - @Inject lateinit var imageContentRenderer: ImageContentRenderer - - private lateinit var mediaData: ImageContentRenderer.Data - - override fun injectWith(injector: ScreenComponent) { - injector.inject(this) - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(im.vector.app.R.layout.activity_image_media_viewer) - - if (intent.hasExtra(EXTRA_MEDIA_DATA)) { - mediaData = intent.getParcelableExtra(EXTRA_MEDIA_DATA)!! - } else { - finish() - } - - intent.extras?.getString(EXTRA_SHARED_TRANSITION_NAME)?.let { - ViewCompat.setTransitionName(imageTransitionView, it) - } - - if (mediaData.url.isNullOrEmpty()) { - supportFinishAfterTransition() - return - } - - configureToolbar(imageMediaViewerToolbar, mediaData) - - if (isFirstCreation() && addTransitionListener()) { - // Encrypted image - imageTransitionView.isVisible = true - imageMediaViewerImageView.isVisible = false - encryptedImageView.isVisible = false - // Postpone transaction a bit until thumbnail is loaded - supportPostponeEnterTransition() - - // We are not passing the exact same image that in the - imageContentRenderer.renderFitTarget(mediaData, ImageContentRenderer.Mode.THUMBNAIL, imageTransitionView) { - // Proceed with transaction - scheduleStartPostponedTransition(imageTransitionView) - } - } else { - imageTransitionView.isVisible = false - - if (mediaData.elementToDecrypt != null) { - // Encrypted image - imageMediaViewerImageView.isVisible = false - encryptedImageView.isVisible = true - - GlideApp - .with(this) - .load(mediaData) - .dontAnimate() - .into(encryptedImageView) - } else { - // Clear image - imageMediaViewerImageView.isVisible = true - encryptedImageView.isVisible = false - - imageMediaViewerImageView.setImageViewFactory(GlideImageViewFactory()) - imageMediaViewerImageView.setProgressIndicator(ProgressPieIndicator()) - imageContentRenderer.render(mediaData, imageMediaViewerImageView) - } - } - } - - override fun getMenuRes() = R.menu.vector_media_viewer - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.mediaViewerShareAction -> { - onShareActionClicked() - return true - } - } - return super.onOptionsItemSelected(item) - } - - private fun onShareActionClicked() { - session.fileService().downloadFile( - downloadMode = FileService.DownloadMode.FOR_EXTERNAL_SHARE, - id = mediaData.eventId, - fileName = mediaData.filename, - mimeType = mediaData.mimeType, - url = mediaData.url, - elementToDecrypt = mediaData.elementToDecrypt, - callback = object : MatrixCallback { - override fun onSuccess(data: File) { - shareMedia(this@ImageMediaViewerActivity, data, getMimeTypeFromUri(this@ImageMediaViewerActivity, data.toUri())) - } - } - ) - } - - private fun configureToolbar(toolbar: Toolbar, mediaData: ImageContentRenderer.Data) { - setSupportActionBar(toolbar) - supportActionBar?.apply { - title = mediaData.filename - setHomeButtonEnabled(true) - setDisplayHomeAsUpEnabled(true) - } - } - - override fun onBackPressed() { - // show again for exit animation - imageTransitionView.isVisible = true - super.onBackPressed() - } - - private fun scheduleStartPostponedTransition(sharedElement: View) { - sharedElement.viewTreeObserver.addOnPreDrawListener( - object : ViewTreeObserver.OnPreDrawListener { - override fun onPreDraw(): Boolean { - sharedElement.viewTreeObserver.removeOnPreDrawListener(this) - supportStartPostponedEnterTransition() - return true - } - }) - } - - /** - * Try and add a [Transition.TransitionListener] to the entering shared element - * [Transition]. We do this so that we can load the full-size image after the transition - * has completed. - * - * @return true if we were successful in adding a listener to the enter transition - */ - private fun addTransitionListener(): Boolean { - val transition = window.sharedElementEnterTransition - - if (transition != null) { - // There is an entering shared element transition so add a listener to it - transition.addListener( - onEnd = { - if (mediaData.elementToDecrypt != null) { - // Encrypted image - GlideApp - .with(this) - .load(mediaData) - .dontAnimate() - .listener(object : RequestListener { - override fun onLoadFailed(e: GlideException?, - model: Any?, - target: Target?, - isFirstResource: Boolean): Boolean { - // TODO ? - Timber.e("TRANSITION onLoadFailed") - imageMediaViewerImageView.isVisible = false - encryptedImageView.isVisible = true - return false - } - - override fun onResourceReady(resource: Drawable?, - model: Any?, - target: Target?, - dataSource: DataSource?, - isFirstResource: Boolean): Boolean { - Timber.e("TRANSITION onResourceReady") - imageTransitionView.isInvisible = true - imageMediaViewerImageView.isVisible = false - encryptedImageView.isVisible = true - return false - } - }) - .into(encryptedImageView) - } else { - imageTransitionView.isInvisible = true - // Clear image - imageMediaViewerImageView.isVisible = true - encryptedImageView.isVisible = false - - imageMediaViewerImageView.setImageViewFactory(GlideImageViewFactory()) - imageMediaViewerImageView.setProgressIndicator(ProgressPieIndicator()) - imageContentRenderer.render(mediaData, imageMediaViewerImageView) - } - }, - onCancel = { - // Something to do? - } - ) - return true - } - - // If we reach here then we have not added a listener - return false - } - - companion object { - - private const val EXTRA_MEDIA_DATA = "EXTRA_MEDIA_DATA" - private const val EXTRA_SHARED_TRANSITION_NAME = "EXTRA_SHARED_TRANSITION_NAME" - - fun newIntent(context: Context, mediaData: ImageContentRenderer.Data, shareTransitionName: String?): Intent { - return Intent(context, ImageMediaViewerActivity::class.java).apply { - putExtra(EXTRA_MEDIA_DATA, mediaData) - putExtra(EXTRA_SHARED_TRANSITION_NAME, shareTransitionName) - } - } - } -} diff --git a/vector/src/main/java/im/vector/app/features/media/VideoMediaViewerActivity.kt b/vector/src/main/java/im/vector/app/features/media/VideoMediaViewerActivity.kt deleted file mode 100644 index 5bdda9b0be..0000000000 --- a/vector/src/main/java/im/vector/app/features/media/VideoMediaViewerActivity.kt +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2019 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.media - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.view.MenuItem -import androidx.appcompat.widget.Toolbar -import androidx.core.net.toUri -import im.vector.app.R -import im.vector.app.core.di.ScreenComponent -import im.vector.app.core.intent.getMimeTypeFromUri -import im.vector.app.core.platform.VectorBaseActivity -import im.vector.app.core.utils.shareMedia -import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.file.FileService -import kotlinx.android.synthetic.main.activity_video_media_viewer.* -import java.io.File -import javax.inject.Inject - -class VideoMediaViewerActivity : VectorBaseActivity() { - - @Inject lateinit var session: Session - @Inject lateinit var imageContentRenderer: ImageContentRenderer - @Inject lateinit var videoContentRenderer: VideoContentRenderer - - private lateinit var mediaData: VideoContentRenderer.Data - - override fun injectWith(injector: ScreenComponent) { - injector.inject(this) - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(im.vector.app.R.layout.activity_video_media_viewer) - - if (intent.hasExtra(EXTRA_MEDIA_DATA)) { - mediaData = intent.getParcelableExtra(EXTRA_MEDIA_DATA)!! - - configureToolbar(videoMediaViewerToolbar, mediaData) - imageContentRenderer.render(mediaData.thumbnailMediaData, ImageContentRenderer.Mode.FULL_SIZE, videoMediaViewerThumbnailView) - videoContentRenderer.render(mediaData, - videoMediaViewerThumbnailView, - videoMediaViewerLoading, - videoMediaViewerVideoView, - videoMediaViewerErrorView) - } else { - finish() - } - } - - override fun getMenuRes() = R.menu.vector_media_viewer - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.mediaViewerShareAction -> { - onShareActionClicked() - return true - } - } - return super.onOptionsItemSelected(item) - } - - private fun onShareActionClicked() { - session.fileService().downloadFile( - downloadMode = FileService.DownloadMode.FOR_EXTERNAL_SHARE, - id = mediaData.eventId, - fileName = mediaData.filename, - mimeType = mediaData.mimeType, - url = mediaData.url, - elementToDecrypt = mediaData.elementToDecrypt, - callback = object : MatrixCallback { - override fun onSuccess(data: File) { - shareMedia(this@VideoMediaViewerActivity, data, getMimeTypeFromUri(this@VideoMediaViewerActivity, data.toUri())) - } - } - ) - } - - private fun configureToolbar(toolbar: Toolbar, mediaData: VideoContentRenderer.Data) { - setSupportActionBar(toolbar) - supportActionBar?.apply { - title = mediaData.filename - setHomeButtonEnabled(true) - setDisplayHomeAsUpEnabled(true) - } - } - - companion object { - - private const val EXTRA_MEDIA_DATA = "EXTRA_MEDIA_DATA" - - fun newIntent(context: Context, mediaData: VideoContentRenderer.Data): Intent { - return Intent(context, VideoMediaViewerActivity::class.java).apply { - putExtra(EXTRA_MEDIA_DATA, mediaData) - } - } - } -} diff --git a/vector/src/main/res/layout/activity_image_media_viewer.xml b/vector/src/main/res/layout/activity_image_media_viewer.xml deleted file mode 100644 index cfcfa6702b..0000000000 --- a/vector/src/main/res/layout/activity_image_media_viewer.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/layout/activity_video_media_viewer.xml b/vector/src/main/res/layout/activity_video_media_viewer.xml deleted file mode 100644 index c68577bcd5..0000000000 --- a/vector/src/main/res/layout/activity_video_media_viewer.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file