diff --git a/jami-android/app/src/main/java/cx/ring/account/JamiLinkAccountPasswordFragment.kt b/jami-android/app/src/main/java/cx/ring/account/JamiLinkAccountPasswordFragment.kt index 8356a5546f10ef1c339261374c74ce6b3df522ab..d719d14df56396f3f582d2d98c13559fff8ff2dd 100644 --- a/jami-android/app/src/main/java/cx/ring/account/JamiLinkAccountPasswordFragment.kt +++ b/jami-android/app/src/main/java/cx/ring/account/JamiLinkAccountPasswordFragment.kt @@ -25,13 +25,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager -import androidx.annotation.StringRes import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider +import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator import cx.ring.R import cx.ring.account.pinInput.EditTextPinInputFragment import cx.ring.account.pinInput.EditTextPinInputViewModel @@ -64,12 +63,23 @@ class JamiLinkAccountPasswordFragment : savedInstanceState: Bundle? ): View = FragAccJamiLinkPasswordBinding.inflate(inflater, container, false).apply { - viewPager.adapter = SectionsPagerAdapter( - root.context, - childFragmentManager + + val adapter = SectionsPagerAdapter(this@JamiLinkAccountPasswordFragment) + adapter.addFragment( + QrCodePinInputFragment(), + getString(R.string.connect_device_scanqr) + ) + adapter.addFragment( + EditTextPinInputFragment(), + getString(R.string.connect_device_enterPIN) ) - tabs.setupWithViewPager(viewPager) - tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + pager.adapter = adapter + pager.currentItem = 0 + TabLayoutMediator(tabLayout, pager) { tab, position -> + tab.text = adapter.getTabTitle(position) + }.attach() + + tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { presenter.resetPin() // emit the pin again when switching tabs @@ -84,6 +94,7 @@ class JamiLinkAccountPasswordFragment : override fun onTabReselected(tab: TabLayout.Tab?) {} }) + linkButton.setOnClickListener { presenter.linkClicked() } ringExistingPassword.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged( @@ -105,12 +116,8 @@ class JamiLinkAccountPasswordFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // init the 2 view models - qrCodePinInputViewModel.init({ - presenter.pinChanged(it) - }, { presenter.resetPin() }) - editTextPinInputViewModel.init({ - presenter.pinChanged(it) - }, { presenter.resetPin() }) + qrCodePinInputViewModel.init({ presenter.pinChanged(it) }, { presenter.resetPin() }) + editTextPinInputViewModel.init({ presenter.pinChanged(it) }, { presenter.resetPin() }) } override fun onDestroyView() { @@ -128,8 +135,9 @@ class JamiLinkAccountPasswordFragment : override fun showPin(show: Boolean) { val binding = binding ?: return - binding.passwordBox.visibility = if (show) View.VISIBLE else View.GONE - binding.linkButton.setText(if (show) R.string.account_link_device_button else R.string.account_link_archive_button) + binding.pager.visibility = if (show) View.VISIBLE else View.GONE + binding.tabLayout.visibility = if (show) View.VISIBLE else View.GONE + binding.linkButton.setText(if (show) R.string.account_link_device else R.string.account_link_archive_button) } override fun createAccount() { @@ -143,30 +151,30 @@ class JamiLinkAccountPasswordFragment : activity?.onBackPressedDispatcher?.onBackPressed() } - companion object { - val TAG = JamiLinkAccountPasswordFragment::class.simpleName!! - } - internal class SectionsPagerAdapter(private val mContext: Context, fm: FragmentManager) : - FragmentPagerAdapter(fm) { - @StringRes - private val TAB_TITLES = - intArrayOf(R.string.connect_device_scanqr, R.string.connect_device_enterPIN) - - override fun getItem(position: Int): Fragment { - return when (position) { - 0 -> QrCodePinInputFragment() // scan qr code - 1 -> EditTextPinInputFragment() // or enter pin - else -> throw IllegalArgumentException() - } + internal class SectionsPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + private val mFragmentList: MutableList<Fragment> = ArrayList() + private val mFragmentTitleList: MutableList<String> = ArrayList() + + fun getTabTitle(position: Int): String { + return mFragmentTitleList[position] + } + + fun addFragment(fragment: Fragment, title: String) { + mFragmentList.add(fragment) + mFragmentTitleList.add(title) } - override fun getPageTitle(position: Int): CharSequence { - return mContext.resources.getString(TAB_TITLES[position]) + override fun getItemCount(): Int { + return mFragmentList.size } - override fun getCount(): Int { - return TAB_TITLES.size + override fun createFragment(position: Int): Fragment { + return mFragmentList[position] } + + } + companion object { + val TAG = JamiLinkAccountPasswordFragment::class.simpleName!! } } \ No newline at end of file diff --git a/jami-android/app/src/main/res/layout/frag_acc_jami_link.xml b/jami-android/app/src/main/res/layout/frag_acc_jami_link.xml index 2cd4815a850162a90e579bcb72974c5029a44402..745d1ed0d7c1d9b896bf94cb1c1748192aaaa9ad 100644 --- a/jami-android/app/src/main/res/layout/frag_acc_jami_link.xml +++ b/jami-android/app/src/main/res/layout/frag_acc_jami_link.xml @@ -1,81 +1,58 @@ <?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_primary_dark" - tools:context="cx.ring.account.AccountWizardActivity"> + android:gravity="center_vertical" + android:orientation="vertical"> - <cx.ring.views.BoundedScrollView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:fillViewport="true" - tools:ignore="UselessParent"> + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center"> <LinearLayout - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" + android:layout_centerVertical="true" android:gravity="center_horizontal" - android:layout_marginStart="30dp" - android:layout_marginEnd="30dp"> + android:orientation="vertical"> - <cx.ring.views.BoundedRelativeLayout + <TextView + android:id="@+id/title" android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="center" - app:bounded_height="690dp" - app:bounded_width="580dp"> - - <ImageView - android:id="@+id/background" - android:layout_width="170dp" - android:layout_height="170dp" - android:layout_alignTop="@id/card" - android:layout_centerHorizontal="true" - android:layout_marginTop="-30dp" - android:alpha="0.1" - android:contentDescription="@string/account_link_device" - android:src="@drawable/baseline_devices_24" - app:tint="@color/white" /> - - <TextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:layout_centerHorizontal="true" - android:layout_margin="@dimen/text_margin" - android:gravity="center" - android:text="@string/account_link_device" - android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6" - android:textColor="@color/color_primary_light" - android:textStyle="bold" /> + android:layout_height="wrap_content" + android:layout_margin="@dimen/text_margin" + android:text="@string/account_link_device" + android:textAppearance="@style/TextAppearance.MaterialComponents.Headline5" + android:textColor="@color/color_primary_light" + android:textStyle="bold" /> - <TextView - android:id="@+id/info" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignTop="@id/title" - android:layout_marginTop="44dp" - android:layout_marginBottom="20dp" - android:gravity="center" - android:text="@string/account_link_device_info" - android:textAlignment="center" - android:textAppearance="@style/TextAppearance.AppCompat.Medium" - android:textColor="@color/white" /> + </LinearLayout> - <cx.ring.views.WizardViewPager - android:id="@+id/pager" - android:layout_width="wrap_content" - android:layout_height="600dp" - android:layout_below="@+id/info" - android:layout_centerHorizontal="true" - android:clipChildren="false" - android:clipToPadding="false" - tools:background="@color/grey_400" /> - </cx.ring.views.BoundedRelativeLayout> + <ImageView + android:id="@+id/background" + android:layout_width="@dimen/wizard_image_background" + android:layout_height="@dimen/wizard_image_background" + android:layout_centerHorizontal="true" + android:alpha="0.1" + android:contentDescription="@null" + android:src="@drawable/baseline_devices_24" + app:tint="@color/white" /> + </RelativeLayout> + + <cx.ring.views.WizardViewPager + android:id="@+id/pager" + android:layout_width="@dimen/wizard_card_width" + android:layout_height="500dp" + android:layout_gravity="center_horizontal" + android:layout_marginBottom="22dp" + tools:background="@color/grey_400" + tools:layout_height="500dp" /> + +</LinearLayout> - </LinearLayout> - </cx.ring.views.BoundedScrollView> -</RelativeLayout> diff --git a/jami-android/app/src/main/res/layout/frag_acc_jami_link_password.xml b/jami-android/app/src/main/res/layout/frag_acc_jami_link_password.xml index 3220e11e10e0649f24669ec3e533ac4277c14d31..bf329095d85c18cba888a70af74611c3bd5db30d 100644 --- a/jami-android/app/src/main/res/layout/frag_acc_jami_link_password.xml +++ b/jami-android/app/src/main/res/layout/frag_acc_jami_link_password.xml @@ -15,89 +15,94 @@ ~ along with this program; if not, write to the Free Software ~ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. --> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context="cx.ring.account.AccountWizardActivity"> + <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - app:cardBackgroundColor="@color/white" - app:cardCornerRadius="@dimen/wizard_card_radius" - tools:context="cx.ring.account.AccountWizardActivity"> + android:background="@color/white" + app:cardCornerRadius="12dp"> - <LinearLayout + <ScrollView android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/white" - android:orientation="vertical"> + android:layout_height="wrap_content"> - <com.google.android.material.tabs.TabLayout - android:id="@+id/tabs" + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="20dp" - android:background="@null" - app:tabIndicatorColor="@color/color_primary_dark" - app:tabSelectedTextColor="@color/black" - app:tabTextColor="@color/black"> + android:orientation="vertical" + android:padding="@dimen/wizard_card_padding"> - <com.google.android.material.tabs.TabItem - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/connect_device_scanqr" /> + <com.google.android.material.tabs.TabLayout + android:id="@+id/tab_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content"> - <com.google.android.material.tabs.TabItem - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/connect_device_enterPIN" /> + <com.google.android.material.tabs.TabItem + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/connect_device_scanqr" /> - </com.google.android.material.tabs.TabLayout> + <com.google.android.material.tabs.TabItem + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/connect_device_enterPIN" /> + </com.google.android.material.tabs.TabLayout> - <!--pager display the scan view or the pin input--> - <androidx.viewpager.widget.ViewPager - android:id="@+id/view_pager" - android:layout_width="match_parent" - android:layout_height="300dp" /> + <androidx.viewpager2.widget.ViewPager2 + android:id="@+id/pager" + android:layout_width="match_parent" + android:layout_height="300dp" /> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:paddingTop="15dp" - android:text="@string/help_pin_info" /> + <TextView + android:id="@+id/info" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:text="@string/help_password_enter" + android:textStyle="bold" /> - <com.google.android.material.textfield.TextInputLayout - android:id="@+id/password_box" - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="20dp" - android:layout_marginEnd="20dp" - app:passwordToggleEnabled="true"> + <com.google.android.material.textfield.TextInputLayout + android:id="@+id/password_txt_box" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:passwordToggleEnabled="true"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/ring_existing_password" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:drawableStart="@drawable/baseline_lock_24" + android:drawablePadding="5dp" + android:hint="@string/prompt_password" + android:imeOptions="actionNext" + android:inputType="textPassword" /> + </com.google.android.material.textfield.TextInputLayout> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/ring_existing_password" + <com.google.android.material.button.MaterialButton + android:id="@+id/link_button" + style="@style/WizardButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:drawableStart="@drawable/baseline_lock_24" - android:drawablePadding="5dp" - android:hint="@string/prompt_password" - android:imeOptions="actionNext" - android:inputType="textPassword" - app:passwordToggleEnabled="true" /> - </com.google.android.material.textfield.TextInputLayout> - - <com.google.android.material.button.MaterialButton - android:id="@+id/link_button" - style="@style/WizardButton" - android:layout_width="250dp" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:layout_marginTop="18dp" - android:enabled="false" - android:text="@string/account_link_device_button" - android:textSize="12sp" - android:theme="@style/ButtonColoredInverse" /> + android:layout_gravity="center_horizontal" + android:layout_marginTop="18dp" + android:enabled="false" + android:text="@string/account_link_button" + android:textSize="12sp" + android:theme="@style/ButtonColoredInverse" /> + + </LinearLayout> + + </ScrollView> - </LinearLayout> +</androidx.cardview.widget.CardView> -</androidx.cardview.widget.CardView> \ No newline at end of file +</FrameLayout> \ No newline at end of file diff --git a/jami-android/app/src/main/res/values/dimens.xml b/jami-android/app/src/main/res/values/dimens.xml index 6b122052b1ee39b3582ea651069e1a0c14544f9b..f0587187eb540c778dae330ef72d2a3f3b00ddb6 100644 --- a/jami-android/app/src/main/res/values/dimens.xml +++ b/jami-android/app/src/main/res/values/dimens.xml @@ -92,7 +92,7 @@ along with this program; if not, write to the Free Software <dimen name="wizard_button_padding">@dimen/button_padding</dimen> <dimen name="wizard_card_width">330dp</dimen> <dimen name="wizard_card_height">420dp</dimen> - <dimen name="wizard_image_background">300dp</dimen> + <dimen name="wizard_image_background">180dp</dimen> <dimen name="wizard_card_radius">@dimen/button_corner_radius</dimen> <dimen name="wizard_card_padding">22dp</dimen> <dimen name="wizard_text_size">14sp</dimen>