package com.RSen.Commandr.builtincommands; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import com.RSen.Commandr.R; import com.RSen.Commandr.core.MyAccessibilityService; import com.RSen.Commandr.util.GoogleNowUtil; import com.RSen.Commandr.util.TTSService; import com.google.android.gms.auth.GoogleAuthUtil; import com.google.android.gms.auth.UserRecoverableAuthException; import com.google.android.gms.common.AccountPicker; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.model.ListMessagesResponse; import com.google.api.services.gmail.model.Message; import com.google.api.services.gmail.model.MessagePartHeader; import java.util.ArrayList; import java.util.List; /** * @author Ryan Senanayake * Commandr for Google Now * FlashlightActivity.java * @version 1.0 * 5/28/14 */ public class ReadUnreadGmailActivity extends Activity { private static final String GMAIL_SCOPE = "oauth2:https://www.googleapis.com/auth/gmail.readonly"; private static final String APP_NAME = "Commandr"; String accountName; Gmail mailService; SharedPreferences sharedPrefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Shows Account Picker with google accounts if not stored in shared // preferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); Boolean accountFound = false; if (sharedPrefs.contains("gmailId")) { Account[] accounts = AccountManager.get(this) .getAccounts(); accountName = sharedPrefs.getString("gmailId", null); for (Account a : accounts) { if (a.type.equals(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE) && a.name.equals(accountName)) { accountFound = true; new getAuthToken().execute(); break; } } } if (!accountFound) { Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null); startActivityForResult(googlePicker, 1); } } // Gets selected email account and runs getAuthToken AsyncTask for selected // account @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == Activity.RESULT_OK) { accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); Editor editor = sharedPrefs.edit(); editor.putString("gmailId", accountName); editor.apply(); new getAuthToken().execute(); } } // Gets oauth2 token using Play Services SDK and runs connectIMAP task after // receiving token public class getAuthToken extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... params) { try { String token = GoogleAuthUtil.getToken(ReadUnreadGmailActivity.this, accountName, GMAIL_SCOPE); GoogleCredential credential = new GoogleCredential() .setAccessToken(token); HttpTransport httpTransport = new NetHttpTransport(); JsonFactory jsonFactory = new JacksonFactory(); mailService = new Gmail.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build(); // Retrieve a page of Threads; max of 100 by default. ListMessagesResponse response = mailService.users().messages().list("me").setQ("is:unread in:inbox").execute(); List<Message> messages = new ArrayList<Message>(); while (response.getMessages() != null) { messages.addAll(response.getMessages()); if (response.getNextPageToken() != null) { String pageToken = response.getNextPageToken(); response = mailService.users().messages().list("me").setQ("is:unread in:inbox") .setPageToken(pageToken).execute(); } else { break; } } String toSpeak; switch (messages.size()) { case 0: toSpeak = getString(R.string.no_unread) + " "; break; case 1: toSpeak = getString(R.string.one_unread) + " "; break; default: toSpeak = getString(R.string.there_are) + " " + messages.size() + " " + getString(R.string.unread_messages) + " "; break; } for (Message message : messages) { message = mailService.users().messages().get("me", message.getId()).setFormat("full").setFields("payload, snippet").execute(); for (MessagePartHeader header : message.getPayload().getHeaders()) { if (header.getName().equals("From")) { toSpeak += header.getValue().split("<")[0].trim().replace("\\", "").replace("\"", "") + " " + getString(R.string.sent) + " "; } } toSpeak += message.getSnippet() + ". "; } return toSpeak; } catch (UserRecoverableAuthException e) { startActivityForResult(e.getIntent(), 1); } catch (Exception e) { e.printStackTrace(); } return getString(R.string.error_gmail); } @Override protected void onPostExecute(String result) { Intent i = new Intent(ReadUnreadGmailActivity.this, TTSService.class); i.putExtra("toSpeak", result); startService(i); try { GoogleNowUtil.resetGoogleNow(MyAccessibilityService.getInstance()); } catch (Exception e) { GoogleNowUtil.resetGoogleNow(ReadUnreadGmailActivity.this); } finish(); } } }