[fenix] For https://github.com/mozilla-mobile/fenix/issues/21611: Add jump back in Contextual Hints

pull/600/head
Arturo Mejia 3 years ago committed by mergify[bot]
parent fd6a61fdfc
commit 21480b89ea

@ -4,14 +4,22 @@
package org.mozilla.fenix.onboarding
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import androidx.recyclerview.widget.RecyclerView
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.FragmentOnboardingHomeDialogBinding
import org.mozilla.fenix.databinding.OnboardingJumpBackInCfrBinding
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.home.recenttabs.view.RecentTabsHeaderViewHolder
/**
* Dialog displayed once when one or multiples of these sections are shown in the home screen
@ -37,7 +45,65 @@ class HomeOnboardingDialogFragment : DialogFragment() {
context?.settings()?.let { settings ->
settings.hasShownHomeOnboardingDialog = true
}
showJumpCFR()
dismiss()
}
}
private fun showJumpCFR() {
val jumpBackInView = findJumpBackInView()
jumpBackInView?.let {
val crfDialog = createJumpCRF(anchor = jumpBackInView)
crfDialog?.show()
}
}
private fun findJumpBackInView(): View? {
val list = activity?.findViewById<RecyclerView>(R.id.sessionControlRecyclerView)
val count = list?.adapter?.itemCount ?: return null
for (index in 0..count) {
val viewHolder = list.findViewHolderForAdapterPosition(index)
if (viewHolder is RecentTabsHeaderViewHolder) {
return viewHolder.containerView
}
}
return null
}
private fun createJumpCRF(anchor: View): Dialog? {
val context: Context = requireContext()
val anchorPosition = IntArray(2)
val popupBinding = OnboardingJumpBackInCfrBinding.inflate(LayoutInflater.from(context))
val popup = Dialog(context)
popup.apply {
setContentView(popupBinding.root)
setCancelable(false)
// removing title or setting it as an empty string does not prevent a11y services from assigning one
setTitle(" ")
}
popupBinding.closeInfoBanner.setOnClickListener {
popup.dismiss()
}
anchor.getLocationOnScreen(anchorPosition)
val (x, y) = anchorPosition
if (x == 0 && y == 0) {
return null
}
popupBinding.root.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
popup.window?.apply {
val attr = attributes
setGravity(Gravity.START or Gravity.TOP)
attr.x = x
attr.y = y - popupBinding.root.measuredHeight
attributes = attr
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
}
return popup
}
}

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="12dp" />
<gradient
android:angle="45"
android:endColor="#AB71FF"
android:startColor="#592ACB" />
</shape>

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/banner_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/onboarding_popup_shape">
<TextView
android:id="@+id/banner_info_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="16dp"
android:maxWidth="200dp"
android:text="@string/onboarding_home_screen_jump_back_contextual_hint"
android:textAppearance="@style/Body16TextStyle"
android:textColor="@color/contrast_text_light_theme"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/close_info_banner"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<ImageButton
android:id="@+id/close_info_banner"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/content_description_close_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_close"
app:tint="@color/contrast_text_light_theme" />
</androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:layout_width="@dimen/cfr_triangle_width"
android:layout_height="@dimen/cfr_triangle_height"
android:layout_gravity="start"
android:layout_marginStart="15dp"
android:layout_marginEnd="@dimen/cfr_triangle_margin_edge"
android:importantForAccessibility="no"
app:srcCompat="@drawable/ic_cfr_triangle"
android:rotation="180"
app:tint="#7542E5" />
</LinearLayout>
Loading…
Cancel
Save