diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java
index bc815b9b7..ac40d9190 100644
--- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java
+++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java
@@ -5,9 +5,13 @@ import android.accounts.AccountManager;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.app.Application;
+import android.content.Context;
+import android.content.SharedPreferences;
import android.content.pm.PackageManager;
+import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.os.Build;
+import android.preference.PreferenceManager;
import android.support.v4.util.LruCache;
import com.android.volley.RequestQueue;
@@ -35,9 +39,14 @@ import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreProtocolPNames;
+import java.io.File;
import java.io.IOException;
import fr.free.nrw.commons.caching.CacheController;
+import fr.free.nrw.commons.category.Category;
+import fr.free.nrw.commons.contributions.Contribution;
+import fr.free.nrw.commons.data.DBOpenHelper;
+import fr.free.nrw.commons.modifications.ModifierSequence;
import timber.log.Timber;
// TODO: Use ProGuard to rip out reporting when publishing
@@ -217,4 +226,59 @@ public class CommonsApplication extends Application {
return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
}
+
+ public void clearApplicationData(Context context) {
+ File cacheDirectory = context.getCacheDir();
+ File applicationDirectory = new File(cacheDirectory.getParent());
+ if (applicationDirectory.exists()) {
+ String[] fileNames = applicationDirectory.list();
+ for (String fileName : fileNames) {
+ if (!fileName.equals("lib")) {
+ deleteFile(new File(applicationDirectory, fileName));
+ }
+ }
+ }
+
+ AccountManager accountManager = AccountManager.get(this);
+ Account[] allAccounts = accountManager.getAccountsByType(AccountUtil.accountType());
+ for (int index = 0; index < allAccounts.length; index++) {
+ accountManager.removeAccount(allAccounts[index], null, null);
+ }
+
+ //TODO: fix preference manager
+ PreferenceManager.getDefaultSharedPreferences(app).edit().clear().commit();
+ SharedPreferences preferences = context.getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE);
+ preferences.edit().clear().commit();
+ context.getSharedPreferences("prefs", Context.MODE_PRIVATE).edit().clear().commit();;
+ preferences.edit().putBoolean("firstrun", false).apply();
+ updateAllDatabases(context);
+ currentAccount = null;
+ }
+
+ public void updateAllDatabases(Context context)
+ {
+ DBOpenHelper dbOpenHelper = DBOpenHelper.getInstance(context);
+ dbOpenHelper.getReadableDatabase().close();
+ SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
+
+ ModifierSequence.Table.onDelete(db);
+ Category.Table.onDelete(db);
+ Contribution.Table.onDelete(db);
+ }
+
+ public static boolean deleteFile(File file) {
+ boolean deletedAll = true;
+ if (file != null) {
+ if (file.isDirectory()) {
+ String[] children = file.list();
+ for (int i = 0; i < children.length; i++) {
+ deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
+ }
+ } else {
+ deletedAll = file.delete();
+ }
+ }
+
+ return deletedAll;
+ }
}
diff --git a/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java b/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java
index ddfc88d73..4190dcfbd 100644
--- a/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java
@@ -1,11 +1,13 @@
package fr.free.nrw.commons.hamburger;
import android.content.ActivityNotFoundException;
+import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -21,6 +23,7 @@ import fr.free.nrw.commons.AboutActivity;
import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
+import fr.free.nrw.commons.auth.LoginActivity;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.nearby.NearbyActivity;
import fr.free.nrw.commons.settings.SettingsActivity;
@@ -120,6 +123,32 @@ public class NavigationBaseFragment extends Fragment {
}
}
+ @OnClick(R.id.logout_item)
+ protected void onLogoutItemClicked() {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
+ alertDialogBuilder.setMessage(R.string.logout_verification)
+ .setCancelable(false)
+ .setPositiveButton(R.string.yes,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ ((CommonsApplication)getActivity().getApplicationContext()).clearApplicationData(getContext());
+ Intent nearbyIntent = new Intent(getActivity(), LoginActivity.class);
+ nearbyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ nearbyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(nearbyIntent);
+ getActivity().finish();
+ }
+ });
+ alertDialogBuilder.setNegativeButton(R.string.no,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = alertDialogBuilder.create();
+ alert.show();
+ }
+
private void closeDrawer() {
if (drawerLayout != null) {
drawerLayout.closeDrawer(drawerPane);
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c38710449..5930cbc36 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -183,6 +183,7 @@ Tap this message (or hit back) to skip this step.
Unable to display more than 500
Set Recent Upload Limit
Two factor authentication is currently not supported.
+ Do you really want to logout?
Cancel
Open