diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/build.gradle | 10 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/activities/AboutActivity.kt | 1 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/activities/ImageActivity.kt | 128 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/views/DragFrame.kt | 37 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_image.xml | 76 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_image_textless.xml | 37 |
6 files changed, 157 insertions, 132 deletions
diff --git a/app/build.gradle b/app/build.gradle index b21162f9..dbc38c37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,7 +22,7 @@ apply from: '../spotless.gradle' group = APP_GROUP android { - compileSdkVersion kau.Versions.targetSdk + compileSdkVersion Versions.targetSdk buildToolsVersion kau.Versions.buildTools androidGitVersion { @@ -34,7 +34,7 @@ android { defaultConfig { applicationId "${project.APP_GROUP}.${project.APP_ID.toLowerCase(Locale.CANADA)}" minSdkVersion kau.Versions.minSdk - targetSdkVersion kau.Versions.targetSdk + targetSdkVersion Versions.targetSdk versionCode androidGitVersion.code() versionName androidGitVersion.name() multiDexEnabled true @@ -65,6 +65,10 @@ android { textOutput 'stdout' } + dataBinding { + enabled = true + } + def testKeystoreFile = file('../files/test.keystore') def testPropFile = file('../files/test.properties') def withTestSigning = testKeystoreFile.exists() && testPropFile.exists() @@ -295,8 +299,6 @@ dependencies { implementation "com.davemorrissey.labs:subsampling-scale-image-view:${Versions.scaleImageView}" - implementation "com.sothree.slidinguppanel:library:${Versions.slidingPanel}" - implementation "androidx.room:room-ktx:${Versions.room}" implementation "androidx.room:room-runtime:${Versions.room}" kapt "androidx.room:room-compiler:${Versions.room}" diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/AboutActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/AboutActivity.kt index 56125303..4461be71 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/activities/AboutActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/AboutActivity.kt @@ -68,7 +68,6 @@ class AboutActivity : AboutActivityBase(null, { val include = arrayOf( "AboutLibraries", "AndroidIconics", - "androidslidinguppanel", "dbflow", "fastadapter", "glide", diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/ImageActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/ImageActivity.kt index c7d31032..5cab957a 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/activities/ImageActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/ImageActivity.kt @@ -24,6 +24,7 @@ import android.os.Bundle import android.os.Environment import android.view.View import androidx.customview.widget.ViewDragHelper +import androidx.databinding.DataBindingUtil import ca.allanwang.kau.internal.KauBaseActivity import ca.allanwang.kau.logging.KauLoggerExtension import ca.allanwang.kau.mediapicker.scanMedia @@ -33,6 +34,7 @@ import ca.allanwang.kau.utils.adjustAlpha import ca.allanwang.kau.utils.colorToForeground import ca.allanwang.kau.utils.copyFromInputStream import ca.allanwang.kau.utils.fadeOut +import ca.allanwang.kau.utils.gone import ca.allanwang.kau.utils.isHidden import ca.allanwang.kau.utils.isVisible import ca.allanwang.kau.utils.materialDialog @@ -43,10 +45,12 @@ import ca.allanwang.kau.utils.withAlpha import ca.allanwang.kau.utils.withMinAlpha import com.davemorrissey.labs.subscaleview.ImageSource import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView +import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.floatingactionbutton.FloatingActionButton import com.mikepenz.google_material_typeface_library.GoogleMaterial import com.mikepenz.iconics.typeface.IIcon import com.pitchedapps.frost.R +import com.pitchedapps.frost.databinding.ActivityImageBinding import com.pitchedapps.frost.facebook.FB_IMAGE_ID_MATCHER import com.pitchedapps.frost.facebook.get import com.pitchedapps.frost.facebook.requests.call @@ -63,8 +67,6 @@ import com.pitchedapps.frost.utils.isIndirectImageUrl import com.pitchedapps.frost.utils.logFrostEvent import com.pitchedapps.frost.utils.sendFrostEmail import com.pitchedapps.frost.utils.setFrostColors -import com.sothree.slidinguppanel.SlidingUpPanelLayout -import kotlinx.android.synthetic.main.activity_image.* import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers @@ -104,7 +106,7 @@ class ImageActivity : KauBaseActivity() { set(value) { if (field == value) return field = value - value.update(image_fab) + value.update(binding.imageFab) } private lateinit var dragHelper: ViewDragHelper @@ -141,14 +143,19 @@ class ImageActivity : KauBaseActivity() { )}_${Math.abs(imageUrl.hashCode())}" } + private lateinit var binding: ActivityImageBinding + private var bottomBehavior: BottomSheetBehavior<View>? = null + private val baseBackgroundColor = if (Prefs.blackMediaBg) Color.BLACK else Prefs.bgColor.withMinAlpha(235) private fun loadError(e: Throwable) { errorRef = e e.logFrostEvent("Image load error") - if (image_progress.isVisible) - image_progress.fadeOut() + with(binding) { + if (imageProgress.isVisible) + imageProgress.fadeOut() + } tempFile.delete() fabAction = FabStates.ERROR } @@ -166,28 +173,49 @@ class ImageActivity : KauBaseActivity() { L.v { "Launching with true url $result" } result } + binding = DataBindingUtil.setContentView(this, R.layout.activity_image) + binding.onCreate() + tempFile = File(cacheDir(this), imageHash) + launch(CoroutineExceptionHandler { _, throwable -> loadError(throwable) }) { + downloadImageTo(tempFile) + binding.imageProgress.fadeOut() + binding.imagePhoto.setImage(ImageSource.uri(frostUriFromFile(tempFile))) + fabAction = FabStates.DOWNLOAD + binding.imagePhoto.animate().alpha(1f).scaleXY(1f).start() + } + } - val layout = - if (!imageText.isNullOrBlank()) R.layout.activity_image else R.layout.activity_image_textless - setContentView(layout) - image_container.setBackgroundColor(baseBackgroundColor) - image_text?.setTextColor(if (Prefs.blackMediaBg) Color.WHITE else Prefs.textColor) - image_text?.setBackgroundColor( - (if (Prefs.blackMediaBg) Color.BLACK else Prefs.bgColor) - .colorToForeground(0.2f).withAlpha(255) - ) - image_text?.text = imageText - image_progress.tint(if (Prefs.blackMediaBg) Color.WHITE else Prefs.accentColor) - image_panel?.addPanelSlideListener(object : - SlidingUpPanelLayout.SimplePanelSlideListener() { - override fun onPanelSlide(panel: View, slideOffset: Float) { - if (slideOffset == 0f && !image_fab.isShown) image_fab.show() - else if (slideOffset != 0f && image_fab.isShown) image_fab.hide() - image_text?.alpha = slideOffset / 2 + 0.5f + private fun ActivityImageBinding.onCreate() { + imageContainer.setBackgroundColor(baseBackgroundColor) + this@ImageActivity.imageText.also { text -> + if (text.isNullOrBlank()) { + imageText.gone() + } else { + imageText.setTextColor(if (Prefs.blackMediaBg) Color.WHITE else Prefs.textColor) + imageText.setBackgroundColor( + (if (Prefs.blackMediaBg) Color.BLACK else Prefs.bgColor) + .colorToForeground(0.2f).withAlpha(255) + ) + imageText.text = text + bottomBehavior = BottomSheetBehavior.from<View>(imageText).apply { + setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { + override fun onSlide(bottomSheet: View, slideOffset: Float) { + if (slideOffset == 0f && !imageFab.isShown) imageFab.show() + else if (slideOffset != 0f && imageFab.isShown) imageFab.hide() + imageText.alpha = slideOffset / 2 + 0.5f + } + + override fun onStateChanged(bottomSheet: View, newState: Int) { + // No op + } + }) + } + imageText.bringToFront() } - }) - image_fab.setOnClickListener { fabAction.onClick(this) } - image_photo.setOnImageEventListener(object : + } + imageProgress.tint(if (Prefs.blackMediaBg) Color.WHITE else Prefs.accentColor) + imageFab.setOnClickListener { fabAction.onClick(this@ImageActivity) } + imagePhoto.setOnImageEventListener(object : SubsamplingScaleImageView.DefaultOnImageEventListener() { override fun onImageLoadError(e: Exception) { loadError(e) @@ -196,18 +224,11 @@ class ImageActivity : KauBaseActivity() { setFrostColors { themeWindow = false } - tempFile = File(cacheDir(this), imageHash) - launch(CoroutineExceptionHandler { _, throwable -> loadError(throwable) }) { - downloadImageTo(tempFile) - image_progress.fadeOut() - image_photo.setImage(ImageSource.uri(frostUriFromFile(tempFile))) - fabAction = FabStates.DOWNLOAD - image_photo.animate().alpha(1f).scaleXY(1f).start() - dragHelper = ViewDragHelper.create(image_drag, ViewDragCallback()).apply { - setEdgeTrackingEnabled(ViewDragHelper.EDGE_TOP or ViewDragHelper.EDGE_BOTTOM) - } - image_drag.dragHelper = dragHelper + dragHelper = ViewDragHelper.create(imageDrag, ViewDragCallback()).apply { + setEdgeTrackingEnabled(ViewDragHelper.EDGE_TOP or ViewDragHelper.EDGE_BOTTOM) } + imageDrag.dragHelper = dragHelper + imageDrag.viewToIgnore = imageText } private inner class ViewDragCallback : ViewDragHelper.Callback() { @@ -216,7 +237,8 @@ class ImageActivity : KauBaseActivity() { private var scrollToTop = false override fun tryCaptureView(view: View, i: Int): Boolean { - return true + L.d { "Try capture ${view.id} $i ${binding.imagePhoto.id} ${binding.imageText.id}" } + return view === binding.imagePhoto } override fun getViewHorizontalDragRange(child: View): Int = 0 @@ -231,18 +253,24 @@ class ImageActivity : KauBaseActivity() { dy: Int ) { super.onViewPositionChanged(changedView, left, top, dx, dy) - //make sure that we are using the proper axis - scrollPercent = abs(top.toFloat() / image_container.height) - scrollToTop = top < 0 - val multiplier = max(1f - scrollPercent, 0f) - image_fab.alpha = multiplier - image_panel?.alpha = multiplier - image_container.setBackgroundColor(baseBackgroundColor.adjustAlpha(multiplier)) - - if (scrollPercent >= 1) { - if (!isFinishing) { - finish() - overridePendingTransition(0, 0) + with(binding) { + //make sure that we are using the proper axis + scrollPercent = abs(top.toFloat() / imageContainer.height) + scrollToTop = top < 0 + val multiplier = max(1f - scrollPercent, 0f) + + imageFab.alpha = multiplier + bottomBehavior?.also { + imageText.alpha = + multiplier * (if (it.state == BottomSheetBehavior.STATE_COLLAPSED) 0.5f else 1f) + } + imageContainer.setBackgroundColor(baseBackgroundColor.adjustAlpha(multiplier)) + + if (scrollPercent >= 1) { + if (!isFinishing) { + finish() + overridePendingTransition(0, 0) + } } } } @@ -256,7 +284,7 @@ class ImageActivity : KauBaseActivity() { else -> 0 } dragHelper.settleCapturedViewAt(0, finalTop) - image_drag.invalidate() + binding.imageDrag.invalidate() } override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int = 0 diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/DragFrame.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/DragFrame.kt index c2f36536..87ad2bef 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/views/DragFrame.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/views/DragFrame.kt @@ -18,8 +18,10 @@ package com.pitchedapps.frost.views import android.annotation.SuppressLint import android.content.Context +import android.graphics.Rect import android.util.AttributeSet import android.view.MotionEvent +import android.view.View import android.widget.FrameLayout import androidx.core.view.ViewCompat import androidx.customview.widget.ViewDragHelper @@ -29,9 +31,20 @@ class DragFrame @JvmOverloads constructor( attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { + var dragHelper: ViewDragHelper? = null + var viewToIgnore: View? = null + private val rect = Rect() + private val location = IntArray(2) + private var shouldIgnore: Boolean = false override fun onInterceptTouchEvent(event: MotionEvent): Boolean { + if (event.actionMasked == MotionEvent.ACTION_DOWN) { + shouldIgnore = shouldIgnore(event) + } + if (shouldIgnore) { + return false + } return try { dragHelper?.shouldInterceptTouchEvent(event) ?: false } catch (e: Exception) { @@ -41,6 +54,12 @@ class DragFrame @JvmOverloads constructor( @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { + if (event.actionMasked == MotionEvent.ACTION_DOWN) { + shouldIgnore = shouldIgnore(event) + } + if (shouldIgnore) { + return false + } try { dragHelper?.processTouchEvent(event) ?: return false } catch (e: Exception) { @@ -49,6 +68,24 @@ class DragFrame @JvmOverloads constructor( return true } + override fun dispatchTouchEvent(event: MotionEvent): Boolean { + if (event.actionMasked == MotionEvent.ACTION_DOWN) { + shouldIgnore = shouldIgnore(event) + } + if (shouldIgnore) { + return false + } + return super.dispatchTouchEvent(event) + } + + private fun shouldIgnore(event: MotionEvent): Boolean { + val v = viewToIgnore ?: return false + v.getDrawingRect(rect) + v.getLocationOnScreen(location) + rect.offset(location[0], location[1]) + return rect.contains(event.rawX.toInt(), event.rawY.toInt()) + } + override fun computeScroll() { super.computeScroll() if (dragHelper?.continueSettling(true) == true) { diff --git a/app/src/main/res/layout/activity_image.xml b/app/src/main/res/layout/activity_image.xml index 85837fc3..2bf68056 100644 --- a/app/src/main/res/layout/activity_image.xml +++ b/app/src/main/res/layout/activity_image.xml @@ -1,44 +1,23 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/image_container" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <ProgressBar - android:id="@+id/image_progress" - style="?android:attr/progressBarStyleLarge" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" /> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/image_fab" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_margin="@dimen/kau_fab_margin" - android:visibility="invisible" /> - - <com.pitchedapps.frost.views.DragFrame - android:id="@+id/image_drag" +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <androidx.coordinatorlayout.widget.CoordinatorLayout + android:id="@+id/image_container" android:layout_width="match_parent" android:layout_height="match_parent"> - <com.sothree.slidinguppanel.SlidingUpPanelLayout - android:id="@+id/image_panel" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="bottom" - app:umanoPanelHeight="44dp" - app:umanoShadowHeight="0dp"> + <ProgressBar + android:id="@+id/image_progress" + style="?android:attr/progressBarStyleLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" /> - <TextView - android:id="@+id/image_text" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:alpha="0.5" - android:padding="@dimen/kau_padding_normal" /> + <com.pitchedapps.frost.views.DragFrame + android:id="@+id/image_drag" + android:layout_width="match_parent" + android:layout_height="match_parent"> <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView android:id="@+id/image_photo" @@ -48,8 +27,25 @@ android:scaleX="0.9" android:scaleY="0.9" /> - </com.sothree.slidinguppanel.SlidingUpPanelLayout> - - </com.pitchedapps.frost.views.DragFrame> + </com.pitchedapps.frost.views.DragFrame> -</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file + <TextView + android:id="@+id/image_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:alpha="0.5" + android:padding="@dimen/kau_padding_normal" + app:behavior_peekHeight="44dp" + app:layout_behavior="@string/bottom_sheet_behavior" /> + + <com.google.android.material.floatingactionbutton.FloatingActionButton + android:id="@+id/image_fab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_margin="@dimen/kau_fab_margin" + android:visibility="invisible" /> + + </androidx.coordinatorlayout.widget.CoordinatorLayout> + +</layout> diff --git a/app/src/main/res/layout/activity_image_textless.xml b/app/src/main/res/layout/activity_image_textless.xml deleted file mode 100644 index 41fd43a2..00000000 --- a/app/src/main/res/layout/activity_image_textless.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/image_container" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <ProgressBar - android:id="@+id/image_progress" - style="?android:attr/progressBarStyleLarge" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" /> - - <com.pitchedapps.frost.views.DragFrame - android:id="@+id/image_drag" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView - android:id="@+id/image_photo" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:alpha="0" - android:scaleX="0.9" - android:scaleY="0.9" /> - - </com.pitchedapps.frost.views.DragFrame> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/image_fab" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_margin="@dimen/kau_fab_margin" - android:visibility="invisible" /> - -</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file |