Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b55b322f authored by Jeremie Boulic's avatar Jeremie Boulic Committed by Android (Google) Code Review
Browse files

Merge "[DocsUI Peek] Save/restore state on window resize" into main

parents f0239bfe 97b1cb8f
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -429,7 +429,7 @@ public abstract class BaseActivity

        if (isUsePeekPreviewFlagEnabled()) {
            mPeekViewManager = new PeekViewManager(this);
            mPeekViewManager.initFragment(getSupportFragmentManager());
            mPeekViewManager.initFragment(getSupportFragmentManager(), savedInstanceState);
        }
    }

@@ -1031,6 +1031,9 @@ public abstract class BaseActivity
        super.onSaveInstanceState(state);
        state.putParcelable(Shared.EXTRA_STATE, mState);
        mSearchManager.onSaveInstanceState(state);
        if (isUsePeekPreviewFlagEnabled()) {
            mPeekViewManager.onSaveInstanceState(state);
        }
    }

    @Override
+43 −6
Original line number Diff line number Diff line
@@ -25,30 +25,57 @@ import androidx.fragment.app.Fragment
import com.android.documentsui.R
import com.android.documentsui.base.DocumentInfo
import com.google.android.material.appbar.MaterialToolbar
import java.io.FileNotFoundException

class PeekFragment : Fragment() {
    companion object {
        const val TAG = "PeekFragment"
        private const val TAG = "PeekFragment"
        private const val PEEK_DOC_INFO = "PEEK_DOC_INFO"
    }

    private lateinit var viewManager: PeekViewManager
    private lateinit var toolbar: MaterialToolbar

    private var docInfo: DocumentInfo? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.peek_layout, container, /* attachToRoot= */ false)
        toolbar = view.findViewById(R.id.peek_toolbar)
        toolbar.setNavigationOnClickListener {
            if (!::viewManager.isInitialized) {
                Log.e(TAG, "PeekViewManager has not been initialized")
            } else {
                viewManager.setContainerVisibility(false)
            }
            clearAndHide()
        }
        return view
    }

    // Called after the fragment has been created and its previous view state has been restored.
    // This is where the preview is rerendered, when applicable, and additional view states can be
    // restored.
    override fun onViewStateRestored(savedInstanceState: Bundle?) {
        super.onViewStateRestored(savedInstanceState)
        if (savedInstanceState == null) {
            return
        }
        val doc = savedInstanceState.getParcelable(PEEK_DOC_INFO, DocumentInfo::class.java)
        if (doc != null) {
            // Update potentially stale document info. Clear and hide the Peek overlay if an
            // exception is caught during the process.
            try {
                doc.updateSelf(doc.userId.getContentResolver(context), doc.userId)
                updateView(doc)
            } catch (e: FileNotFoundException) {
                Log.e(TAG, "Stale document info: $e")
                clearAndHide()
            }
        }
    }

    override fun onSaveInstanceState(state: Bundle) {
        super.onSaveInstanceState(state)
        state.putParcelable(PEEK_DOC_INFO, docInfo)
    }

    fun setViewManager(viewManager: PeekViewManager) {
        this.viewManager = viewManager
    }
@@ -58,6 +85,16 @@ class PeekFragment : Fragment() {
            Log.e(TAG, "Toolbar has not been initialized")
            return
        }
        docInfo = doc
        toolbar.title = doc.displayName
    }

    fun clearAndHide() {
        if (!::viewManager.isInitialized || !::toolbar.isInitialized) {
            Log.e(TAG, "Toolbar or PeekViewManager have not been initialized")
            return
        }
        toolbar.title = ""
        viewManager.setContainerVisibility(false)
    }
}
+34 −6
Original line number Diff line number Diff line
@@ -16,11 +16,13 @@
package com.android.documentsui.peek

import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.FrameLayout
import androidx.fragment.app.FragmentManager
import com.android.documentsui.R
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentTransaction
import com.android.documentsui.base.DocumentInfo
import com.android.documentsui.util.FlagUtils.Companion.isUsePeekPreviewFlagEnabled
@@ -32,14 +34,16 @@ open class PeekViewManager(
    private val mActivity: Activity
) {
    companion object {
        const val TAG = "PeekViewManager"
        private const val TAG = "PeekViewManager"
        private const val PEEK_OVERLAY_ACTIVE = "PEEK_OVERLAY_ACTIVE"
    }

    private lateinit var peekFragment: PeekFragment
    private lateinit var container: FrameLayout

    open fun initFragment(
        fm: FragmentManager
        fm: FragmentManager,
        savedInstanceState: Bundle?
    ) {
        if (!isUsePeekPreviewFlagEnabled()) {
            Log.e(TAG, "Attempting to create PeekViewManager while Peek disabled")
@@ -53,11 +57,27 @@ open class PeekViewManager(
        }
        this.container = container

        // Initialize Peek fragment. The fragment manager automatically handles state restoration:
        // the fragment might already exist.
        val existingFragment = fm.findFragmentById(R.id.peek_overlay)
        if (existingFragment == null) {
            peekFragment = PeekFragment()
        peekFragment.setViewManager(this)
            val ft: FragmentTransaction = fm.beginTransaction()
            ft.replace(R.id.peek_overlay, peekFragment)
            ft.commitAllowingStateLoss()
        } else {
            peekFragment = existingFragment as PeekFragment
        }
        peekFragment.setViewManager(this)

        // Restore Peek overlay if necessary.
        if (savedInstanceState != null && savedInstanceState.getBoolean(
                PEEK_OVERLAY_ACTIVE,
                false
            )
        ) {
            setContainerVisibility(true)
        }
    }

    open fun peekDocument(doc: DocumentInfo) {
@@ -69,6 +89,14 @@ open class PeekViewManager(
        setContainerVisibility(true)
    }

    fun onSaveInstanceState(state: Bundle) {
        if (!::container.isInitialized) {
            Log.e(TAG, "lateinit container not initialized")
            return
        }
        state.putBoolean(PEEK_OVERLAY_ACTIVE, container.isVisible)
    }

    fun setContainerVisibility(visible: Boolean) {
        if (!::container.isInitialized) {
            Log.e(TAG, "Container has not been initialized")
+5 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.documentsui.testing

import android.app.Activity
import android.os.Bundle
import androidx.fragment.app.FragmentManager
import com.android.documentsui.base.DocumentInfo
import com.android.documentsui.peek.PeekViewManager
@@ -24,7 +25,10 @@ class TestPeekViewManager(mActivity: Activity) : PeekViewManager(mActivity) {

    val peekDocument = TestEventListener<DocumentInfo>()

    override fun initFragment(fm: FragmentManager) {
    override fun initFragment(
        fm: FragmentManager,
        savedInstanceState: Bundle?
    ) {
        throw UnsupportedOperationException()
    }

+1 −0
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ abstract class ActivityTestJunit4<T : Activity?> {

    @JvmField
    protected var mDocsHelper: DocumentsProviderHelper? = null
    @JvmField
    protected var mActivityScenario: ActivityScenario<T?>? = null
    private var initialScreenOffTimeoutValue: String? = null
    private var initialSleepTimeoutValue: String? = null
Loading