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

Commit 2a0a21dc authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

Merge branch '1087-Block_multiple_ecloud_account_login' into 'master'

1087-Block_multiple_ecloud_account_login

See merge request !29
parents 61d2feb5 0cf91807
Loading
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -31,5 +31,7 @@ object Constants {

    const val AUTH_TOKEN_TYPE = "oauth2-access-token"

    const val EELO_SYNC_URL = "https://ecloud.global"
    const val EELO_SYNC_SCHEME = "https://"
    const val EELO_SYNC_HOST = "ecloud.global"
    const val EELO_SYNC_URL = EELO_SYNC_SCHEME + EELO_SYNC_HOST
}
+26 −0
Original line number Diff line number Diff line
package foundation.e.accountmanager

import android.accounts.AccountManager
import android.app.Activity
import android.content.Context
import com.google.android.material.dialog.MaterialAlertDialogBuilder

object ECloudAccountHelper {

    fun alreadyHasECloudAccount(context: Context) : Boolean {
        val accountManager = AccountManager.get(context)
        val eCloudAccounts = accountManager.getAccountsByType(context.getString(R.string.eelo_account_type))
        return eCloudAccounts.isNotEmpty()
    }

    fun showMultipleECloudAccountNotAcceptedDialog(activity: Activity) {
        MaterialAlertDialogBuilder(activity, R.style.CustomAlertDialogStyle)
                .setIcon(R.drawable.ic_error_dark)
                .setMessage(R.string.multiple_ecloud_account_not_permitted_message)
                .setCancelable(false)
                .setPositiveButton(android.R.string.ok) { _, _ ->
                    activity.finish()
                }
                .show()
    }
}
 No newline at end of file
