diff --git a/src/org/wikimedia/commons/CommonsApplication.java b/src/org/wikimedia/commons/CommonsApplication.java index b38028426..b79446be6 100644 --- a/src/org/wikimedia/commons/CommonsApplication.java +++ b/src/org/wikimedia/commons/CommonsApplication.java @@ -1,7 +1,15 @@ package org.wikimedia.commons; +import java.io.IOException; +import java.io.StringWriter; + +import javax.xml.transform.*; + +import android.accounts.*; import android.app.Application; import org.mediawiki.api.*; +import org.w3c.dom.Node; +import org.wikimedia.commons.auth.WikiAccountAuthenticator; import org.apache.http.HttpVersion; import org.apache.http.conn.ConnectionKeepAliveStrategy; import org.apache.http.impl.client.DefaultHttpClient; @@ -33,5 +41,51 @@ public class CommonsApplication extends Application { public MWApi getApi() { return api; } + + public Boolean revalidateAuthToken() { + AccountManager accountManager = AccountManager.get(this); + Account[] allAccounts =accountManager.getAccountsByType(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE); + Account curAccount = allAccounts[0]; + + accountManager.invalidateAuthToken(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE, api.getAuthCookie()); + try { + String authCookie = accountManager.blockingGetAuthToken(curAccount, "", false); + api.setAuthCookie(authCookie); + return true; + } catch (OperationCanceledException e) { + e.printStackTrace(); + return false; + } catch (AuthenticatorException e) { + e.printStackTrace(); + return false; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + public static String getStringFromDOM(Node dom) { + javax.xml.transform.Transformer transformer = null; + try { + transformer = TransformerFactory.newInstance().newTransformer(); + } catch (TransformerConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (TransformerFactoryConfigurationError e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + StringWriter outputStream = new StringWriter(); + javax.xml.transform.dom.DOMSource domSource = new javax.xml.transform.dom.DOMSource(dom); + javax.xml.transform.stream.StreamResult strResult = new javax.xml.transform.stream.StreamResult(outputStream); + + try { + transformer.transform(domSource, strResult); + } catch (TransformerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return outputStream.toString(); + } } diff --git a/src/org/wikimedia/commons/UploadService.java b/src/org/wikimedia/commons/UploadService.java index 63f7354ec..192c3a1e4 100644 --- a/src/org/wikimedia/commons/UploadService.java +++ b/src/org/wikimedia/commons/UploadService.java @@ -25,6 +25,8 @@ public class UploadService extends IntentService { public static final String EXTRA_EDIT_SUMMARY = EXTRA_PREFIX + ".summary"; private NotificationManager notificationManager; + private CommonsApplication app; + public UploadService(String name) { super(name); } @@ -84,12 +86,13 @@ public class UploadService extends IntentService { public void onCreate() { super.onCreate(); notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); + app = (CommonsApplication)this.getApplicationContext(); } @Override protected void onHandleIntent(Intent intent) { - MWApi api = ((CommonsApplication)this.getApplicationContext()).getApi(); + MWApi api = app.getApi(); InputStream file; long length; ApiResult result; @@ -124,12 +127,26 @@ public class UploadService extends IntentService { notificationManager.notify(notificationTag, NOTIFICATION_DOWNLOAD_IN_PROGRESS, progressNotification); + Log.d("Commons", "Just before"); NotificationUpdateProgressListener notificationUpdater = new NotificationUpdateProgressListener(progressNotification, notificationTag, String.format(getString(R.string.upload_progress_notification_title_in_progress), filename), String.format(getString(R.string.upload_progress_notification_title_finishing), filename) ); try { + if(!api.validateLogin()) { + // Need to revalidate! + if(app.revalidateAuthToken()) { + Log.d("Commons", "Successfully revalidated token!"); + } else { + Log.d("Commons", "Unable to revalidate :("); + // TODO: Put up a new notification, ask them to re-login + notificationManager.cancel(notificationTag, NOTIFICATION_DOWNLOAD_IN_PROGRESS); + Toast failureToast = Toast.makeText(this, R.string.authentication_failed, Toast.LENGTH_LONG); + failureToast.show(); + return; + } + } result = api.upload(filename, file, length, pageContents, editSummary, notificationUpdater); } catch (IOException e) { e.printStackTrace(); @@ -142,6 +159,7 @@ public class UploadService extends IntentService { Intent openUploadedPageIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(descUrl)); Notification doneNotification = new NotificationCompat.Builder(this) + .setAutoCancel(true) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle(String.format(getString(R.string.upload_completed_notification_title), filename)) .setContentText(getString(R.string.upload_completed_notification_text))