Add make track public in sharing dialog.

This commit is contained in:
Jimmy Shih
2013-06-06 14:58:12 -07:00
parent c8736b7f72
commit efa6f53fdf
14 changed files with 186 additions and 83 deletions
@@ -16,16 +16,15 @@
package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.fragments.AddEmailsDialogFragment;
import com.google.android.apps.mytracks.fragments.AddEmailsDialogFragment.AddEmailsCaller;
import com.google.android.apps.mytracks.fragments.CheckPermissionFragment;
import com.google.android.apps.mytracks.fragments.CheckPermissionFragment.CheckPermissionCaller;
import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment;
import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment.ChooseAccountCaller;
import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller;
import com.google.android.apps.mytracks.fragments.InstallEarthDialogFragment;
import com.google.android.apps.mytracks.fragments.ShareTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.ShareTrackDialogFragment.ShareTrackCaller;
import com.google.android.apps.mytracks.io.drive.SendDriveActivity;
import com.google.android.apps.mytracks.io.file.SaveActivity;
import com.google.android.apps.mytracks.io.file.TrackFileFormat;
@@ -66,7 +65,7 @@ import java.io.IOException;
* @author Jimmy Shih
*/
public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActivity implements
ChooseAccountCaller, CheckPermissionCaller, AddEmailsCaller, ConfirmCaller {
ChooseAccountCaller, CheckPermissionCaller, ShareTrackCaller, ConfirmCaller {
private static final String TAG = AbstractMyTracksActivity.class.getSimpleName();
private static final String SEND_REQUEST_KEY = "send_request_key";
@@ -182,13 +181,12 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
}
@Override
public void onAddEmailsDone(String emails) {
if (emails != null && !emails.equals("")) {
sendRequest.setDriveShareEmails(emails);
Intent intent = IntentUtils.newIntent(this, SendDriveActivity.class)
.putExtra(SendRequest.SEND_REQUEST_KEY, sendRequest);
startActivity(intent);
}
public void onShareTrackDone(String emails, boolean makePublic) {
sendRequest.setDriveShareEmails(emails);
sendRequest.setDriveSharePublic(makePublic);
Intent intent = IntentUtils.newIntent(this, SendDriveActivity.class)
.putExtra(SendRequest.SEND_REQUEST_KEY, sendRequest);
startActivity(intent);
}
private void onDrivePermissionSuccess() {
@@ -260,15 +258,11 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
* <p>
* isSendDrive and isDriveEnableSync -> enable sync
* <p>
* isSendDrive and isDriveShare -> show {@link AddEmailsDialogFragment}
* isSendDrive and isDriveShare -> show {@link ShareTrackDialogFragment}
* <p>
* isSendDrive -> start {@link SendDriveActivity}
* <p>
* isSendMaps and isMapShare -> show {@link ChooseActivityDialogFragment}
* <p>
* isSendMaps and isMapsExistingMap -> start {@link ChooseMapActivity}
* <p>
* isSendMaps and !isMapsExistingMap -> {@link SendMapsActivity}
* isSendMaps -> start {@link SendMapsActivity}
* <p>
* isSendFusionTables -> start {@link SendFusionTablesActivity}
* <p>
@@ -292,8 +286,8 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
SyncUtils.enableSync(sendRequest.getAccount());
return;
} else if (sendRequest.isDriveShare()) {
AddEmailsDialogFragment.newInstance(sendRequest.getTrackId())
.show(getSupportFragmentManager(), AddEmailsDialogFragment.ADD_EMAILS_DIALOG_TAG);
ShareTrackDialogFragment.newInstance(sendRequest.getTrackId())
.show(getSupportFragmentManager(), ShareTrackDialogFragment.SHARE_TRACK_DIALOG_TAG);
return;
} else {
next = SendDriveActivity.class;
@@ -344,7 +338,7 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
protected void confirmShare(long trackId) {
ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key,
PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT,
getString(R.string.share_track_drive_confirm_message), new long[] { trackId })
getString(R.string.share_track_confirm_message), new long[] { trackId })
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
}
@@ -124,7 +124,7 @@ public class ChooseActivityDialogFragment extends DialogFragment {
caller.onChooseActivityDone(
activityInfo.applicationInfo.packageName, activityInfo.name);
}
}).setTitle(R.string.share_track_picker_title).create();
}).setTitle(R.string.share_track_share_url_title).create();
}
@Override
@@ -30,64 +30,69 @@ import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.widget.CheckBox;
import android.widget.FilterQueryProvider;
import android.widget.MultiAutoCompleteTextView;
/**
* A DialogFragment to add emails.
* A DialogFragment to share a track.
*
* @author Jimmy Shih
*/
public class AddEmailsDialogFragment extends DialogFragment {
public class ShareTrackDialogFragment extends DialogFragment {
/**
* Interface for caller of this dialog fragment.
*
* @author Jimmy Shih
*/
public interface AddEmailsCaller {
public interface ShareTrackCaller {
/**
* Called when add emails is done.
* Called when share track is done.
*
* @param emails the added emails
* @param makePublic true to make the track public
*/
public void onAddEmailsDone(String emails);
public void onShareTrackDone(String emails, boolean makePublic);
}
public static final String ADD_EMAILS_DIALOG_TAG = "addEmailsDialog";
public static final String SHARE_TRACK_DIALOG_TAG = "shareTrackDialog";
private static final String KEY_TRACK_ID = "trackId";
public static AddEmailsDialogFragment newInstance(long trackId) {
public static ShareTrackDialogFragment newInstance(long trackId) {
Bundle bundle = new Bundle();
bundle.putLong(KEY_TRACK_ID, trackId);
AddEmailsDialogFragment addPeopleDialogFragment = new AddEmailsDialogFragment();
addPeopleDialogFragment.setArguments(bundle);
return addPeopleDialogFragment;
ShareTrackDialogFragment shareleTrackDialogFragment = new ShareTrackDialogFragment();
shareleTrackDialogFragment.setArguments(bundle);
return shareleTrackDialogFragment;
}
private AddEmailsCaller caller;
private ShareTrackCaller caller;
private FragmentActivity fragmentActivity;
private MultiAutoCompleteTextView multiAutoCompleteTextView;
private CheckBox checkBox;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
caller = (AddEmailsCaller) activity;
caller = (ShareTrackCaller) activity;
} catch (ClassCastException e) {
throw new ClassCastException(
activity.toString() + " must implement " + AddEmailsCaller.class.getSimpleName());
activity.toString() + " must implement " + ShareTrackCaller.class.getSimpleName());
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
fragmentActivity = getActivity();
View view = fragmentActivity.getLayoutInflater().inflate(R.layout.add_emails, null);
multiAutoCompleteTextView = (MultiAutoCompleteTextView) view.findViewById(R.id.add_emails);
View view = fragmentActivity.getLayoutInflater().inflate(R.layout.share_track, null);
multiAutoCompleteTextView = (MultiAutoCompleteTextView) view.findViewById(
R.id.share_track_emails);
multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
SimpleCursorAdapter adapter = new SimpleCursorAdapter(fragmentActivity,
@@ -109,15 +114,17 @@ public class AddEmailsDialogFragment extends DialogFragment {
});
multiAutoCompleteTextView.setAdapter(adapter);
checkBox = (CheckBox) view.findViewById(R.id.share_track_public);
return new AlertDialog.Builder(fragmentActivity).setNegativeButton(
R.string.generic_cancel, null)
.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String acl = multiAutoCompleteTextView.getText().toString();
caller.onAddEmailsDone(acl);
caller.onShareTrackDone(acl, checkBox.isChecked());
}
}).setTitle(R.string.share_track_add_emails_title).setView(view).create();
}).setTitle(R.string.share_track_title).setView(view).create();
}
/**
@@ -37,8 +37,8 @@ public class SendDriveActivity extends AbstractSendActivity {
@Override
protected AbstractSendAsyncTask createAsyncTask() {
return new SendDriveAsyncTask(
this, sendRequest.getTrackId(), sendRequest.getAccount(), sendRequest.getDriveShareEmails());
return new SendDriveAsyncTask(this, sendRequest.getTrackId(), sendRequest.getAccount(),
sendRequest.getDriveShareEmails(), sendRequest.isDriveSharePublic());
}
@Override
@@ -28,6 +28,7 @@ import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecovera
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.Permission;
import com.google.api.services.drive.model.PermissionList;
import android.accounts.Account;
import android.content.Context;
@@ -44,10 +45,12 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
private final long trackId;
private final Account account;
private final String[] acl;
private final boolean isPublic;
private final Context context;
private final MyTracksProviderUtils myTracksProviderUtils;
public SendDriveAsyncTask(SendDriveActivity activity, long trackId, Account account, String acl) {
public SendDriveAsyncTask(
SendDriveActivity activity, long trackId, Account account, String acl, boolean isPublic) {
super(activity);
this.trackId = trackId;
this.account = account;
@@ -56,7 +59,8 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
} else {
this.acl = null;
}
this.isPublic = isPublic;
context = activity.getApplicationContext();
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context);
}
@@ -91,18 +95,18 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
File driveFile = drive.files().get(driveId).execute();
if (SyncUtils.isValid(driveFile, folderId) && SyncUtils.updateDriveFile(
drive, driveFile, context, myTracksProviderUtils, track, false)) {
addPermission(drive, driveId);
addPermission(drive, driveFile);
return true;
}
SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, null);
}
String id = SyncUtils.insertDriveFile(
File file = SyncUtils.insertDriveFile(
drive, folderId, context, myTracksProviderUtils, track, false);
if (id == null) {
if (file == null) {
return false;
}
addPermission(drive, id);
addPermission(drive, file);
return true;
} catch (UserRecoverableAuthException e) {
SendToGoogleUtils.sendNotification(
@@ -128,16 +132,38 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
* @param drive the drive
* @param driveId the drive id
*/
private void addPermission(Drive drive, String driveId) throws IOException {
private void addPermission(Drive drive, File file) throws IOException {
if (isPublic) {
boolean hasPublic = false;
PermissionList permissionList = drive.permissions().list(file.getId()).execute();
for (Permission permission : permissionList.getItems()) {
String role = permission.getRole();
if (role.equals("reader") || role.equals("writer")) {
if (permission.getType().equals("anyone")) {
hasPublic = true;
break;
}
}
}
if (!hasPublic) {
Permission permission = new Permission();
permission.setRole("reader");
permission.setType("anyone");
permission.setValue("");
drive.permissions().insert(file.getId(), permission).execute();
}
shareUrl = file.getAlternateLink();
}
if (acl != null) {
for (String email : acl) {
email = email.trim();
if (!email.equals("")) {
Permission permission = new Permission();
permission.setValue(email);
permission.setType("user");
permission.setRole("reader");
drive.permissions().insert(driveId, permission).execute();
permission.setType("user");
permission.setValue(email);
drive.permissions().insert(file.getId(), permission).execute();
}
}
}
@@ -214,8 +214,9 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask {
}
Drive drive = SyncUtils.getDriveService(driveCredential);
Permission permission = new Permission();
permission.setType("anyone");
permission.setRole("reader");
permission.setType("anyone");
permission.setValue("");
drive.permissions().insert(tableId, permission).execute();
return true;
}
@@ -90,7 +90,8 @@ public abstract class AbstractSendActivity extends Activity {
*
* @param success true if the AsyncTask is successful
*/
public void onAsyncTaskCompleted(boolean success) {
public void onAsyncTaskCompleted(boolean success, String shareUrl) {
sendRequest.setShareUrl(shareUrl);
startNextActivity(success, false);
}
@@ -20,7 +20,7 @@ import android.os.AsyncTask;
/**
* The abstract class for AsyncTasks sending a track to Google.
*
*
* @author Jimmy Shih
*/
public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boolean> {
@@ -35,6 +35,11 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
*/
private boolean success;
/**
* The share url from the AsyncTask.
*/
protected String shareUrl;
/**
* True if the AsyncTask has completed.
*/
@@ -47,25 +52,26 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
/**
* Creates an AsyncTask.
*
*
* @param activity the activity currently associated with this AsyncTask
*/
public AbstractSendAsyncTask(AbstractSendActivity activity) {
this.activity = activity;
success = false;
shareUrl = null;
completed = false;
canRetry = true;
}
/**
* Sets the current activity associated with this AyncTask.
*
*
* @param activity the current activity, can be null
*/
public void setActivity(AbstractSendActivity activity) {
this.activity = activity;
if (completed && activity != null) {
activity.onAsyncTaskCompleted(success);
activity.onAsyncTaskCompleted(success, shareUrl);
}
}
@@ -98,14 +104,14 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
saveResult();
}
if (activity != null) {
activity.onAsyncTaskCompleted(success);
activity.onAsyncTaskCompleted(success, shareUrl);
}
}
/**
* Retries the task. First, invalidates the auth token. If can retry, invokes
* {@link #performTask()}. Returns false if cannot retry.
*
*
* @return the result of the retry.
*/
protected boolean retryTask() {
@@ -133,7 +139,7 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
/**
* Performs the AsyncTask.
*
*
* @return true if success
*/
protected abstract boolean performTask();
@@ -36,9 +36,10 @@ public class SendRequest implements Parcelable {
private boolean sendFusionTables = false;
private boolean sendSpreadsheets = false;
private boolean driveEnableSync = false;
private boolean driveShare = false;
private String driveShareEmails = null;
private boolean driveEnableSync = false; // to enable Drive sync
private boolean driveShare = false; // to enable Drive share
private String driveShareEmails = null; // share with emails
private boolean driveSharePublic = false; // share as public
private Account account = null;
@@ -46,6 +47,7 @@ public class SendRequest implements Parcelable {
private boolean mapsSuccess = false;
private boolean spreadsheetsSuccess = false;
private boolean fusionTablesSuccess = false;
private String shareUrl = null;
/**
* Creates a new send request.
@@ -116,6 +118,14 @@ public class SendRequest implements Parcelable {
this.driveShareEmails = driveShareEmails;
}
public boolean isDriveSharePublic() {
return driveSharePublic;
}
public void setDriveSharePublic(boolean driveSharePublic) {
this.driveSharePublic = driveSharePublic;
}
public Account getAccount() {
return account;
}
@@ -156,6 +166,14 @@ public class SendRequest implements Parcelable {
this.spreadsheetsSuccess = spreadsheetsSuccess;
}
public String getShareUrl() {
return shareUrl;
}
public void setShareUrl(String shareUrl) {
this.shareUrl = shareUrl;
}
private SendRequest(Parcel in) {
trackId = in.readLong();
sendDrive = in.readByte() == 1;
@@ -165,11 +183,13 @@ public class SendRequest implements Parcelable {
driveEnableSync = in.readByte() == 1;
driveShare = in.readByte() == 1;
driveShareEmails = in.readString();
driveSharePublic = in.readByte() == 1;
account = in.readParcelable(null);
driveSuccess = in.readByte() == 1;
mapsSuccess = in.readByte() == 1;
fusionTablesSuccess = in.readByte() == 1;
spreadsheetsSuccess = in.readByte() == 1;
shareUrl = in.readString();
}
@Override
@@ -184,14 +204,16 @@ public class SendRequest implements Parcelable {
out.writeByte((byte) (sendMaps ? 1 : 0));
out.writeByte((byte) (sendFusionTables ? 1 : 0));
out.writeByte((byte) (sendSpreadsheets ? 1 : 0));
out.writeByte((byte) (driveEnableSync ? 1 : 0));
out.writeByte((byte) (driveEnableSync ? 1 : 0));
out.writeByte((byte) (driveShare ? 1 : 0));
out.writeString(driveShareEmails);
out.writeByte((byte) (driveSharePublic ? 1 : 0));
out.writeParcelable(account, 0);
out.writeByte((byte) (driveSuccess ? 1 : 0));
out.writeByte((byte) (mapsSuccess ? 1 : 0));
out.writeByte((byte) (fusionTablesSuccess ? 1 : 0));
out.writeByte((byte) (spreadsheetsSuccess ? 1 : 0));
out.writeString(shareUrl);
}
public static final Parcelable.Creator<SendRequest>
@@ -60,7 +60,7 @@ public class UploadResultActivity extends FragmentActivity implements ChooseActi
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sendRequest = getIntent().getParcelableExtra(SendRequest.SEND_REQUEST_KEY);
shareUrl = null;
shareUrl = sendRequest.getShareUrl();
Track track = MyTracksProviderUtils.Factory.get(this).getTrack(sendRequest.getTrackId());
if (track == null) {
@@ -69,6 +69,12 @@ public class UploadResultActivity extends FragmentActivity implements ChooseActi
return;
}
if (sendRequest.isDriveSuccess() && shareUrl != null) {
new ChooseActivityDialogFragment().show(
getSupportFragmentManager(), ChooseActivityDialogFragment.CHOOSE_ACTIVITY_DIALOG_TAG);
return;
}
if (sendRequest.isSendMaps() && sendRequest.isMapsSuccess()) {
shareUrl = SendMapsUtils.getMapUrl(track);
}
@@ -262,9 +262,9 @@ public class SyncUtils {
* @param myTracksProviderUtils the myTracksProviderUtils
* @param track the track
* @param canRetry true if can retry
* @return the added drive file id or null.
* @return the added drive file or null.
*/
public static String insertDriveFile(Drive drive, String folderId, Context context,
public static File insertDriveFile(Drive drive, String folderId, Context context,
MyTracksProviderUtils myTracksProviderUtils, Track track, boolean canRetry)
throws IOException {
java.io.File file = getFile(context, myTracksProviderUtils, track);
@@ -281,7 +281,7 @@ public class SyncUtils {
return null;
}
SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, uploadedFile);
return uploadedFile.getId();
return uploadedFile;
} finally {
file.delete();
}