/* * Copyright 2012 GitHub Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.mobile.gauges.authenticator; import static android.accounts.AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE; import static android.accounts.AccountManager.KEY_ACCOUNT_NAME; import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE; import static android.accounts.AccountManager.KEY_AUTHTOKEN; import static android.accounts.AccountManager.KEY_BOOLEAN_RESULT; import static android.accounts.AccountManager.KEY_INTENT; import static com.github.mobile.gauges.authenticator.AuthConstants.AUTHTOKEN_TYPE; import static com.github.mobile.gauges.authenticator.AuthConstants.GAUGES_ACCOUNT_TYPE; import static com.github.mobile.gauges.authenticator.GaugesAuthenticatorActivity.PARAM_AUTHTOKEN_TYPE; import android.accounts.AbstractAccountAuthenticator; import android.accounts.Account; import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; import android.accounts.NetworkErrorException; import android.content.Context; import android.content.Intent; import android.os.Bundle; import com.github.mobile.gauges.core.Client; import com.github.mobile.gauges.core.GaugesService; import java.io.IOException; class GaugesAccountAuthenticator extends AbstractAccountAuthenticator { private static final String DESCRIPTION_CLIENT = "Gaug.es for Android"; private final Context context; public GaugesAccountAuthenticator(Context context) { super(context); this.context = context; } /* * The user has requested to add a new account to the system. We return an intent that will launch our login screen * if the user has not logged in yet, otherwise our activity will just pass the user's credentials on to the account * manager. */ @Override public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException { final Intent intent = new Intent(context, GaugesAuthenticatorActivity.class); intent.putExtra(PARAM_AUTHTOKEN_TYPE, authTokenType); intent.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); final Bundle bundle = new Bundle(); bundle.putParcelable(KEY_INTENT, intent); return bundle; } @Override public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) { return null; } @Override public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { return null; } @Override public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { String password = AccountManager.get(context).getPassword(account); Client client; try { GaugesService service = new GaugesService(account.name, password); client = service.getClient(DESCRIPTION_CLIENT); if (client == null) client = service.createClient(DESCRIPTION_CLIENT); } catch (IOException e) { throw new NetworkErrorException(e); } Bundle bundle = new Bundle(); bundle.putString(KEY_ACCOUNT_NAME, account.name); bundle.putString(KEY_ACCOUNT_TYPE, GAUGES_ACCOUNT_TYPE); bundle.putString(KEY_AUTHTOKEN, client.getKey()); return bundle; } @Override public String getAuthTokenLabel(String authTokenType) { return authTokenType.equals(AUTHTOKEN_TYPE) ? authTokenType : null; } @Override public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException { final Bundle result = new Bundle(); result.putBoolean(KEY_BOOLEAN_RESULT, false); return result; } @Override public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) { return null; } }