88package com.nextcloud.client.onboarding
99
1010import android.accounts.AccountManager
11+ import android.annotation.SuppressLint
1112import android.content.Intent
13+ import android.content.pm.ActivityInfo
1214import android.content.res.Configuration
1315import android.os.Bundle
14- import android.view.View
15- import android.view.ViewGroup
16- import android.widget.LinearLayout
16+ import android.view.ViewGroup.MarginLayoutParams
1717import androidx.activity.OnBackPressedCallback
1818import androidx.activity.result.ActivityResult
1919import androidx.activity.result.ActivityResultLauncher
2020import androidx.activity.result.contract.ActivityResultContracts
21- import androidx.viewpager2 .widget.ViewPager2
21+ import androidx.viewpager .widget.ViewPager
2222import com.nextcloud.android.common.ui.theme.utils.ColorRole
2323import com.nextcloud.client.account.UserAccountManager
2424import com.nextcloud.client.appinfo.AppInfo
2525import com.nextcloud.client.di.Injectable
2626import com.nextcloud.client.preferences.AppPreferences
2727import com.nextcloud.utils.mdm.MDMConfig
28+ import com.nmc.android.helper.OnBoardingPagerAdapter
29+ import com.nmc.android.helper.OnBoardingUtils.Companion.getOnBoardingItems
30+ import com.nmc.android.utils.DisplayUtils.isLandscapeOrientation
2831import com.owncloud.android.BuildConfig
2932import com.owncloud.android.R
3033import com.owncloud.android.authentication.AuthenticatorActivity
3134import com.owncloud.android.databinding.FirstRunActivityBinding
32- import com.owncloud.android.features.FeatureItem
3335import com.owncloud.android.ui.activity.BaseActivity
3436import com.owncloud.android.ui.activity.FileDisplayActivity
35- import com.owncloud.android.ui.adapter.FeaturesViewAdapter
3637import com.owncloud.android.utils.DisplayUtils
3738import com.owncloud.android.utils.theme.ViewThemeUtils
3839import javax.inject.Inject
3940
4041/* *
4142 * Activity displaying general feature after a fresh install.
4243 */
43- class FirstRunActivity : BaseActivity (), Injectable {
44+ class FirstRunActivity : BaseActivity (), ViewPager.OnPageChangeListener, Injectable {
4445
4546 @JvmField
4647 @Inject
@@ -67,24 +68,31 @@ class FirstRunActivity : BaseActivity(), Injectable {
6768 private lateinit var binding: FirstRunActivityBinding
6869 private var defaultViewThemeUtils: ViewThemeUtils ? = null
6970
71+ private var selectedPosition = 0
72+
73+ @SuppressLint(" SourceLockedOrientationActivity" )
7074 override fun onCreate (savedInstanceState : Bundle ? ) {
7175 enableAccountHandling = false
7276
7377 super .onCreate(savedInstanceState)
7478
7579 applyDefaultTheme()
7680
81+ // NMC Customization
82+ // if device is not tablet then we have to lock it to Portrait mode
83+ // as we don't have images for that
84+ if (! com.nmc.android.utils.DisplayUtils .isTablet()) {
85+ requestedOrientation = ActivityInfo .SCREEN_ORIENTATION_PORTRAIT
86+ }
87+
7788 binding = FirstRunActivityBinding .inflate(layoutInflater)
7889 setContentView(binding.root)
7990
80- setSlideshowSize(resources.configuration.orientation == Configuration .ORIENTATION_LANDSCAPE )
81-
8291 registerActivityResult()
8392 setupLoginButton()
84- setupSignupButton(MDMConfig .showIntro(this ))
85- setupHostOwnServerTextView(MDMConfig .showIntro(this ))
8693 deleteAccountAtFirstLaunch()
87- setupFeaturesViewAdapter()
94+ updateLoginButtonMargin()
95+ updateOnBoardingPager(selectedPosition)
8896 handleOnBackPressed()
8997 }
9098
@@ -123,62 +131,53 @@ class FirstRunActivity : BaseActivity(), Injectable {
123131 val authenticatorActivityIntent = getAuthenticatorActivityIntent(false )
124132 activityResult?.launch(authenticatorActivityIntent)
125133 } else {
134+ preferences?.onBoardingComplete = true
126135 finish()
127136 }
128137 }
129138 }
130139
131- private fun setupSignupButton (isProviderOrOwnInstallationVisible : Boolean ) {
132- defaultViewThemeUtils?.material?.colorMaterialButtonOutlinedOnPrimary(binding.signup)
133- binding.signup.visibility = if (isProviderOrOwnInstallationVisible) View .VISIBLE else View .GONE
134- binding.signup.setOnClickListener {
135- val authenticatorActivityIntent = getAuthenticatorActivityIntent(true )
136-
137- if (intent.getBooleanExtra(EXTRA_ALLOW_CLOSE , false )) {
138- activityResult?.launch(authenticatorActivityIntent)
139- } else {
140- authenticatorActivityIntent.addFlags(Intent .FLAG_ACTIVITY_NEW_TASK )
141- startActivity(authenticatorActivityIntent)
142- }
143- }
144- }
145-
146140 private fun getAuthenticatorActivityIntent (extraUseProviderAsWebLogin : Boolean ): Intent {
147141 val intent = Intent (this , AuthenticatorActivity ::class .java)
148142 intent.putExtra(AuthenticatorActivity .EXTRA_USE_PROVIDER_AS_WEBLOGIN , extraUseProviderAsWebLogin)
149143 return intent
150144 }
151145
152- private fun setupHostOwnServerTextView (isProviderOrOwnInstallationVisible : Boolean ) {
153- defaultViewThemeUtils?.platform?.colorTextView(binding.hostOwnServer, ColorRole .ON_PRIMARY )
154- binding.hostOwnServer.visibility = if (isProviderOrOwnInstallationVisible) View .VISIBLE else View .GONE
155- if (isProviderOrOwnInstallationVisible) {
156- binding.hostOwnServer.setOnClickListener {
157- DisplayUtils .startLinkIntent(
158- this ,
159- R .string.url_server_install
160- )
161- }
162- }
163- }
164-
165146 // Sometimes, accounts are not deleted when you uninstall the application so we'll do it now
166147 private fun deleteAccountAtFirstLaunch () {
167148 if (onboarding?.isFirstRun == true ) {
168149 userAccountManager?.removeAllAccounts()
169150 }
170151 }
171152
172- @Suppress(" SpreadOperator" )
173- private fun setupFeaturesViewAdapter () {
174- val featuresViewAdapter = FeaturesViewAdapter (this , * firstRun)
175- binding.progressIndicator.setNumberOfSteps(featuresViewAdapter.itemCount)
176- binding.contentPanel.adapter = featuresViewAdapter
177- binding.contentPanel.registerOnPageChangeCallback(object : ViewPager2 .OnPageChangeCallback () {
178- override fun onPageSelected (position : Int ) {
179- binding.progressIndicator.animateToStep(position + 1 )
153+ private fun updateLoginButtonMargin () {
154+ if (isLandscapeOrientation()) {
155+ if (binding.login.layoutParams is MarginLayoutParams ) {
156+ (binding.login.layoutParams as MarginLayoutParams ).setMargins(
157+ 0 , 0 , 0 , resources.getDimensionPixelOffset(
158+ R .dimen.login_btn_bottom_margin_land
159+ )
160+ )
161+ binding.login.requestLayout()
162+ }
163+ } else {
164+ if (binding.login.layoutParams is MarginLayoutParams ) {
165+ (binding.login.layoutParams as MarginLayoutParams ).setMargins(
166+ 0 , 0 , 0 , resources.getDimensionPixelOffset(
167+ R .dimen.login_btn_bottom_margin
168+ )
169+ )
170+ binding.login.requestLayout()
180171 }
181- })
172+ }
173+ }
174+
175+ private fun updateOnBoardingPager (selectedPosition : Int ) {
176+ val featuresViewAdapter = OnBoardingPagerAdapter (this , getOnBoardingItems())
177+ binding.progressIndicator.setNumberOfSteps(featuresViewAdapter.count)
178+ binding.contentPanel.adapter = featuresViewAdapter
179+ binding.contentPanel.currentItem = selectedPosition
180+ binding.contentPanel.addOnPageChangeListener(this )
182181 }
183182
184183 private fun handleOnBackPressed () {
@@ -188,46 +187,27 @@ class FirstRunActivity : BaseActivity(), Injectable {
188187 override fun handleOnBackPressed () {
189188 val isFromAddAccount = intent.getBooleanExtra(EXTRA_ALLOW_CLOSE , false )
190189
191- val destination: Intent = if (isFromAddAccount) {
192- Intent (applicationContext, FileDisplayActivity ::class .java)
190+ // NMC Customization -> Modified the condition for readability
191+ if (isFromAddAccount) {
192+ val destination = Intent (applicationContext, FileDisplayActivity ::class .java)
193+ destination.flags = Intent .FLAG_ACTIVITY_CLEAR_TOP
194+ startActivity(destination)
195+ finish()
193196 } else {
194- Intent (applicationContext, AuthenticatorActivity ::class .java)
195- }
196-
197- if (! isFromAddAccount) {
198- destination.putExtra(EXTRA_EXIT , true )
197+ // NMC Customization -> No redirection to AuthenticatorActivity is required
198+ // just close the app
199+ finishAffinity()
199200 }
200201
201- destination.flags = Intent .FLAG_ACTIVITY_CLEAR_TOP
202- startActivity(destination)
203- finish()
204202 }
205203 }
206204 )
207205 }
208206
209- private fun setSlideshowSize (isLandscape : Boolean ) {
210- binding.buttonLayout.orientation = if (isLandscape) LinearLayout .HORIZONTAL else LinearLayout .VERTICAL
211-
212- val layoutParams: LinearLayout .LayoutParams = if (MDMConfig .showIntro(this )) {
213- LinearLayout .LayoutParams (
214- ViewGroup .LayoutParams .MATCH_PARENT ,
215- ViewGroup .LayoutParams .WRAP_CONTENT
216- )
217- } else {
218- @Suppress(" MagicNumber" )
219- LinearLayout .LayoutParams (
220- ViewGroup .LayoutParams .MATCH_PARENT ,
221- DisplayUtils .convertDpToPixel(if (isLandscape) 100f else 150f , this )
222- )
223- }
224-
225- binding.bottomLayout.layoutParams = layoutParams
226- }
227-
228207 override fun onConfigurationChanged (newConfig : Configuration ) {
229208 super .onConfigurationChanged(newConfig)
230- setSlideshowSize(newConfig.orientation == Configuration .ORIENTATION_LANDSCAPE )
209+ updateLoginButtonMargin()
210+ updateOnBoardingPager(selectedPosition)
231211 }
232212
233213 private fun onFinish () {
@@ -239,16 +219,24 @@ class FirstRunActivity : BaseActivity(), Injectable {
239219 super .onStop()
240220 }
241221
222+ override fun onPageScrolled (position : Int , positionOffset : Float , positionOffsetPixels : Int ) {
223+ // unused but to be implemented due to abstract parent
224+ }
225+
226+ override fun onPageSelected (position : Int ) {
227+ // -1 to position because this position doesn't start from 0
228+ selectedPosition = position - 1
229+
230+ // pass directly the position here because this position will doesn't start from 0
231+ binding.progressIndicator.animateToStep(position)
232+ }
233+
234+ override fun onPageScrollStateChanged (state : Int ) {
235+ // unused but to be implemented due to abstract parent
236+ }
237+
242238 companion object {
243239 const val EXTRA_ALLOW_CLOSE = " ALLOW_CLOSE"
244240 const val EXTRA_EXIT = " EXIT"
245-
246- val firstRun: Array <FeatureItem >
247- get() = arrayOf(
248- FeatureItem (R .drawable.logo, R .string.first_run_1_text, R .string.empty, true , false ),
249- FeatureItem (R .drawable.first_run_files, R .string.first_run_2_text, R .string.empty, true , false ),
250- FeatureItem (R .drawable.first_run_groupware, R .string.first_run_3_text, R .string.empty, true , false ),
251- FeatureItem (R .drawable.first_run_talk, R .string.first_run_4_text, R .string.empty, true , false )
252- )
253241 }
254242}
0 commit comments