/** Insert all new local files in Google Drive. */ private void insertNewLocalFiles() { Uri uri = getNotesUri(mAccount.name); try { Cursor cursor = mProvider.query( uri, PROJECTION, NotePad.Notes.COLUMN_NAME_FILE_ID + " is NULL", null, null); Log.d(TAG, "Inserting new local files: " + cursor.getCount()); if (cursor.moveToFirst()) { do { Uri localFileUri = getNoteUri(mAccount.name, cursor.getString(COLUMN_INDEX_ID)); if (cursor.getShort(COLUMN_INDEX_DELETED) != 0) { mProvider.delete(localFileUri, null, null); } else { File newFile = new File(); newFile.setTitle(cursor.getString(COLUMN_INDEX_TITLE)); newFile.setMimeType(TEXT_PLAIN); String content = cursor.getString(COLUMN_INDEX_NOTE); try { File insertedFile = null; if (content != null && content.length() > 0) { insertedFile = mService .files() .insert(newFile, ByteArrayContent.fromString(TEXT_PLAIN, content)) .execute(); } else { insertedFile = mService.files().insert(newFile).execute(); } // Update the local file to add the file ID. ContentValues values = new ContentValues(); values.put( NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, insertedFile.getModifiedDate().getValue()); values.put( NotePad.Notes.COLUMN_NAME_CREATE_DATE, insertedFile.getCreatedDate().getValue()); values.put(NotePad.Notes.COLUMN_NAME_FILE_ID, insertedFile.getId()); mProvider.update(localFileUri, values, null, null); } catch (IOException e) { e.printStackTrace(); } } } while (cursor.moveToNext()); } } catch (RemoteException e) { e.printStackTrace(); } }
/** * Merge a local file with a Google Drive File. * * <p>The last modification is used to check which file to sync from. Then, the md5 checksum of * the file is used to check whether or not the file's content should be sync'ed. * * @param localFileUri Local file URI to save local changes against. * @param localFile Local file cursor to retrieve data from. * @param driveFile Google Drive file. */ private void mergeFiles(Uri localFileUri, Cursor localFile, File driveFile) { long localFileModificationDate = localFile.getLong(COLUMN_INDEX_MODIFICATION_DATE); Log.d( TAG, "Modification dates: " + localFileModificationDate + " - " + driveFile.getModifiedDate().getValue()); if (localFileModificationDate > driveFile.getModifiedDate().getValue()) { try { if (localFile.getShort(COLUMN_INDEX_DELETED) != 0) { Log.d(TAG, " > Deleting Drive file."); mService.files().delete(driveFile.getId()).execute(); mProvider.delete(localFileUri, null, null); } else { String localNote = localFile.getString(COLUMN_INDEX_NOTE); File updatedFile = null; // Update drive file. Log.d(TAG, " > Updating Drive file."); driveFile.setTitle(localFile.getString(COLUMN_INDEX_TITLE)); if (md5(localNote) != driveFile.getMd5Checksum()) { // Update both content and metadata. ByteArrayContent content = ByteArrayContent.fromString(TEXT_PLAIN, localNote); updatedFile = mService.files().update(driveFile.getId(), driveFile, content).execute(); } else { // Only update the metadata. updatedFile = mService.files().update(driveFile.getId(), driveFile).execute(); } ContentValues values = new ContentValues(); values.put( NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, updatedFile.getModifiedDate().getValue()); mProvider.update(localFileUri, values, null, null); } } catch (IOException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } else if (localFileModificationDate < driveFile.getModifiedDate().getValue()) { // Update local file. Log.d(TAG, " > Updating local file."); ContentValues values = new ContentValues(); values.put(NotePad.Notes.COLUMN_NAME_TITLE, driveFile.getTitle()); values.put( NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, driveFile.getModifiedDate().getValue()); // Only download the content if it has changed. if (md5(localFile.getString(COLUMN_INDEX_NOTE)) != driveFile.getMd5Checksum()) { values.put(NotePad.Notes.COLUMN_NAME_NOTE, getFileContent(driveFile)); } try { mProvider.update(localFileUri, values, null, null); } catch (RemoteException e) { e.printStackTrace(); } } }
private void syncNotes(final String syncAccountName, final String accessToken) { final Drive drive = getDriveService(syncAccountName, accessToken); ContentResolver cr = getContentResolver(); try { // loop over saved files and add any new notes to drive Cursor savedNotes = cr.query(NotesProvider.CONTENT_URI, NotesSyncQuery.PROJECTION, null, null, null); if (savedNotes.moveToFirst()) { do { final String driveId = savedNotes.getString(NotesSyncQuery.DRIVE_ID); if (TextUtils.isEmpty(driveId)) { // exists locally but not in drive Ð upload it File newNote = new File(); newNote.setTitle(savedNotes.getString(NotesSyncQuery.TITLE)); newNote.setMimeType(NOTE_MIME_TYPE); File inserted = drive .files() .insert( newNote, ByteArrayContent.fromString( NOTE_MIME_TYPE, savedNotes.getString(NotesSyncQuery.BODY))) .execute(); // save the drive id to the db ContentValues cv = new ContentValues(); cv.put(NotesProvider.KEY_DRIVE_ID, inserted.getId()); Uri noteUri = ContentUris.withAppendedId( NotesProvider.CONTENT_URI, savedNotes.getLong(NotesSyncQuery.ID)); cr.update(noteUri, cv, null, null); } else { // TODO compare timestamps etc. } } while (savedNotes.moveToNext()); } // loop over all files in drive and see if any need to be // synced locally FileList driveFilesList = drive.files().list().execute(); for (File remote : driveFilesList.getItems()) { if (remote.getLabels().getTrashed()) { // skip deleted files continue; } final String where = NotesProvider.KEY_DRIVE_ID + "=?"; final String[] arguments = new String[] {remote.getId()}; Cursor c = cr.query( NotesProvider.CONTENT_URI, NotesDownloadQuery.PROJECTION, where, arguments, null); if (c.getCount() == 0) { // exists in drive but not locally Ð download it final String title = remote.getTitle(); final String body = getFileContents(drive, remote.getDownloadUrl()); final ContentValues cv = new ContentValues(); cv.put(NotesProvider.KEY_TITLE, title); cv.put(NotesProvider.KEY_BODY, body); cv.put(NotesProvider.KEY_DRIVE_ID, remote.getId()); cv.put(NotesProvider.KEY_LAST_MODIFIED, remote.getModifiedDate().getValue()); cr.insert(NotesProvider.CONTENT_URI, cv); } else { // TODO compare timestamps etc. } } } catch (IOException e) { // FIXME error handling Log.e(getClass().getSimpleName(), "Drive esplode", e); } }