@@ -13,24 +13,26 @@ import android.content.Context
1313import android.content.Intent
1414import android.content.pm.PackageManager
1515import android.os.Build.VERSION.SDK_INT
16+ import android.os.Bundle
1617import android.os.Parcel
1718import android.util.Log
1819import com.google.android.gms.auth.account.IWorkAccountCallback
1920import com.google.android.gms.auth.account.IWorkAccountService
20- import com.google.android.gms.auth.account.authenticator.WorkAccountAuthenticator
21- import com.google.android.gms.auth.account.authenticator.WorkAccountAuthenticator.Companion.WORK_ACCOUNT_CHANGED_BOARDCAST
22- import com.google.android.gms.auth.account.authenticator.WorkAccountAuthenticatorService
2321import com.google.android.gms.common.Feature
2422import com.google.android.gms.common.api.CommonStatusCodes
2523import com.google.android.gms.common.internal.ConnectionInfo
2624import com.google.android.gms.common.internal.GetServiceRequest
2725import com.google.android.gms.common.internal.IGmsCallbacks
2826import org.microg.gms.BaseService
27+ import org.microg.gms.auth.AuthConstants
28+ import org.microg.gms.auth.AuthRequest
2929import org.microg.gms.common.GmsService
3030import org.microg.gms.common.PackageUtils
3131
3232private const val TAG = " GmsWorkAccountService"
3333
34+ const val WORK_ACCOUNT_CHANGED_BROADCAST = " org.microg.vending.WORK_ACCOUNT_CHANGED"
35+
3436class WorkAccountService : BaseService (TAG , GmsService .WORK_ACCOUNT_API ) {
3537 override fun handleServiceRequest (
3638 callback : IGmsCallbacks ,
@@ -84,7 +86,7 @@ class WorkAccountServiceImpl(val context: Context) : IWorkAccountService.Stub()
8486
8587 val componentName = ComponentName (
8688 context,
87- WorkAccountAuthenticatorService :: class .java
89+ " org.microg.gms.auth.WorkAccountAuthenticatorService "
8890 )
8991 packageManager.setComponentEnabledSetting(
9092 componentName,
@@ -93,13 +95,72 @@ class WorkAccountServiceImpl(val context: Context) : IWorkAccountService.Stub()
9395 )
9496 }
9597
98+ /* *
99+ * @return `null` if account creation fails, the newly created account otherwise
100+ */
101+ fun addAccountInternal (
102+ accountCreationToken : String
103+ ): Account ? {
104+
105+ if (! WorkProfileSettings (context).allowCreateWorkAccount) {
106+ // TODO: communicate error to user (use `R.string.auth_work_authenticator_disabled_error`)
107+ Log .w(TAG , " creating a work account is disabled in microG settings" )
108+ return null
109+ }
110+
111+ return try {
112+ val authResponse = AuthRequest ().fromContext(context)
113+ .appIsGms()
114+ .callerIsGms()
115+ .service(" ac2dm" )
116+ .token(accountCreationToken).isAccessToken()
117+ .addAccount()
118+ .getAccountId()
119+ .droidguardResults(" null" ) // TODO
120+ .response
121+
122+ val accountManager = AccountManager .get(context)
123+ val account = Account (authResponse.email, AuthConstants .WORK_ACCOUNT_TYPE )
124+ val accountAdded = accountManager.addAccountExplicitly(
125+ account,
126+ authResponse.token, Bundle ().apply {
127+ // Work accounts have no SID / LSID ("BAD_COOKIE") and no first/last name.
128+ if (authResponse.accountId.isNotBlank()) {
129+ putString(AuthConstants .GOOGLE_USER_ID , authResponse.accountId)
130+ }
131+ putString(AuthConstants .KEY_ACCOUNT_CAPABILITIES , authResponse.capabilities)
132+ putString(AuthConstants .KEY_ACCOUNT_SERVICES , authResponse.services)
133+ if (authResponse.services != " android" ) {
134+ Log .i(
135+ TAG ,
136+ " unexpected 'services' value ${authResponse.services} (usually 'android')"
137+ )
138+ }
139+ })
140+
141+ if (accountAdded) {
142+
143+ // Notify vending package
144+ context.sendBroadcast(
145+ Intent (WORK_ACCOUNT_CHANGED_BROADCAST ).setPackage(" com.android.vending" )
146+ )
147+
148+ // Report successful creation to caller
149+ account
150+ } else null
151+ } catch (exception: Exception ) {
152+ Log .w(TAG , " Failed to add work account." , exception)
153+ null
154+ }
155+ }
156+
96157 override fun addWorkAccount (
97158 callback : IWorkAccountCallback ? ,
98159 token : String
99160 ) {
100161 Log .d(TAG , " addWorkAccount with token $token " )
101162 Thread {
102- WorkAccountAuthenticator (context). addAccountInternal(token)?.let {
163+ addAccountInternal(token)?.let {
103164 callback?.onAccountAdded(it)
104165 }
105166 }.start()
@@ -117,7 +178,7 @@ class WorkAccountServiceImpl(val context: Context) : IWorkAccountService.Stub()
117178
118179 // Notify vending package
119180 context.sendBroadcast(
120- Intent (WORK_ACCOUNT_CHANGED_BOARDCAST ).setPackage(" com.android.vending" )
181+ Intent (WORK_ACCOUNT_CHANGED_BROADCAST ).setPackage(" com.android.vending" )
121182 )
122183
123184 callback?.onAccountRemoved(success)
0 commit comments