Skip to content

Commit

Permalink
Merge pull request #1442 from Infomaniak/21-Add-createAccount-ad-bott…
Browse files Browse the repository at this point in the history
…omsheet

21 Add create account ad bottomsheet
  • Loading branch information
sirambd authored Oct 1, 2024
2 parents 09222cc + c5bc274 commit e3fb456
Show file tree
Hide file tree
Showing 18 changed files with 577 additions and 43 deletions.
58 changes: 40 additions & 18 deletions .idea/navEditor.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 41 additions & 16 deletions app/src/main/java/com/infomaniak/drive/ui/login/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.net.toUri
import androidx.core.view.isInvisible
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.widget.ViewPager2
Expand All @@ -38,6 +39,7 @@ import com.infomaniak.drive.data.cache.DriveInfosController
import com.infomaniak.drive.data.documentprovider.CloudStorageProvider
import com.infomaniak.drive.data.models.drive.DriveInfo
import com.infomaniak.drive.databinding.ActivityLoginBinding
import com.infomaniak.drive.ui.LaunchActivity
import com.infomaniak.drive.ui.MainActivity
import com.infomaniak.drive.utils.AccountUtils
import com.infomaniak.drive.utils.getInfomaniakLogin
Expand All @@ -54,16 +56,18 @@ import com.infomaniak.lib.core.utils.Utils.lockOrientationForSmallScreens
import com.infomaniak.lib.login.ApiToken
import com.infomaniak.lib.login.InfomaniakLogin
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.invoke
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class LoginActivity : AppCompatActivity() {

private val binding by lazy { ActivityLoginBinding.inflate(layoutInflater) }

private val infomaniakLogin: InfomaniakLogin by lazy { getInfomaniakLogin() }

private val navigationArgs: LoginActivityArgs? by lazy { intent?.extras?.let(LoginActivityArgs::fromBundle) }
private val navigationArgs: LoginActivityArgs? by lazy {
intent?.extras?.let(LoginActivityArgs::fromBundle)
}

private val webViewLoginResultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
with(result) {
Expand Down Expand Up @@ -120,19 +124,23 @@ class LoginActivity : AppCompatActivity() {

signInButton.setOnClickListener {
trackAccountEvent("openCreationWebview")
infomaniakLogin.startCreateAccountWebView(
resultLauncher = createAccountResultLauncher,
createAccountUrl = BuildConfig.CREATE_ACCOUNT_URL,
successHost = BuildConfig.CREATE_ACCOUNT_SUCCESS_HOST,
cancelHost = BuildConfig.CREATE_ACCOUNT_CANCEL_HOST,
)
startAccountCreation()
}

onBackPressedDispatcher.addCallback {
if (introViewpager.currentItem == 0) finish() else introViewpager.currentItem -= 1
}

handleHelpShortcut()
handleNavigationFlags()
}

private fun startAccountCreation() {
infomaniakLogin.startCreateAccountWebView(
resultLauncher = createAccountResultLauncher,
createAccountUrl = BuildConfig.CREATE_ACCOUNT_URL,
successHost = BuildConfig.CREATE_ACCOUNT_SUCCESS_HOST,
cancelHost = BuildConfig.CREATE_ACCOUNT_CANCEL_HOST,
)
}

private fun ActivityResult.handleCreateAccountActivityResult() = with(binding) {
Expand Down Expand Up @@ -163,19 +171,25 @@ class LoginActivity : AppCompatActivity() {
lifecycleScope.launch(Dispatchers.IO) {
when (val returnValue = authenticateUser(this@LoginActivity, apiToken)) {
is User -> {
trackUserId(AccountUtils.currentUserId)
trackAccountEvent("loggedIn")
launchMainActivity()
val deeplink = navigationArgs?.publicShareDeeplink
if (deeplink.isNullOrBlank()) {
trackUserId(AccountUtils.currentUserId)
trackAccountEvent("loggedIn")
launchMainActivity()
} else {
launchDeeplinkAndFinish(deeplink)
}

return@launch
}
is ApiResponse<*> -> withContext(Dispatchers.Main) {
is ApiResponse<*> -> Dispatchers.Main {
if (returnValue.error?.code == ErrorCode.NO_DRIVE) {
launchNoDriveActivity()
} else {
showError(getString(returnValue.translatedError))
}
}
else -> withContext(Dispatchers.Main) { showError(getString(R.string.anErrorHasOccurred)) }
else -> Dispatchers.Main { showError(getString(R.string.anErrorHasOccurred)) }
}

infomaniakLogin.deleteToken(
Expand All @@ -193,6 +207,14 @@ class LoginActivity : AppCompatActivity() {
if (!connectButton.isEnabled) connectButton.isEnabled = true
}

private fun launchDeeplinkAndFinish(deeplink: String) {
Intent(this@LoginActivity, LaunchActivity::class.java).apply {
setData(deeplink.toUri())
clearStack()
}.also(::startActivity)
finishAffinity()
}

private fun launchMainActivity() {
startActivity(Intent(this, MainActivity::class.java).clearStack())
}
Expand All @@ -203,8 +225,11 @@ class LoginActivity : AppCompatActivity() {
signInButton.isEnabled = true
}

private fun handleHelpShortcut() {
if (navigationArgs?.isHelpShortcutPressed == true) openSupport()
private fun handleNavigationFlags() {
when {
navigationArgs?.isHelpShortcutPressed == true -> openSupport()
navigationArgs?.shouldLaunchAccountCreation == true -> startAccountCreation()
}
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Infomaniak kDrive - Android
* Copyright (C) 2024 Infomaniak Network SA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.infomaniak.drive.ui.publicShare

import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.infomaniak.drive.databinding.FragmentBottomSheetObtainKdriveAdBinding
import com.infomaniak.drive.ui.login.LoginActivity
import com.infomaniak.drive.ui.login.LoginActivityArgs
import com.infomaniak.lib.core.utils.safeBinding

class ObtainKDriveAdBottomSheetDialog : BottomSheetDialogFragment() {

private var binding: FragmentBottomSheetObtainKdriveAdBinding by safeBinding()
private val publicShareViewModel: PublicShareViewModel by activityViewModels()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return FragmentBottomSheetObtainKdriveAdBinding.inflate(inflater, container, false).also { binding = it }.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding.freeTrialButton.setOnClickListener { openLoginActivity(shouldLaunchAccountCreation = true) }
binding.alreadyGotAnAccountButton.setOnClickListener { openLoginActivity(shouldLaunchAccountCreation = false) }
}

private fun openLoginActivity(shouldLaunchAccountCreation: Boolean) = with(publicShareViewModel) {
Intent(requireActivity(), LoginActivity::class.java).apply {
putExtras(
LoginActivityArgs(
shouldLaunchAccountCreation = shouldLaunchAccountCreation,
publicShareDeeplink = "https://kdrive.infomaniak.com/app/share/$driveId/$publicShareUuid",
).toBundle()
)
}.also(::startActivity)
findNavController().popBackStack()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,13 @@ interface OnPublicShareItemClickListener : FileInfoActionsView.OnItemClickListen

override fun shareFile() = startAction(DownloadAction.SEND_COPY)

override fun saveToKDrive() = startAction(DownloadAction.SAVE_TO_DRIVE)
override fun saveToKDrive() {
if (AccountUtils.currentDriveId == -1) {
ownerFragment?.safeNavigate(R.id.obtainKDriveAdBottomSheet)
} else {
startAction(DownloadAction.SAVE_TO_DRIVE)
}
}

override fun downloadFileClicked() {
currentContext.trackPublicShareActionEvent(ACTION_DOWNLOAD_NAME)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ import com.infomaniak.drive.ui.fileList.BaseDownloadProgressDialog.DownloadActio
import com.infomaniak.drive.ui.fileList.FileListFragment
import com.infomaniak.drive.ui.fileList.multiSelect.MultiSelectActionsBottomSheetDialog
import com.infomaniak.drive.ui.fileList.preview.PreviewDownloadProgressDialogArgs
import com.infomaniak.drive.ui.login.LoginActivity
import com.infomaniak.drive.ui.publicShare.PublicShareViewModel.Companion.ROOT_SHARED_FILE_ID
import com.infomaniak.drive.ui.publicShare.PublicShareViewModel.PublicShareFilesResult
import com.infomaniak.drive.utils.AccountUtils
Expand Down Expand Up @@ -286,8 +285,7 @@ class PublicShareListFragment : FileListFragment() {
importButton.setOnClickListener {
if (AccountUtils.currentDriveId == -1) {
requireContext().trackPublicShareActionEvent("createAccountAd")
// TODO : Show bottomsheet to get app if this functionality is implemented by the back
Intent(requireActivity(), LoginActivity::class.java).also(::startActivity)
safeNavigate(PublicShareListFragmentDirections.actionPublicShareListFragmentToObtainKDriveAdBottomSheet())
} else {
requireContext().trackPublicShareActionEvent("bulk${ACTION_SAVE_TO_KDRIVE_NAME.capitalizeFirstChar()}")
Intent(requireActivity(), SaveExternalFilesActivity::class.java).apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import androidx.core.view.isGone
import androidx.core.view.isVisible
import com.infomaniak.drive.data.models.File
import com.infomaniak.drive.databinding.ViewExternalFileInfoActionsBinding
import com.infomaniak.drive.utils.AccountUtils
import com.infomaniak.drive.utils.setFileItem
import com.infomaniak.drive.views.FileInfoActionsView.OnItemClickListener

Expand All @@ -37,10 +36,6 @@ class ExternalFileInfoActionsView @JvmOverloads constructor(

private val binding by lazy { ViewExternalFileInfoActionsBinding.inflate(LayoutInflater.from(context), this, true) }

init {
binding.saveToKDrive.isGone = AccountUtils.currentDriveId == -1
}

fun updateWithExternalFile(file: File) {
binding.fileView.setFileItem(file)
}
Expand Down
Loading

0 comments on commit e3fb456

Please sign in to comment.