package com.survivingwithandroid.accountnavigationdrawer;
/*
* Copyright (C) 2013 Surviving with Android (http://www.survivingwithandroid.com)
*
* 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.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.TransactionTooLargeException;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.Spinner;
import android.support.v4.widget.DrawerLayout;
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private GoogleAccountCredential credential;
private static Drive service;
private static String MIME_FOLDER = "application/vnd.google-apps.folder";
private static final int REQUEST_AUTHORIZATION = 1;
private FrameLayout frame;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] itmes = getResources().getStringArray(R.array.items_array);
frame = (FrameLayout) findViewById(R.id.content_frame);
Spinner spinner = (Spinner) findViewById(R.id.spinnerAccount);
String[] items = new String[]{"item1","item2","item3"};
AccountManager accMgr = AccountManager.get(this);
Account[] accountList = accMgr.getAccounts();
final String[] accountNames = new String[accountList.length + 1];
int i=1;
accountNames[0] = getResources().getString(R.string.infospinner);
for (Account account : accountList) {
String name = account.name;
accountNames[i++] = name;
}
ArrayAdapter<String> adp = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, accountNames);
spinner.setAdapter(adp);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
System.out.println("Pos ["+position+"]");
if (position == 0)
return ;
String currentAccount = accountNames[position];
credential = GoogleAccountCredential.usingOAuth2(MainActivity.this, DriveScopes.DRIVE);
credential.setSelectedAccountName(currentAccount);
service = getDriveService(credential);
AsyncAuth auth = new AsyncAuth();
auth.execute("");
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, itmes));
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
// We should handle actionbar event correctly
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_AUTHORIZATION:
System.out.println("Auth request");
if (resultCode == Activity.RESULT_OK) {
AsyncAuth auth = new AsyncAuth();
auth.execute("");
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class AsyncAuth extends AsyncTask<String, Void, List<File>> {
@Override
protected void onPreExecute() {
WaitFragment wf = new WaitFragment();
FragmentManager manager = MainActivity.this.getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.replace(R.id.content_frame, wf);
trans.commit();
}
@Override
protected List<File> doInBackground(String... params) {
List<File> fileList = new ArrayList<File>();
try {
Files.List request = service.files().list().setQ("mimeType = '" + MIME_FOLDER + "'");
FileList files = request.execute();
fileList = files.getItems();
System.out.println("File List ["+fileList+"]");
}
catch(UserRecoverableAuthIOException e) {
System.out.println("Intent e ["+e.getIntent()+"]");
startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
} catch (IOException e1) {
e1.printStackTrace();
}
return fileList;
}
@Override
protected void onPostExecute(List<File> result) {
FragmentManager manager = MainActivity.this.getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
ListFragment lf = new ListFragment();
List<String> itemList = new ArrayList<String>();
for (File f : result) {
itemList.add(f.getTitle());
System.out.println("Title ["+f.getTitle()+"]");
}
lf.setItemList(itemList);
trans.replace(R.id.content_frame, lf);
trans.commit();
}
}
private Drive getDriveService(GoogleAccountCredential credential) {
return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential)
.build();
}
}