Skip to content
Snippets Groups Projects
Commit 348a964f authored by Taras's avatar Taras
Browse files

Merge branch 'feature/hide_gallery' into develop

parents 0f129b66 649ee43e
No related branches found
No related tags found
No related merge requests found
Showing
with 14 additions and 250 deletions
......@@ -114,7 +114,6 @@ android {
dependencies {
implementation(project(":core"))
implementation(project(":auth"))
implementation(project(":gallery"))
implementation(project(":settings"))
// Emoji
......
......@@ -53,25 +53,11 @@
<data android:pathPrefix="/room" />
<data android:pathPrefix="/profile" />
<data android:pathPrefix="/group" />
<data android:pathPrefix="/gallery" />
<data android:pathPrefix="/timeline" />
</intent-filter>
</activity>
<activity
android:name=".gallery.feature.share.UploadToGalleryActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter android:label="@string/gallery">
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
<data android:mimeType="video/*" />
</intent-filter>
</activity>
<activity
android:name=".feature.share.circle.ShareWithCircleActivity"
android:exported="true"
......@@ -119,11 +105,6 @@
android:resource="@xml/provider_paths" />
</provider>
<service
android:name=".gallery.feature.backup.service.MediaBackupService"
android:enabled="true"
android:exported="false" />
<service
android:name=".core.feature.notifications.CirclesSyncAndroidService"
android:exported="false"
......
......@@ -31,12 +31,10 @@ import org.futo.circles.core.provider.MatrixSessionProvider
import org.futo.circles.core.utils.getTimelineRoomFor
import org.futo.circles.core.view.LoadingDialog
import org.futo.circles.databinding.FragmentBottomNavigationBinding
import org.futo.circles.gallery.feature.backup.service.MediaBackupServiceManager
import org.matrix.android.sdk.api.session.getRoomSummary
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.sync.SyncState
import javax.inject.Inject
@AndroidEntryPoint
......@@ -52,9 +50,6 @@ class HomeFragment :
private val validateLoadingDialog by lazy { LoadingDialog(requireContext()) }
private val syncLoadingDialog by lazy { LoadingDialog(requireContext()) }
@Inject
lateinit var mediaBackupServiceManager: MediaBackupServiceManager
private val roomIdParam = "roomId"
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
......@@ -77,11 +72,6 @@ class HomeFragment :
handleOpenFromShareRoomUrl()
}
override fun onStop() {
super.onStop()
mediaBackupServiceManager.unbindMediaService(requireContext())
}
private fun handleOpenFromNotification() {
val roomId = activity?.intent?.getStringExtra(roomIdParam) ?: return
val summary = MatrixSessionProvider.currentSession?.getRoomSummary(roomId) ?: return
......@@ -131,9 +121,6 @@ class HomeFragment :
}
private fun setupObservers() {
viewModel.mediaBackupSettingsLiveData?.observeData(this) {
mediaBackupServiceManager.bindMediaServiceIfNeeded(requireContext(), it)
}
viewModel.validateWorkspaceResultLiveData.observeResponse(this,
error = { WorkspaceDialogFragment().show(childFragmentManager, "workspace") },
onRequestInvoked = { validateLoadingDialog.dismiss() })
......@@ -167,7 +154,6 @@ class HomeFragment :
R.id.circlesFragment,
R.id.peopleFragment,
R.id.groupsFragment,
org.futo.circles.gallery.R.id.photosFragment
)
)
binding.toolbar.setupWithNavController(navController, appBarConfiguration)
......
......@@ -16,7 +16,6 @@ import org.futo.circles.core.model.LoadingData
import org.futo.circles.core.provider.MatrixSessionProvider
import org.futo.circles.core.utils.LauncherActivityUtils
import org.futo.circles.core.utils.getJoinedRoomById
import org.futo.circles.gallery.feature.backup.RoomAccountDataSource
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import javax.inject.Inject
......@@ -26,13 +25,11 @@ class HomeViewModel @Inject constructor(
private val pushersManager: PushersManager,
private val workspaceTasksProvider: WorkspaceTasksProvider,
private val workspaceDataSource: ConfigureWorkspaceDataSource,
roomAccountDataSource: RoomAccountDataSource,
shortcutsHandler: ShortcutsHandler
) : ViewModel() {
val validateWorkspaceLoadingLiveData = SingleEventLiveData<LoadingData>()
val validateWorkspaceResultLiveData = SingleEventLiveData<Response<Unit>>()
val mediaBackupSettingsLiveData = roomAccountDataSource.getMediaBackupSettingsLive()
val syncStateLiveData =
MatrixSessionProvider.getSessionOrThrow().syncService().getSyncStateLive()
......
......@@ -8,8 +8,8 @@ import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.navArgs
import dagger.hilt.android.AndroidEntryPoint
import org.futo.circles.core.extensions.setIsVisible
import org.futo.circles.core.base.fragment.TransparentBackgroundBottomSheetDialogFragment
import org.futo.circles.core.extensions.setIsVisible
import org.futo.circles.core.provider.PreferencesProvider
import org.futo.circles.databinding.BottomSheetPostMenuBinding
......@@ -66,12 +66,6 @@ class PostMenuBottomSheet : TransparentBackgroundBottomSheetDialogFragment() {
dismiss()
}
}
tvSaveToGallery.apply {
setIsVisible(viewModel.isMediaPost())
setOnClickListener {
navigator.navigateToSaveToGallery(args.roomId, args.eventId)
}
}
tvReport.apply {
setIsVisible(viewModel.isMyPost().not())
setOnClickListener {
......
......@@ -24,13 +24,6 @@ class PostMenuBottomSheetNavigator(private val fragment: PostMenuBottomSheet) {
.navigateSafe(PostMenuBottomSheetDirections.toPostInfo(roomId, eventId))
}
fun navigateToSaveToGallery(roomId: String, eventId: String) {
fragment.findNavController().navigateSafe(
PostMenuBottomSheetDirections.toSaveToGalleyDialogFragment(roomId, eventId)
)
}
fun navigateToReport(roomId: String, eventId: String) {
fragment.findNavController().navigateSafe(
PostMenuBottomSheetDirections.toReportDialogFragment(roomId, eventId)
......
......@@ -19,11 +19,11 @@ import org.futo.circles.core.extensions.onBackPressed
import org.futo.circles.core.extensions.setIsVisible
import org.futo.circles.core.extensions.showSuccess
import org.futo.circles.core.extensions.withConfirmation
import org.futo.circles.core.feature.media.FullScreenMediaFragment
import org.futo.circles.core.feature.share.ShareProvider
import org.futo.circles.core.model.RemoveImage
import org.futo.circles.databinding.DialogFragmentTimelineMediaPreviewBinding
import org.futo.circles.gallery.R
import org.futo.circles.gallery.feature.gallery.full_screen.media_item.FullScreenMediaFragment
import org.futo.circles.gallery.model.RemoveImage
@AndroidEntryPoint
class TimelineMediaPreviewDialogFragment :
......
package org.futo.circles.feature.timeline.save
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import org.futo.circles.core.extensions.onBG
import org.futo.circles.core.model.MediaContent
import org.futo.circles.core.model.PostContent
import org.futo.circles.core.model.SelectableRoomListItem
import org.futo.circles.core.feature.timeline.post.SendMessageDataSource
import org.futo.circles.core.utils.FileUtils
import javax.inject.Inject
class SavePostToGalleryDataSource @Inject constructor(
@ApplicationContext private val context: Context,
private val sendMessageDataSource: SendMessageDataSource
) {
suspend fun saveMediaToGalleries(
content: PostContent,
selectedGalleries: List<SelectableRoomListItem>
) {
val mediaContent = content as? MediaContent ?: return
onBG {
val uri =
FileUtils.downloadEncryptedFileToContentUri(context, mediaContent.mediaFileData)
uri?.let {
selectedGalleries.forEach {
sendMessageDataSource.sendMedia(
it.id, uri, null, null, mediaContent.getMediaType()
)
}
}
}
}
}
\ No newline at end of file
package org.futo.circles.feature.timeline.save
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import org.futo.circles.core.base.SingleEventLiveData
import org.futo.circles.core.extensions.Response
import org.futo.circles.core.extensions.launchBg
import org.futo.circles.core.model.SelectableRoomListItem
import org.futo.circles.core.feature.timeline.post.PostContentDataSource
import javax.inject.Inject
@HiltViewModel
class SavePostToGalleryViewModel @Inject constructor(
private val mediaPreviewDataSource: PostContentDataSource,
private val savePostToGalleryDataSource: SavePostToGalleryDataSource
) : ViewModel() {
val saveResultLiveData = SingleEventLiveData<Response<Unit>>()
fun saveToGallery(
selectedGalleries: List<SelectableRoomListItem>,
roomId: String,
eventId: String
) {
launchBg {
mediaPreviewDataSource.getPostContent(roomId, eventId)?.let { content ->
savePostToGalleryDataSource.saveMediaToGalleries(content, selectedGalleries)
}
saveResultLiveData.postValue(Response.Success(Unit))
}
}
}
\ No newline at end of file
package org.futo.circles.feature.timeline.save
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.navArgs
import dagger.hilt.android.AndroidEntryPoint
import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
import org.futo.circles.core.base.fragment.HasLoadingState
import org.futo.circles.core.extensions.observeResponse
import org.futo.circles.core.extensions.onBackPressed
import org.futo.circles.core.extensions.showSuccess
import org.futo.circles.core.feature.room.select.SelectRoomsListener
import org.futo.circles.core.model.SelectableRoomListItem
import org.futo.circles.databinding.DialogFragmentSavePostToGalleryBinding
import org.futo.circles.gallery.R
import org.futo.circles.gallery.feature.select.SelectGalleriesFragment
@AndroidEntryPoint
class SavePostToGalleyDialogFragment :
BaseFullscreenDialogFragment<DialogFragmentSavePostToGalleryBinding>(
DialogFragmentSavePostToGalleryBinding::inflate
), HasLoadingState, SelectRoomsListener {
override val fragment: Fragment = this
private val viewModel by viewModels<SavePostToGalleryViewModel>()
private val args: SavePostToGalleyDialogFragmentArgs by navArgs()
private val selectedGalleriesFragment by lazy { SelectGalleriesFragment() }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
addSelectGalleriesFragment()
setupViews()
setupObservers()
}
private fun addSelectGalleriesFragment() {
childFragmentManager.beginTransaction()
.replace(R.id.lContainer, selectedGalleriesFragment)
.commitAllowingStateLoss()
}
private fun setupViews() {
with(binding) {
btnSave.setOnClickListener {
viewModel.saveToGallery(
selectedGalleriesFragment.getSelectedRooms(), args.roomId,
args.eventId
)
startLoading(btnSave)
}
}
}
private fun setupObservers() {
viewModel.saveResultLiveData.observeResponse(this,
success = {
showSuccess(getString(R.string.saved))
onBackPressed()
}
)
}
override fun onRoomsSelected(rooms: List<SelectableRoomListItem>) {
binding.btnSave.isEnabled = rooms.isNotEmpty()
}
}
\ No newline at end of file
......@@ -45,13 +45,6 @@
app:optionIcon="@drawable/ic_download"
app:optionName="@string/save_to_device" />
<org.futo.circles.core.view.SettingsMenuItemView
android:id="@+id/tvSaveToGallery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_cloud_download"
app:optionName="@string/save_to_gallery" />
<org.futo.circles.core.view.SettingsMenuItemView
android:id="@+id/tvEditPoll"
android:layout_width="match_parent"
......
......@@ -16,11 +16,6 @@
android:icon="@drawable/ic_round_people"
android:title="@string/groups" />
<item
android:id="@+id/photos_nav_graph"
android:icon="@drawable/ic_round_photo_library"
android:title="@string/photos" />
<item
android:id="@+id/settings_nav_graph"
android:icon="@drawable/ic_settings"
......
......@@ -8,8 +8,6 @@
<include app:graph="@navigation/circles_nav_graph" />
<include app:graph="@navigation/photos_nav_graph" />
<include app:graph="@navigation/people_nav_graph" />
<include app:graph="@navigation/settings_nav_graph" />
......
......@@ -276,23 +276,6 @@
<include app:graph="@navigation/user_nav_graph" />
<dialog
android:id="@+id/saveToGalleyDialogFragment"
android:name="org.futo.circles.feature.timeline.save.SavePostToGalleyDialogFragment"
tools:layout="@layout/dialog_fragment_save_post_to_gallery">
<argument
android:name="roomId"
app:argType="string"
app:nullable="false" />
<argument
android:name="eventId"
app:argType="string"
app:nullable="false" />
</dialog>
<dialog
android:id="@+id/mediaPreviewDialogFragment"
android:name="org.futo.circles.feature.timeline.preview.TimelineMediaPreviewDialogFragment"
......@@ -326,23 +309,6 @@
app:argType="string"
app:nullable="false" />
<action
android:id="@+id/to_saveToGalleyDialogFragment"
app:destination="@id/saveToGalleyDialogFragment"
app:popUpTo="@+id/postMenuBottomSheet"
app:popUpToInclusive="true">
<argument
android:name="roomId"
app:argType="string"
app:nullable="false" />
<argument
android:name="eventId"
app:argType="string"
app:nullable="false" />
</action>
<action
android:id="@+id/to_postInfo"
......
......@@ -55,7 +55,6 @@
<string name="accept_invite">Accept invite</string>
<string name="do_you_want_to_open_this_url">Do you want to open this url?</string>
<string name="save_to_device">Save to device</string>
<string name="save_to_gallery">Save to gallery</string>
<string name="notifications">Notifications</string>
<string name="share_with_group">Share with a group</string>
<string name="share_with_circle">Share with a circle</string>
......
......@@ -25,7 +25,7 @@ class SetupProfileFragment :
override val fragment: Fragment = this
private val viewModel by viewModels<SetupProfileViewModel>()
private val mediaPickerHelper = MediaPickerHelper(this, isGalleryAvailable = false)
private val mediaPickerHelper = MediaPickerHelper(this)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
......
......@@ -58,7 +58,7 @@ android {
}
dependencies {
api("androidx.appcompat:appcompat:1.6.1")
api("androidx.appcompat:appcompat:1.7.0")
api("com.google.android.material:material:1.12.0")
api("androidx.recyclerview:recyclerview:1.3.2")
api("androidx.autofill:autofill:1.1.0")
......@@ -125,6 +125,9 @@ dependencies {
api("androidx.media3:media3-exoplayer:$exoplayerVersion")
api("androidx.media3:media3-ui:$exoplayerVersion")
// Image zoom
implementation("com.jsibbold:zoomage:1.3.1")
// profile placeholder
implementation("com.github.WycliffeAssociates:jdenticon-kotlin:1.1")
implementation("com.caverock:androidsvg-aar:1.4")
......
package org.futo.circles.gallery.feature.gallery.full_screen.media_item
package org.futo.circles.core.feature.media
import android.os.Bundle
import android.view.View
......@@ -9,14 +9,15 @@ import androidx.media3.common.Player
import androidx.media3.exoplayer.ExoPlayer
import dagger.hilt.android.AndroidEntryPoint
import org.futo.circles.core.base.fragment.BaseBindingFragment
import org.futo.circles.core.databinding.FragmentFullScreenMediaBinding
import org.futo.circles.core.extensions.gone
import org.futo.circles.core.extensions.loadEncryptedIntoWithAspect
import org.futo.circles.core.extensions.observeData
import org.futo.circles.core.extensions.setIsVisible
import org.futo.circles.gallery.databinding.FragmentFullScreenMediaBinding
@AndroidEntryPoint
class FullScreenMediaFragment : BaseBindingFragment<FragmentFullScreenMediaBinding>(FragmentFullScreenMediaBinding::inflate) {
class FullScreenMediaFragment :
BaseBindingFragment<FragmentFullScreenMediaBinding>(FragmentFullScreenMediaBinding::inflate) {
private val viewModel by viewModels<FullScreenMediaViewModel>()
......
package org.futo.circles.gallery.feature.gallery.full_screen.media_item
package org.futo.circles.core.feature.media
import android.content.Context
import android.net.Uri
......
......@@ -8,7 +8,7 @@ import org.futo.circles.core.databinding.DialogPickImageBinding
import org.futo.circles.core.extensions.setIsVisible
enum class PickImageMethod { Photo, Video, Gallery, Device }
enum class PickImageMethod { Photo, Video, Device }
interface PickMediaDialogListener {
fun onPickMethodSelected(method: PickImageMethod)
......@@ -17,7 +17,6 @@ interface PickMediaDialogListener {
class PickMediaDialog(
context: Context,
private val isVideoAvailable: Boolean,
private val isGalleryAvailable: Boolean,
private val listener: PickMediaDialogListener
) : AppCompatDialog(context) {
......@@ -32,11 +31,9 @@ class PickMediaDialog(
btnCancel.setOnClickListener { dismiss() }
tvVideo.setIsVisible(isVideoAvailable)
tvGallery.setIsVisible(isGalleryAvailable)
tvPhoto.setOnClickListener { onMethodSelected(PickImageMethod.Photo) }
tvVideo.setOnClickListener { onMethodSelected(PickImageMethod.Video) }
tvGallery.setOnClickListener { onMethodSelected(PickImageMethod.Gallery) }
tvDevice.setOnClickListener { onMethodSelected(PickImageMethod.Device) }
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment