Remove panorama support temporarily

The library used (https://github.com/googlevr/gvr-android-sdk) was not open source.
This commit is contained in:
Naveen 2024-01-02 00:48:38 +05:30
parent e30078b6d5
commit 2faae85d4d
No known key found for this signature in database
GPG key ID: 0E155DAD31671DA3
14 changed files with 25 additions and 684 deletions

View file

@ -26,7 +26,7 @@ Customize the look, feel, and functionality to match your style. From UI themes
**📷 UNIVERSAL FORMAT FREEDOM:**
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, panoramas, videos, and more we've got your memories covered, in any format you choose. No restrictions, just limitless possibilities.
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, videos, and more we've got your memories covered, in any format you choose. No restrictions, just limitless possibilities.
**✨ MATERIAL DESIGN WITH DYNAMIC THEMES:**

View file

@ -99,8 +99,6 @@ dependencies {
implementation(libs.android.gif.drawable)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.media3.exoplayer)
implementation(libs.sdk.panowidget)
implementation(libs.sdk.videowidget)
implementation(libs.sanselan)
implementation(libs.imagefilters)
implementation(libs.androidsvg.aar)

View file

@ -31,8 +31,6 @@
android:name="android.permission.CAMERA"
tools:node="remove" />
<uses-sdk tools:overrideLibrary="com.google.vr.widgets.common, com.google.vr.sdk.widgets.pano" />
<queries>
<package android:name="org.fossify.gallery.debug" />
<package android:name="org.fossify.gallery" />
@ -161,18 +159,6 @@
android:parentActivityName=".activities.MediaActivity"
android:theme="@style/TranslucentTheme" />
<activity
android:name=".activities.PanoramaPhotoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:theme="@style/FullScreenTheme" />
<activity
android:name=".activities.PanoramaVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:theme="@style/FullScreenTheme" />
<activity
android:name=".activities.IncludedFoldersActivity"
android:configChanges="orientation"

View file

@ -1,197 +0,0 @@
package org.fossify.gallery.activities
import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.view.Window
import android.view.WindowInsetsController
import android.widget.RelativeLayout
import com.google.vr.sdk.widgets.pano.VrPanoramaEventListener
import com.google.vr.sdk.widgets.pano.VrPanoramaView
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.gallery.R
import org.fossify.gallery.databinding.ActivityPanoramaPhotoBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.hideSystemUI
import org.fossify.gallery.extensions.showSystemUI
import org.fossify.gallery.helpers.PATH
open class PanoramaPhotoActivity : SimpleActivity() {
private val CARDBOARD_DISPLAY_MODE = 3
private var isFullscreen = false
private var isExploreEnabled = true
private var isRendering = false
private val binding by viewBinding(ActivityPanoramaPhotoBinding::inflate)
public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false
requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
setContentView(binding.root)
checkNotchSupport()
setupButtonMargins()
binding.cardboard.setOnClickListener {
binding.panoramaView.displayMode = CARDBOARD_DISPLAY_MODE
}
binding.explore.setOnClickListener {
isExploreEnabled = !isExploreEnabled
binding.panoramaView.setPureTouchTracking(isExploreEnabled)
binding.explore.setImageResource(if (isExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
}
checkIntent()
if (isRPlus()) {
window.insetsController?.setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
}
}
override fun onResume() {
super.onResume()
binding.panoramaView.resumeRendering()
isRendering = true
if (config.blackBackground) {
updateStatusbarColor(Color.BLACK)
}
window.statusBarColor = resources.getColor(R.color.circle_black_background)
if (config.maxBrightness) {
val attributes = window.attributes
attributes.screenBrightness = 1f
window.attributes = attributes
}
}
override fun onPause() {
super.onPause()
binding.panoramaView.pauseRendering()
isRendering = false
}
override fun onDestroy() {
super.onDestroy()
if (isRendering) {
binding.panoramaView.shutdown()
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setupButtonMargins()
}
private fun checkIntent() {
val path = intent.getStringExtra(PATH)
if (path == null) {
toast(R.string.invalid_image_path)
finish()
return
}
intent.removeExtra(PATH)
try {
val options = VrPanoramaView.Options()
options.inputType = VrPanoramaView.Options.TYPE_MONO
ensureBackgroundThread {
val bitmap = getBitmapToLoad(path)
runOnUiThread {
binding.panoramaView.apply {
beVisible()
loadImageFromBitmap(bitmap, options)
setFlingingEnabled(true)
setPureTouchTracking(true)
// add custom buttons so we can position them and toggle visibility as desired
setFullscreenButtonEnabled(false)
setInfoButtonEnabled(false)
setTransitionViewEnabled(false)
setStereoModeButtonEnabled(false)
setOnClickListener {
handleClick()
}
setEventListener(object : VrPanoramaEventListener() {
override fun onClick() {
handleClick()
}
})
}
}
}
} catch (e: Exception) {
showErrorToast(e)
}
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
toggleButtonVisibility()
}
}
private fun getBitmapToLoad(path: String): Bitmap? {
val options = BitmapFactory.Options()
options.inSampleSize = 1
var bitmap: Bitmap? = null
for (i in 0..10) {
try {
bitmap = if (path.startsWith("content://")) {
val inputStream = contentResolver.openInputStream(Uri.parse(path))
BitmapFactory.decodeStream(inputStream)
} else {
BitmapFactory.decodeFile(path, options)
}
break
} catch (e: OutOfMemoryError) {
options.inSampleSize *= 2
}
}
return bitmap
}
private fun setupButtonMargins() {
val navBarHeight = navigationBarHeight
(binding.cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
bottomMargin = navBarHeight
rightMargin = navigationBarWidth
}
(binding.explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = navigationBarHeight
binding.cardboard.onGlobalLayout {
binding.panoramaGradientBackground.layoutParams.height = navBarHeight + binding.cardboard.height
}
}
private fun toggleButtonVisibility() {
arrayOf(binding.cardboard, binding.explore, binding.panoramaGradientBackground).forEach {
it.animate().alpha(if (isFullscreen) 0f else 1f)
it.isClickable = !isFullscreen
}
}
private fun handleClick() {
isFullscreen = !isFullscreen
toggleButtonVisibility()
if (isFullscreen) {
hideSystemUI(false)
} else {
showSystemUI(false)
}
}
}

View file

@ -1,340 +0,0 @@
package org.fossify.gallery.activities
import android.content.res.Configuration
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.view.View
import android.view.Window
import android.view.WindowInsetsController
import android.view.WindowManager
import android.widget.RelativeLayout
import android.widget.SeekBar
import com.google.vr.sdk.widgets.video.VrVideoEventListener
import com.google.vr.sdk.widgets.video.VrVideoView
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.isRPlus
import org.fossify.gallery.R
import org.fossify.gallery.databinding.ActivityPanoramaVideoBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.hasNavBar
import org.fossify.gallery.extensions.hideSystemUI
import org.fossify.gallery.extensions.showSystemUI
import org.fossify.gallery.helpers.MIN_SKIP_LENGTH
import org.fossify.gallery.helpers.PATH
import java.io.File
open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener {
private val CARDBOARD_DISPLAY_MODE = 3
private var mIsFullscreen = false
private var mIsExploreEnabled = true
private var mIsRendering = false
private var mIsPlaying = false
private var mIsDragged = false
private var mPlayOnReady = false
private var mDuration = 0
private var mCurrTime = 0
private var mTimerHandler = Handler()
private val binding by viewBinding(ActivityPanoramaVideoBinding::inflate)
public override fun onCreate(savedInstanceState: Bundle?) {
useDynamicTheme = false
requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
setContentView(binding.root)
checkNotchSupport()
checkIntent()
if (isRPlus()) {
window.insetsController?.setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
}
}
override fun onResume() {
super.onResume()
binding.vrVideoView.resumeRendering()
mIsRendering = true
if (config.blackBackground) {
updateStatusbarColor(Color.BLACK)
}
window.statusBarColor = resources.getColor(R.color.circle_black_background)
if (config.maxBrightness) {
val attributes = window.attributes
attributes.screenBrightness = 1f
window.attributes = attributes
}
}
override fun onPause() {
super.onPause()
binding.vrVideoView.pauseRendering()
mIsRendering = false
}
override fun onDestroy() {
super.onDestroy()
if (mIsRendering) {
binding.vrVideoView.shutdown()
}
if (!isChangingConfigurations) {
mTimerHandler.removeCallbacksAndMessages(null)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setupButtons()
}
private fun checkIntent() {
val path = intent.getStringExtra(PATH)
if (path == null) {
toast(R.string.invalid_image_path)
finish()
return
}
setupButtons()
intent.removeExtra(PATH)
binding.bottomVideoTimeHolder.videoCurrTime.setOnClickListener { skip(false) }
binding.bottomVideoTimeHolder.videoDuration.setOnClickListener { skip(true) }
try {
val options = VrVideoView.Options()
options.inputType = VrVideoView.Options.TYPE_MONO
val uri = if (path.startsWith("content://")) {
Uri.parse(path)
} else {
Uri.fromFile(File(path))
}
binding.vrVideoView.apply {
loadVideo(uri, options)
pauseVideo()
setFlingingEnabled(true)
setPureTouchTracking(true)
// add custom buttons so we can position them and toggle visibility as desired
setFullscreenButtonEnabled(false)
setInfoButtonEnabled(false)
setTransitionViewEnabled(false)
setStereoModeButtonEnabled(false)
setOnClickListener {
handleClick()
}
setEventListener(object : VrVideoEventListener() {
override fun onClick() {
handleClick()
}
override fun onLoadSuccess() {
if (mDuration == 0) {
setupDuration(duration)
setupTimer()
}
if (mPlayOnReady || config.autoplayVideos) {
mPlayOnReady = false
mIsPlaying = true
resumeVideo()
} else {
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_play_outline_vector)
}
binding.bottomVideoTimeHolder.videoTogglePlayPause.beVisible()
}
override fun onCompletion() {
videoCompleted()
}
})
}
binding.bottomVideoTimeHolder.videoTogglePlayPause.setOnClickListener {
togglePlayPause()
}
} catch (e: Exception) {
showErrorToast(e)
}
window.decorView.setOnSystemUiVisibilityChangeListener { visibility ->
mIsFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0
toggleButtonVisibility()
}
}
private fun setupDuration(duration: Long) {
mDuration = (duration / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.max = mDuration
binding.bottomVideoTimeHolder.videoDuration.text = mDuration.getFormattedDuration()
setVideoProgress(0)
}
private fun setupTimer() {
runOnUiThread(object : Runnable {
override fun run() {
if (mIsPlaying && !mIsDragged) {
mCurrTime = (binding.vrVideoView.currentPosition / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.progress = mCurrTime
binding.bottomVideoTimeHolder.videoCurrTime.text = mCurrTime.getFormattedDuration()
}
mTimerHandler.postDelayed(this, 1000)
}
})
}
private fun togglePlayPause() {
mIsPlaying = !mIsPlaying
if (mIsPlaying) {
resumeVideo()
} else {
pauseVideo()
}
}
private fun resumeVideo() {
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_pause_outline_vector)
if (mCurrTime == mDuration) {
setVideoProgress(0)
mPlayOnReady = true
return
}
binding.vrVideoView.playVideo()
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private fun pauseVideo() {
binding.vrVideoView.pauseVideo()
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_play_outline_vector)
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private fun setVideoProgress(seconds: Int) {
binding.vrVideoView.seekTo(seconds * 1000L)
binding.bottomVideoTimeHolder.videoSeekbar.progress = seconds
mCurrTime = seconds
binding.bottomVideoTimeHolder.videoCurrTime.text = seconds.getFormattedDuration()
}
private fun videoCompleted() {
mIsPlaying = false
mCurrTime = (binding.vrVideoView.duration / 1000).toInt()
binding.bottomVideoTimeHolder.videoSeekbar.progress = binding.bottomVideoTimeHolder.videoSeekbar.max
binding.bottomVideoTimeHolder.videoCurrTime.text = mDuration.getFormattedDuration()
pauseVideo()
}
private fun setupButtons() {
var right = 0
var bottom = 0
if (hasNavBar()) {
if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
bottom += navigationBarHeight
} else {
right += navigationBarWidth
bottom += navigationBarHeight
}
}
binding.bottomVideoTimeHolder.root.setPadding(0, 0, right, bottom)
binding.bottomVideoTimeHolder.root.background = resources.getDrawable(R.drawable.gradient_background)
binding.bottomVideoTimeHolder.root.onGlobalLayout {
val newBottomMargin = binding.bottomVideoTimeHolder.root.height - resources.getDimension(R.dimen.video_player_play_pause_size)
.toInt() - resources.getDimension(org.fossify.commons.R.dimen.activity_margin).toInt()
(binding.explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = newBottomMargin
(binding.cardboard.layoutParams as RelativeLayout.LayoutParams).apply {
bottomMargin = newBottomMargin
rightMargin = navigationBarWidth
}
binding.explore.requestLayout()
}
binding.bottomVideoTimeHolder.videoTogglePlayPause.setImageResource(org.fossify.commons.R.drawable.ic_play_outline_vector)
binding.cardboard.setOnClickListener {
binding.vrVideoView.displayMode = CARDBOARD_DISPLAY_MODE
}
binding.explore.setOnClickListener {
mIsExploreEnabled = !mIsExploreEnabled
binding.vrVideoView.setPureTouchTracking(mIsExploreEnabled)
binding.explore.setImageResource(if (mIsExploreEnabled) R.drawable.ic_explore_vector else R.drawable.ic_explore_off_vector)
}
}
private fun toggleButtonVisibility() {
val newAlpha = if (mIsFullscreen) 0f else 1f
arrayOf(binding.cardboard, binding.explore).forEach {
it.animate().alpha(newAlpha)
}
arrayOf(
binding.cardboard,
binding.explore,
binding.bottomVideoTimeHolder.videoTogglePlayPause,
binding.bottomVideoTimeHolder.videoCurrTime,
binding.bottomVideoTimeHolder.videoDuration
).forEach {
it.isClickable = !mIsFullscreen
}
binding.bottomVideoTimeHolder.videoSeekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this)
binding.bottomVideoTimeHolder.videoTimeHolder.animate().alpha(newAlpha).start()
}
private fun handleClick() {
mIsFullscreen = !mIsFullscreen
toggleButtonVisibility()
if (mIsFullscreen) {
hideSystemUI(false)
} else {
showSystemUI(false)
}
}
private fun skip(forward: Boolean) {
if (forward && mCurrTime == mDuration) {
return
}
val curr = binding.vrVideoView.currentPosition
val twoPercents = Math.max((binding.vrVideoView.duration / 50).toInt(), MIN_SKIP_LENGTH)
val newProgress = if (forward) curr + twoPercents else curr - twoPercents
val roundProgress = Math.round(newProgress / 1000f)
val limitedProgress = Math.max(Math.min(binding.vrVideoView.duration.toInt(), roundProgress), 0)
setVideoProgress(limitedProgress)
if (!mIsPlaying) {
togglePlayPause()
}
}
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) {
setVideoProgress(progress)
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
binding.vrVideoView.pauseVideo()
mIsDragged = true
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
mIsPlaying = true
resumeVideo()
mIsDragged = false
}
}

View file

@ -23,7 +23,6 @@ import org.fossify.gallery.fragments.ViewPagerFragment
import org.fossify.gallery.helpers.*
import org.fossify.gallery.models.Medium
import java.io.File
import java.io.FileInputStream
open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentListener {
private var mMedium: Medium? = null
@ -258,26 +257,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
return
}
var isPanorama = false
val realPath = intent?.extras?.getString(REAL_FILE_PATH) ?: ""
try {
if (realPath.isNotEmpty()) {
val fis = FileInputStream(File(realPath))
parseFileChannel(realPath, fis.channel, 0, 0, 0) {
isPanorama = true
}
}
} catch (ignored: Exception) {
} catch (ignored: OutOfMemoryError) {
}
hideKeyboard()
if (isPanorama) {
Intent(applicationContext, PanoramaVideoActivity::class.java).apply {
putExtra(PATH, realPath)
startActivity(this)
}
} else {
val mimeType = getUriMimeType(mUri.toString(), newUri)
Intent(applicationContext, VideoPlayerActivity::class.java).apply {
setDataAndType(newUri, mimeType)
@ -288,7 +268,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList
startActivity(this)
}
}
finish()
}

View file

@ -91,7 +91,7 @@ fun SimpleActivity.launchSettings() {
fun SimpleActivity.launchAbout() {
val licenses = LICENSE_GLIDE or LICENSE_CROPPER or LICENSE_RTL or LICENSE_SUBSAMPLING or LICENSE_PATTERN or LICENSE_REPRINT or LICENSE_GIF_DRAWABLE or
LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_PANORAMA_VIEW or LICENSE_SANSELAN or LICENSE_FILTERS or LICENSE_GESTURE_VIEWS or LICENSE_APNG
LICENSE_PICASSO or LICENSE_EXOPLAYER or LICENSE_SANSELAN or LICENSE_FILTERS or LICENSE_GESTURE_VIEWS or LICENSE_APNG
val faqItems = arrayListOf(
FAQItem(R.string.faq_3_title, R.string.faq_3_text),

View file

@ -1,6 +1,5 @@
package org.fossify.gallery.fragments
import android.content.Intent
import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.BitmapFactory
@ -48,7 +47,6 @@ import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isRPlus
import org.fossify.gallery.R
import org.fossify.gallery.activities.PanoramaPhotoActivity
import org.fossify.gallery.activities.PhotoActivity
import org.fossify.gallery.activities.PhotoVideoActivity
import org.fossify.gallery.activities.ViewPagerActivity
@ -212,9 +210,10 @@ class PhotoFragment : ViewPagerFragment() {
mWasInit = true
updateInstantSwitchWidths()
ensureBackgroundThread {
checkIfPanorama()
}
// TODO: Implement panorama using a FOSS library
// ensureBackgroundThread {
// checkIfPanorama()
// }
return mView
}
@ -517,7 +516,8 @@ class PhotoFragment : ViewPagerFragment() {
if (mMedium.path != mOriginalPath) {
mMedium.path = mOriginalPath
loadImage()
checkIfPanorama()
// TODO: Implement panorama using a FOSS library
// checkIfPanorama()
}
}
})
@ -642,10 +642,7 @@ class PhotoFragment : ViewPagerFragment() {
private fun getFilePathToShow() = if (mMedium.isPortrait()) mCurrentPortraitPhotoPath else getPathToLoad(mMedium)
private fun openPanorama() {
Intent(context, PanoramaPhotoActivity::class.java).apply {
putExtra(PATH, mMedium.path)
startActivity(this)
}
TODO("Panorama is not yet implemented.")
}
private fun scheduleZoomableView() {

View file

@ -1,6 +1,5 @@
package org.fossify.gallery.fragments
import android.content.Intent
import android.content.res.Configuration
import android.graphics.Point
import android.graphics.SurfaceTexture
@ -28,13 +27,15 @@ import com.bumptech.glide.Glide
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.gallery.R
import org.fossify.gallery.activities.PanoramaVideoActivity
import org.fossify.gallery.activities.VideoActivity
import org.fossify.gallery.databinding.PagerVideoItemBinding
import org.fossify.gallery.extensions.config
import org.fossify.gallery.extensions.hasNavBar
import org.fossify.gallery.extensions.parseFileChannel
import org.fossify.gallery.helpers.*
import org.fossify.gallery.helpers.Config
import org.fossify.gallery.helpers.FAST_FORWARD_VIDEO_MS
import org.fossify.gallery.helpers.MEDIUM
import org.fossify.gallery.helpers.SHOULD_INIT_FRAGMENT
import org.fossify.gallery.models.Medium
import org.fossify.gallery.views.MediaSideScroll
import java.io.File
@ -176,7 +177,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
mIsFullscreen = activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
initTimeHolder()
checkIfPanorama()
// checkIfPanorama() TODO: Implement panorama using a FOSS library
ensureBackgroundThread {
activity.getVideoResolution(mMedium.path)?.apply {
@ -502,10 +503,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
}
private fun openPanorama() {
Intent(context, PanoramaVideoActivity::class.java).apply {
putExtra(PATH, mMedium.path)
startActivity(this)
}
TODO("Panorama is not yet implemented.")
}
override fun fullscreenToggled(isFullscreen: Boolean) {

View file

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/panorama_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/md_grey_black">
<com.google.vr.sdk.widgets.pano.VrPanoramaView
android:id="@+id/panorama_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
<ImageView
android:id="@+id/panorama_gradient_background"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/gradient_background"
android:contentDescription="@null"/>
<ImageView
android:id="@+id/cardboard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_cardboard_vector"/>
<ImageView
android:id="@+id/explore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_explore_vector"/>
</RelativeLayout>

View file

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vr_video_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/md_grey_black">
<com.google.vr.sdk.widgets.video.VrVideoView
android:id="@+id/vr_video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include
android:id="@+id/bottom_video_time_holder"
layout="@layout/bottom_video_time_holder"/>
<ImageView
android:id="@+id/explore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_explore_vector"/>
<ImageView
android:id="@+id/cardboard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:padding="@dimen/activity_margin"
android:src="@drawable/ic_cardboard_vector"/>
</RelativeLayout>

View file

@ -16,7 +16,7 @@ Breathe easy, accidents happen! Fossify Gallery's built-in recycle bin lets you
Customize the look, feel, and functionality to match your style. From UI themes to function buttons, Fossify Gallery gives you the creative freedom you crave.
📷 UNIVERSAL FORMAT FREEDOM:
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, panoramas, videos, and more we've got your memories covered, in any format you choose. No restrictions, just limitless possibilities.
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, videos, and more we've got your memories covered, in any format you choose. No restrictions, just limitless possibilities.
✨ MATERIAL DESIGN WITH DYNAMIC THEMES:
Experience the beauty of intuitive material design with dynamic themes. Want more? Dive into custom themes and make your gallery truly unique.

View file

@ -16,7 +16,7 @@ Spokojnie, wypadki się zdarzają! Wbudowany kosz w Fossify Gallery pozwala odzy
Dostosuj wygląd, działanie i funkcjonalność do swojego stylu. Od motywów interfejsu użytkownika po przyciski akcji, Fossify Gallery daje Ci twórczą swobodę, której pragniesz.
📷 OBSŁUGA POWSZECHNYCH FORMATÓW:
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, zdjęcia panoramiczne, wideo i wiele więcej — obsłużymy Twoje wspomnienia w dowolnym, wybranym przez Ciebie formacie. Bez ograniczeń, po prostu bez limitu możliwości.
JPEG, PNG, MP4, MKV, RAW, SVG, GIF, wideo i wiele więcej — obsłużymy Twoje wspomnienia w dowolnym, wybranym przez Ciebie formacie. Bez ograniczeń, po prostu bez limitu możliwości.
✨ MATERIAL DESIGN Z DYNAMICZNYMI MOTYWAMI:
Doświadcz piękna intuicyjnego Material Design z dynamicznymi motywami. Chcesz więcej? Zanurz się w niestandardowych motywach i spraw, aby Twoja galeria była naprawdę wyjątkowa.

View file

@ -25,8 +25,6 @@ gestureviews = "e706487a14"
androidsvgAar = "1.4"
imagefilters = "1.0.7"
sanselan = "0.97-incubator"
sdkVideowidget = "1.180.0"
sdkPanowidget = "1.180.0"
media3Exoplayer = "1.1.0"
okhttp = "4.9.0"
okio = "3.0.0"
@ -65,8 +63,6 @@ imagefilters = { module = "info.androidhive:imagefilters", version.ref = "imagef
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
sanselan = { module = "org.apache.sanselan:sanselan", version.ref = "sanselan" }
sdk-videowidget = { module = "com.google.vr:sdk-videowidget", version.ref = "sdkVideowidget" }
sdk-panowidget = { module = "com.google.vr:sdk-panowidget", version.ref = "sdkPanowidget" }
apng = { module = "com.github.penfeizhou.android.animation:apng", version.ref = "apng" }
awebp = { module = "com.github.penfeizhou.android.animation:awebp", version.ref = "awebp" }
glide-compiler = { module = "com.github.bumptech.glide:ksp", version.ref = "glideCompiler" }