Loading app/src/main/java/foundation/e/accountmanager/Constants.kt +3 −1 Original line number Diff line number Diff line Loading @@ -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 } app/src/main/java/foundation/e/accountmanager/ECloudAccountHelper.kt 0 → 100644 +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 app/src/main/java/foundation/e/accountmanager/ui/AccountListFragment.kt +10 −9 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) Loading Loading @@ -153,7 +155,6 @@ class AccountListFragment: ListFragment() { networkReceiver?.let { getApplication<Application>().unregisterReceiver(it) } else networkCallback?.let { connectivityManager.unregisterNetworkCallback(it) Loading app/src/main/java/foundation/e/accountmanager/ui/setup/DetectConfigurationFragment.kt +17 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) Loading app/src/main/java/foundation/e/accountmanager/ui/setup/EeloAuthenticatorFragment.kt +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() { Loading @@ -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 } Loading @@ -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) Loading @@ -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("") } } } Loading @@ -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) Loading @@ -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() != "")) { Loading @@ -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 } Loading @@ -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 Loading @@ -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 Loading
app/src/main/java/foundation/e/accountmanager/Constants.kt +3 −1 Original line number Diff line number Diff line Loading @@ -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 }
app/src/main/java/foundation/e/accountmanager/ECloudAccountHelper.kt 0 → 100644 +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
app/src/main/java/foundation/e/accountmanager/ui/AccountListFragment.kt +10 −9 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) Loading Loading @@ -153,7 +155,6 @@ class AccountListFragment: ListFragment() { networkReceiver?.let { getApplication<Application>().unregisterReceiver(it) } else networkCallback?.let { connectivityManager.unregisterNetworkCallback(it) Loading
app/src/main/java/foundation/e/accountmanager/ui/setup/DetectConfigurationFragment.kt +17 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) Loading
app/src/main/java/foundation/e/accountmanager/ui/setup/EeloAuthenticatorFragment.kt +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() { Loading @@ -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 } Loading @@ -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) Loading @@ -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("") } } } Loading @@ -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) Loading @@ -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() != "")) { Loading @@ -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 } Loading @@ -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 Loading @@ -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