+10 −9
Original line number Diff line number Diff line
@@ -79,7 +79,8 @@ class AccountListFragment: ListFragment() {
        override fun getView(position: Int, _v: View?, parent: ViewGroup): View {
            val account = getItem(position)!!

            val v = _v ?: LayoutInflater.from(context).inflate(R.layout.account_list_item, parent, false)
            val v = _v
                    ?: LayoutInflater.from(context).inflate(R.layout.account_list_item, parent, false)
            v.account_name.text = account.name

            return v
@@ -99,6 +100,7 @@ class AccountListFragment: ListFragment() {

        private val accountManager = AccountManager.get(getApplication())!!
        private val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        init {
            accountManager.addOnAccountsUpdatedListener(this, null, true)

@@ -153,7 +155,6 @@ class AccountListFragment: ListFragment() {
                networkReceiver?.let {
                    getApplication<Application>().unregisterReceiver(it)
                }

            else
                networkCallback?.let {
                    connectivityManager.unregisterNetworkCallback(it)
+17 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import foundation.e.accountmanager.R
import foundation.e.accountmanager.log.Logger
import foundation.e.accountmanager.ui.DebugInfoActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import foundation.e.accountmanager.Constants
import foundation.e.accountmanager.ECloudAccountHelper
import java.lang.ref.WeakReference
import java.util.logging.Level
import kotlin.concurrent.thread
@@ -36,6 +38,11 @@ class DetectConfigurationFragment: Fragment() {
        loginModel = ViewModelProviders.of(requireActivity()).get(LoginModel::class.java)
        model = ViewModelProviders.of(this).get(DetectConfigurationModel::class.java)

        if (model.blockProceedWithLogin(loginModel)) {
            ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity())
            return;
        } 

        model.detectConfiguration(loginModel).observe(this, Observer<DavResourceFinder.Configuration> { result ->
            // save result for next step
            loginModel.configuration = result
@@ -66,6 +73,16 @@ class DetectConfigurationFragment: Fragment() {
        private var detectionThread: WeakReference<Thread>? = null
        private var result = MutableLiveData<DavResourceFinder.Configuration>()

        /**
         * User can't login using multiple ecloud accounts.
         * This method checks if the login host is eelo_host then, check user already has any eelo account set up.
         * If found eCloundAccount return true, false otherwise.
         */
        fun blockProceedWithLogin(loginModel: LoginModel) : Boolean {
            val context = getApplication<Application>()
            return (loginModel.baseURI?.host.equals(Constants.EELO_SYNC_HOST) && ECloudAccountHelper.alreadyHasECloudAccount(context))
        }

        fun detectConfiguration(loginModel: LoginModel): LiveData<DavResourceFinder.Configuration> {
            synchronized(result) {
                if (detectionThread != null)
+57 −58
Original line number Diff line number Diff line
package foundation.e.accountmanager.ui.setup

import android.content.Context
import android.net.MailTo
import android.os.*
import androidx.fragment.app.Fragment
import android.net.ConnectivityManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import android.net.Uri
import android.net.ConnectivityManager

import foundation.e.accountmanager.R
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import org.json.JSONObject
import foundation.e.accountmanager.ECloudAccountHelper
import foundation.e.accountmanager.R
import foundation.e.accountmanager.databinding.FragmentEeloAuthenticatorBinding
import foundation.e.accountmanager.model.Credentials
import kotlinx.android.synthetic.main.fragment_eelo_authenticator.*
import foundation.e.dav4jvm.Constants
import kotlinx.android.synthetic.main.fragment_eelo_authenticator.view.*
import java.net.IDN
import java.net.URI
import java.net.URISyntaxException
import java.util.logging.Level
import foundation.e.accountmanager.model.Credentials

class EeloAuthenticatorFragment : Fragment() {

@@ -33,7 +26,7 @@ class EeloAuthenticatorFragment : Fragment() {
    var toggleButtonState = false

    private fun isNetworkAvailable(): Boolean {
        val connectivityManager = activity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val connectivityManager = requireActivity().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val activeNetworkInfo = connectivityManager.activeNetworkInfo
        return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
    }
@@ -46,7 +39,7 @@ class EeloAuthenticatorFragment : Fragment() {

        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
            requireActivity().finish()
        }

        val v = FragmentEeloAuthenticatorBinding.inflate(inflater, container, false)
@@ -60,9 +53,9 @@ class EeloAuthenticatorFragment : Fragment() {
                if (v.urlpwd_user_name.text.toString().contains("@")) {
                    val dns = v.urlpwd_user_name.text.toString().substringAfter("@")
                    val pre_custom_url = "https://" + dns
                    view!!.urlpwd_server_uri.setText(pre_custom_url)
                    requireView().urlpwd_server_uri.setText(pre_custom_url)
                } else {
                    view!!.urlpwd_server_uri.setText("")
                    requireView().urlpwd_server_uri.setText("")
                }
            }
        }
@@ -88,6 +81,13 @@ class EeloAuthenticatorFragment : Fragment() {
        return v.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (model.blockProceedWithLogin()) {
            ECloudAccountHelper.showMultipleECloudAccountNotAcceptedDialog(requireActivity())
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        outState.putBoolean(TOGGLE_BUTTON_CHECKED_KEY, toggleButtonState)
        super.onSaveInstanceState(outState)
@@ -96,7 +96,7 @@ class EeloAuthenticatorFragment : Fragment() {
    private fun login() {
        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
            requireActivity().finish()
        }

        if ((urlpwd_user_name.text.toString() != "") && (urlpwd_password.text.toString() != "")) {
@@ -119,7 +119,7 @@ class EeloAuthenticatorFragment : Fragment() {
        fun validateUrl() {

            if (toggleButtonState == true) {
            	serverUrl = view!!.urlpwd_server_uri.text.toString();
                serverUrl = requireView().urlpwd_server_uri.text.toString();
            } else {
                serverUrl = foundation.e.accountmanager.Constants.EELO_SYNC_URL
            }
@@ -142,8 +142,8 @@ class EeloAuthenticatorFragment : Fragment() {
            model.loginWithUrlAndTokens.value == true -> {
                validateUrl()

		val userName = view!!.urlpwd_user_name.text.toString()
		val password = view!!.urlpwd_password.text.toString()
                val userName = requireView().urlpwd_user_name.text.toString()
                val password = requireView().urlpwd_password.text.toString()

                if (loginModel.baseURI != null) {
                    valid = true
@@ -167,8 +167,7 @@ class EeloAuthenticatorFragment : Fragment() {
            urlpwd_server_uri_layout.setVisibility(View.VISIBLE)
            urlpwd_server_uri.setEnabled(true)
            toggleButtonState = true;
        }
        else {
        } else {
            urlpwd_server_uri_layout.setVisibility(View.GONE)
            urlpwd_server_uri.setEnabled(false)
            toggleButtonState = false;
Loading