package com.jackpf.apkdownloader.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerFuture;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
import com.jackpf.apkdownloader.R;
import com.jackpf.apkdownloader.Exception.AuthenticationException;
public class Authenticator
{
/**
* Context
*/
private Context context;
/**
* Auth sub-token
*/
private static String subToken;
/**
* Preferences instance
*/
private SharedPreferences prefs;
/**
* Google login credentials
*/
private String email, password;
/**
* Auth service to get token for
*/
private final String AUTH_SERVICE = "androidsecure";
/**
* Auth account type
*/
private final String AUTH_ACCOUNT_TYPE = "HOSTED_OR_GOOGLE";
/**
* Client login url
*/
private final String AUTH_URL = "https://www.google.com/accounts/ClientLogin";
/**
* Constructor
*
* @param context
*/
public Authenticator(Context context)
{
this.context = context;
prefs = PreferenceManager.getDefaultSharedPreferences(context);
email = prefs.getString(context.getString(R.string.pref_email_key), context.getString(R.string.pref_email_default));
password = prefs.getString(context.getString(R.string.pref_password_key), context.getString(R.string.pref_password_default));
}
/**
* Get authentication token
*
* @throws AuthenticationException
* @return
*/
public String getToken() throws AuthenticationException
{
// Attempt to use OAuth
try {
AccountManager am = AccountManager.get(context);
Account[] accounts = am.getAccountsByType("com.google");
AccountManagerFuture<Bundle> accountManagerFuture;
accountManagerFuture = am.getAuthToken(accounts[0], "androidsecure", null, (Activity) context, null, null);
Bundle authTokenBundle = accountManagerFuture.getResult();
subToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString();
} catch (Exception e) {
e.printStackTrace();
}
if (subToken == null) {
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("service", AUTH_SERVICE));
params.add(new BasicNameValuePair("accountType", AUTH_ACCOUNT_TYPE));
params.add(new BasicNameValuePair("Email", email));
params.add(new BasicNameValuePair("Passwd", password));
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(AUTH_URL);
post.addHeader("Content-Type", "application/x-www-form-urlencoded");
post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response = client.execute(post);
if (response.getStatusLine().getStatusCode() != 200) {
throw new AuthenticationException(String.format("Login responded with status code %d", response.getStatusLine().getStatusCode()));
}
String data = EntityUtils.toString(response.getEntity());
StringTokenizer st = new StringTokenizer(data, "\n\r=");
while (st.hasMoreTokens()) {
if (st.nextToken().equalsIgnoreCase("Auth")) {
subToken = st.nextToken();
break;
}
}
if (subToken == null) {
throw new AuthenticationException("Auth key not found");
}
} catch (Exception e) {
throw new AuthenticationException(e.getMessage(), e);
}
}
return subToken;
}
/**
* Get android id
*
* @return
*/
public String getAndroidId()
{
return Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
}
/**
* Get google services framework id
*
* @return
*/
public String getGsfId()
{
// Return preference if set
String gsfid = prefs.getString(context.getString(R.string.pref_gsfid_key), context.getString(R.string.pref_gsfid_default));
if (!gsfid.equals("")) {
return gsfid;
}
// Otherwise attempt to get it from google services
Cursor c = context.getContentResolver().query(
Uri.parse("content://com.google.android.gsf.gservices"),
null,
null,
new String[]{"android_id"},
null
);
if (c == null || !c.moveToFirst() || c.getColumnCount() < 2) {
return null;
}
try {
return Long.toHexString(Long.parseLong(c.getString(1)));
} catch (NumberFormatException e) {
return null;
} finally {
c.close();
}
}
}