From 11e4fae297a75e5a4f3c0983e7e72e0d99af30cc Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Mon, 15 May 2017 16:25:22 +0100 Subject: [PATCH 01/17] Update deprecated values --- app/src/main/AndroidManifest.xml | 1 - app/src/main/res/layout/light_simple_spinner_dropdown_item.xml | 2 +- app/src/main/res/layout/welcome_do_upload.xml | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4164cd60a..bce7c0642 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ diff --git a/app/src/main/res/layout/light_simple_spinner_dropdown_item.xml b/app/src/main/res/layout/light_simple_spinner_dropdown_item.xml index 11f95bf2e..be4e086e4 100644 --- a/app/src/main/res/layout/light_simple_spinner_dropdown_item.xml +++ b/app/src/main/res/layout/light_simple_spinner_dropdown_item.xml @@ -2,7 +2,7 @@ Date: Mon, 15 May 2017 16:26:15 +0100 Subject: [PATCH 02/17] Removing unused imports --- .../free/nrw/commons/SettingsActivityTest.java | 15 +++++++-------- .../java/fr/free/nrw/commons/auth/LoginTask.java | 6 +++--- .../nrw/commons/nearby/NearbyListFragment.java | 16 ++++++---------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index 7ba617730..2bae89265 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -1,9 +1,5 @@ package fr.free.nrw.commons; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.anyOf; -import static org.hamcrest.Matchers.anything; - import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.support.test.espresso.Espresso; @@ -15,15 +11,18 @@ import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.view.View; -import fr.free.nrw.commons.settings.SettingsActivity; - -import java.util.Map; - import org.hamcrest.Matcher; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Map; + +import fr.free.nrw.commons.settings.SettingsActivity; + +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.anything; + @LargeTest @RunWith(AndroidJUnit4.class) public class SettingsActivityTest { diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java index 8785bff71..d6d3bd2a0 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java @@ -3,16 +3,16 @@ package fr.free.nrw.commons.auth; import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; import android.app.ProgressDialog; -import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; + +import java.io.IOException; + import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.EventLog; import fr.free.nrw.commons.R; import timber.log.Timber; -import java.io.IOException; - class LoginTask extends AsyncTask { private LoginActivity loginActivity; diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java index 048f1d450..731ee0035 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java @@ -1,6 +1,5 @@ package fr.free.nrw.commons.nearby; -import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.ListFragment; @@ -9,22 +8,19 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ListView; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnItemClick; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; -import fr.free.nrw.commons.R; -import fr.free.nrw.commons.location.LatLng; -import fr.free.nrw.commons.utils.UriDeserializer; - import java.lang.reflect.Type; import java.util.List; - +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnItemClick; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.utils.UriDeserializer; import timber.log.Timber; public class NearbyListFragment extends ListFragment { From 876b299ecc7e3f10089c55f5e78c8267520ed6af Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Mon, 15 May 2017 16:27:49 +0100 Subject: [PATCH 03/17] Remove redudant local variables --- .../fr/free/nrw/commons/media/MediaDetailFragment.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 6d46da801..d4f1eef00 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -403,8 +403,7 @@ public class MediaDetailFragment extends Fragment { return "Uploaded date not available"; } SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy"); - String formattedDate = formatter.format(date); - return formattedDate; + return formatter.format(date); } /** @@ -413,8 +412,6 @@ public class MediaDetailFragment extends Fragment { * @return Coordinates as text. */ private String prettyCoordinates(Media media) { - String coordinates = media.getCoordinates(); - - return coordinates; + return media.getCoordinates(); } } From 8e3e8982c74d39d7507b9f5117a9b2bed6c6818f Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Mon, 15 May 2017 16:39:31 +0100 Subject: [PATCH 04/17] Android correctness lint issues --- app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java | 3 +-- app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java b/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java index 02b69b260..08c9f8bff 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java @@ -21,7 +21,6 @@ import android.graphics.drawable.BitmapDrawable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; -import android.widget.ImageView; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; @@ -31,7 +30,7 @@ import com.android.volley.toolbox.ImageLoader.ImageListener; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.ContributionsContentProvider; -public class MediaWikiImageView extends ImageView { +public class MediaWikiImageView extends android.support.v7.widget.AppCompatImageView { private Media mMedia; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java index 8edd68789..0c587d566 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons.upload; +import android.annotation.SuppressLint; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; @@ -20,6 +21,8 @@ public class FileUtils { * @param uri The Uri to query. * @author paulburke */ + // Can be safely suppressed, checks for isKitKat before running isDocumentUri + @SuppressLint("NewApi") public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; From cce8c27a66c8e3a2a08997c950daa8ec11abfca3 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Tue, 16 May 2017 15:52:05 +0300 Subject: [PATCH 05/17] Add logout action --- .../free/nrw/commons/CommonsApplication.java | 64 +++++++++++++++++++ .../hamburger/NavigationBaseFragment.java | 29 +++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 94 insertions(+) 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 From aec4300a2e79490082396c732ac0df3b3e8009f5 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Tue, 16 May 2017 16:01:29 +0300 Subject: [PATCH 06/17] Logout thing --- .../main/java/fr/free/nrw/commons/CommonsApplication.java | 3 +-- app/src/main/java/fr/free/nrw/commons/category/Category.java | 5 +++++ .../java/fr/free/nrw/commons/contributions/Contribution.java | 5 +++++ .../fr/free/nrw/commons/modifications/ModifierSequence.java | 5 +++++ 4 files changed, 16 insertions(+), 2 deletions(-) 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 ac40d9190..b0ef462dc 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -255,8 +255,7 @@ public class CommonsApplication extends Application { currentAccount = null; } - public void updateAllDatabases(Context context) - { + public void updateAllDatabases(Context context) { DBOpenHelper dbOpenHelper = DBOpenHelper.getInstance(context); dbOpenHelper.getReadableDatabase().close(); SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); diff --git a/app/src/main/java/fr/free/nrw/commons/category/Category.java b/app/src/main/java/fr/free/nrw/commons/category/Category.java index 645b10afc..f290dd741 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/Category.java +++ b/app/src/main/java/fr/free/nrw/commons/category/Category.java @@ -115,6 +115,11 @@ public class Category { db.execSQL(CREATE_TABLE_STATEMENT); } + public static void onDelete(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); + onCreate(db); + } + public static void onUpdate(SQLiteDatabase db, int from, int to) { if(from == to) { return; diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java index c39298810..e58be04e1 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java @@ -331,6 +331,11 @@ public class Contribution extends Media { db.execSQL(CREATE_TABLE_STATEMENT); } + public static void onDelete(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); + onCreate(db); + } + public static void onUpdate(SQLiteDatabase db, int from, int to) { if(from == to) { return; diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java index b660c0a72..67152f85b 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequence.java @@ -142,5 +142,10 @@ public class ModifierSequence { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } + + public static void onDelete(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); + onCreate(db); + } } } From be2b944276f3a3d96bdd87265b9661cad44be4f9 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Tue, 16 May 2017 16:12:16 +0300 Subject: [PATCH 07/17] Fix codacy --- .../free/nrw/commons/CommonsApplication.java | 39 +++++++------------ .../hamburger/NavigationBaseFragment.java | 6 ++- .../fr/free/nrw/commons/utils/FileUtils.java | 23 +++++++++++ 3 files changed, 42 insertions(+), 26 deletions(-) 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 b0ef462dc..32d8b89f9 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -24,7 +24,13 @@ import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.utils.StorageUtils; +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 fr.free.nrw.commons.auth.AccountUtil; + import org.acra.ACRA; import org.acra.ReportingInteractionMode; import org.acra.annotation.ReportsCrashes; @@ -42,11 +48,7 @@ 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 fr.free.nrw.commons.utils.FileUtils; import timber.log.Timber; // TODO: Use ProGuard to rip out reporting when publishing @@ -234,7 +236,7 @@ public class CommonsApplication extends Application { String[] fileNames = applicationDirectory.list(); for (String fileName : fileNames) { if (!fileName.equals("lib")) { - deleteFile(new File(applicationDirectory, fileName)); + FileUtils.deleteFile(new File(applicationDirectory, fileName)); } } } @@ -247,14 +249,19 @@ public class CommonsApplication extends Application { //TODO: fix preference manager PreferenceManager.getDefaultSharedPreferences(app).edit().clear().commit(); - SharedPreferences preferences = context.getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE); + SharedPreferences preferences = context + .getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE); preferences.edit().clear().commit(); - context.getSharedPreferences("prefs", Context.MODE_PRIVATE).edit().clear().commit();; + context.getSharedPreferences("prefs", Context.MODE_PRIVATE).edit().clear().commit(); preferences.edit().putBoolean("firstrun", false).apply(); updateAllDatabases(context); currentAccount = null; } + /** + * Deletes all tables and re-creates them. + * @param context context + */ public void updateAllDatabases(Context context) { DBOpenHelper dbOpenHelper = DBOpenHelper.getInstance(context); dbOpenHelper.getReadableDatabase().close(); @@ -264,20 +271,4 @@ public class CommonsApplication extends Application { 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 4190dcfbd..146e72961 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 @@ -131,8 +131,10 @@ public class NavigationBaseFragment extends Fragment { .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); + ((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); diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java index 158c13da0..3df50b31f 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java @@ -3,6 +3,7 @@ package fr.free.nrw.commons.utils; import android.content.Context; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; @@ -32,4 +33,26 @@ public class FileUtils { } return stringBuilder; } + + /** + * Deletes files. + * @param file context + */ + 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; + } + + } From bdfbdc75796d63a35da166e134cb8734a0fb58db Mon Sep 17 00:00:00 2001 From: addshore Date: Tue, 16 May 2017 10:39:05 +0200 Subject: [PATCH 08/17] Cleanup CommonsApplication Singelton --- .../free/nrw/commons/CommonsApplication.java | 92 ++++++++++++------- .../java/fr/free/nrw/commons/EventLog.java | 5 +- .../free/nrw/commons/MediaDataExtractor.java | 2 +- .../fr/free/nrw/commons/auth/AccountUtil.java | 2 +- .../commons/auth/AuthenticatedActivity.java | 2 +- .../free/nrw/commons/auth/LoginActivity.java | 4 +- .../fr/free/nrw/commons/auth/LoginTask.java | 6 +- .../free/nrw/commons/auth/SignupActivity.java | 5 +- .../auth/WikiAccountAuthenticator.java | 2 +- .../nrw/commons/category/MethodAUpdater.java | 2 +- .../nrw/commons/category/PrefixUpdater.java | 2 +- .../nrw/commons/category/TitleCategories.java | 2 +- .../contributions/ContributionsActivity.java | 4 +- .../ContributionsListAdapter.java | 4 +- .../ContributionsListFragment.java | 3 +- .../ContributionsSyncAdapter.java | 2 +- .../ContributionsSyncService.java | 2 +- .../commons/media/MediaDetailFragment.java | 2 +- .../media/MediaDetailPagerFragment.java | 2 +- .../ModificationsSyncAdapter.java | 2 +- .../ModificationsSyncService.java | 2 +- .../nrw/commons/nearby/NearbyActivity.java | 3 +- .../commons/settings/SettingsFragment.java | 3 +- .../nrw/commons/upload/ExistingFileAsync.java | 2 +- .../commons/upload/MultipleShareActivity.java | 10 +- .../free/nrw/commons/upload/MwVolleyApi.java | 2 +- .../nrw/commons/upload/ShareActivity.java | 16 ++-- .../nrw/commons/upload/UploadController.java | 4 +- .../nrw/commons/upload/UploadService.java | 10 +- 29 files changed, 116 insertions(+), 83 deletions(-) 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 32d8b89f9..ef9ea90d0 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -62,7 +62,6 @@ import timber.log.Timber; ) public class CommonsApplication extends Application { - private MWApi api; private Account currentAccount = null; // Unlike a savings account... public static final String API_URL = "https://commons.wikimedia.org/w/api.php"; public static final String IMAGE_URL_BASE = "https://upload.wikimedia.org/wikipedia/commons"; @@ -81,13 +80,35 @@ public class CommonsApplication extends Application { public static final String FEEDBACK_EMAIL = "commons-app-android@googlegroups.com"; public static final String FEEDBACK_EMAIL_SUBJECT = "Commons Android App (%s) Feedback"; - public RequestQueue volleyQueue; + private static CommonsApplication instance = null; + private AbstractHttpClient httpClient = null; + private MWApi api = null; + private CacheController cacheData = null; + private RequestQueue volleyQueue = null; - public CacheController cacheData; + /** + * This should not be called by ANY application code (other than the magic Android glue) + * Use CommonsApplication.getInstance() instead to get the singleton. + */ + public CommonsApplication() { + CommonsApplication.instance = this; + } - public static CommonsApplication app; + public static CommonsApplication getInstance() { + if(instance == null) { + instance = new CommonsApplication(); + } + return instance; + } - public static AbstractHttpClient createHttpClient() { + public AbstractHttpClient getHttpClient() { + if(httpClient == null) { + httpClient = newHttpClient(); + } + return httpClient; + } + + private AbstractHttpClient newHttpClient() { BasicHttpParams params = new BasicHttpParams(); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); @@ -98,14 +119,36 @@ public class CommonsApplication extends Application { return new DefaultHttpClient(cm, params); } - public static MWApi createMWApi() { - return new MWApi(API_URL, createHttpClient()); + public MWApi getMWApi() { + if(api == null) { + api = newMWApi(); + } + return api; + } + + private MWApi newMWApi() { + return new MWApi(API_URL, getHttpClient()); + } + + public CacheController getCacheData() { + if(cacheData == null) { + cacheData = new CacheController(); + } + return cacheData; + } + + public RequestQueue getVolleyQueue() { + if(volleyQueue == null) { + DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024); + volleyQueue = new RequestQueue(cache, new BasicNetwork(new HurlStack())); + volleyQueue.start(); + } + return volleyQueue; } @Override public void onCreate() { super.onCreate(); - app = this; Timber.plant(new Timber.DebugTree()); @@ -116,9 +159,8 @@ public class CommonsApplication extends Application { } // Fire progress callbacks for every 3% of uploaded content System.setProperty("in.yuvi.http.fluent.PROGRESS_TRIGGER_THRESHOLD", "3.0"); - api = createMWApi(); - ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(getApplicationContext()) + ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(this) .discCache(new TotalSizeLimitedDiscCache(StorageUtils.getCacheDirectory(this), 128 * 1024 * 1024)) .build(); ImageLoader.getInstance().init(imageLoaderConfiguration); @@ -147,13 +189,6 @@ public class CommonsApplication extends Application { } }; } - - //For caching area -> categories - cacheData = new CacheController(); - - DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024); - volleyQueue = new RequestQueue(cache, new BasicNetwork(new HurlStack())); - volleyQueue.start(); } private com.android.volley.toolbox.ImageLoader imageLoader; @@ -161,7 +196,7 @@ public class CommonsApplication extends Application { public com.android.volley.toolbox.ImageLoader getImageLoader() { if(imageLoader == null) { - imageLoader = new com.android.volley.toolbox.ImageLoader(volleyQueue, new com.android.volley.toolbox.ImageLoader.ImageCache() { + imageLoader = new com.android.volley.toolbox.ImageLoader(getVolleyQueue(), new com.android.volley.toolbox.ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String key) { return imageCache.get(key); @@ -176,13 +211,9 @@ public class CommonsApplication extends Application { } return imageLoader; } - - public MWApi getApi() { - return api; - } /** - * @return Accout|null + * @return Account|null */ public Account getCurrentAccount() { if(currentAccount == null) { @@ -203,21 +234,12 @@ public class CommonsApplication extends Application { return false; // This should never happen } - accountManager.invalidateAuthToken(AccountUtil.accountType(), api.getAuthCookie()); + accountManager.invalidateAuthToken(AccountUtil.accountType(), getMWApi().getAuthCookie()); try { String authCookie = accountManager.blockingGetAuthToken(curAccount, "", false); - api.setAuthCookie(authCookie); + getMWApi().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; - } catch (NullPointerException e) { + } catch (OperationCanceledException | NullPointerException | IOException | AuthenticatorException e) { e.printStackTrace(); return false; } diff --git a/app/src/main/java/fr/free/nrw/commons/EventLog.java b/app/src/main/java/fr/free/nrw/commons/EventLog.java index 694c03b6b..dea4d7c23 100644 --- a/app/src/main/java/fr/free/nrw/commons/EventLog.java +++ b/app/src/main/java/fr/free/nrw/commons/EventLog.java @@ -6,6 +6,7 @@ import android.os.Build; import android.preference.PreferenceManager; import org.apache.http.HttpResponse; +import org.apache.http.impl.client.AbstractHttpClient; import org.json.JSONException; import org.json.JSONObject; @@ -30,10 +31,10 @@ public class EventLog { boolean allSuccess = true; // Not using the default URL connection, since that seems to have different behavior than the rest of the code for(LogBuilder logBuilder: logBuilders) { - HttpURLConnection conn; try { URL url = logBuilder.toUrl(); - HttpResponse response = Http.get(url.toString()).use(CommonsApplication.createHttpClient()).asResponse(); + AbstractHttpClient httpClient = CommonsApplication.getInstance().getHttpClient(); + HttpResponse response = Http.get(url.toString()).use(httpClient).asResponse(); if(response.getStatusLine().getStatusCode() != 204) { allSuccess = false; diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index 344546c7a..44e7b8242 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -66,7 +66,7 @@ public class MediaDataExtractor { throw new IllegalStateException("Tried to call MediaDataExtractor.fetch() again."); } - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); ApiResult result = api.action("query") .param("prop", "revisions") .param("titles", filename) diff --git a/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java b/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java index 29f6fcf91..773eb5d63 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java @@ -55,7 +55,7 @@ public class AccountUtil { @NonNull private static CommonsApplication app() { - return CommonsApplication.app; + return CommonsApplication.getInstance(); } } diff --git a/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java index 6a99764af..7e195ed3e 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java @@ -132,7 +132,7 @@ public abstract class AuthenticatedActivity extends NavigationBaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - app = (CommonsApplication)this.getApplicationContext(); + app = CommonsApplication.getInstance(); if(savedInstanceState != null) { authCookie = savedInstanceState.getString("authCookie"); } diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index bbadc757a..0bec4bac6 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -40,7 +40,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - app = (CommonsApplication) getApplicationContext(); + app = CommonsApplication.getInstance(); setContentView(R.layout.activity_login); final LoginActivity that = this; @@ -199,7 +199,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { } private void showUserToast( int resId ) { - Toast.makeText(getApplicationContext(), resId, Toast.LENGTH_LONG).show(); + Toast.makeText(this, resId, Toast.LENGTH_LONG).show(); } public void showSuccessToastAndDismissDialog() { diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java index 8785bff71..d952e6535 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java @@ -26,7 +26,7 @@ class LoginTask extends AsyncTask { this.username = username; this.password = password; this.twoFactorCode = twoFactorCode; - app = (CommonsApplication) loginActivity.getApplicationContext(); + app = CommonsApplication.getInstance(); } @Override @@ -44,9 +44,9 @@ class LoginTask extends AsyncTask { protected String doInBackground(String... params) { try { if (twoFactorCode.isEmpty()) { - return app.getApi().login(username, password); + return app.getMWApi().login(username, password); } else { - return app.getApi().login(username, password, twoFactorCode); + return app.getMWApi().login(username, password, twoFactorCode); } } catch (IOException e) { // Do something better! diff --git a/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java index 5965c8928..530953c9f 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java @@ -7,6 +7,7 @@ import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.theme.BaseActivity; import timber.log.Timber; @@ -39,10 +40,10 @@ public class SignupActivity extends BaseActivity { //Signup success, so clear cookies, notify user, and load LoginActivity again Timber.d("Overriding URL %s", url); - Toast toast = Toast.makeText(getApplicationContext(), "Account created!", Toast.LENGTH_LONG); + Toast toast = Toast.makeText(CommonsApplication.getInstance(), "Account created!", Toast.LENGTH_LONG); toast.show(); - Intent intent = new Intent(getApplicationContext(), LoginActivity.class); + Intent intent = new Intent(CommonsApplication.getInstance(), LoginActivity.class); startActivity(intent); return true; } else { diff --git a/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java b/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java index 7233b6be8..ebbd6c285 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java @@ -75,7 +75,7 @@ public class WikiAccountAuthenticator extends AbstractAccountAuthenticator { } private String getAuthCookie(String username, String password) throws IOException { - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); //TODO add 2fa support here String result = api.login(username, password); if(result.equals("PASS")) { diff --git a/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java b/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java index 33835119e..9300f640d 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java +++ b/app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java @@ -79,7 +79,7 @@ public class MethodAUpdater extends AsyncTask> { protected ArrayList doInBackground(Void... voids) { //otherwise if user has typed something in that isn't in cache, search API for matching categories - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); ApiResult result; ArrayList categories = new ArrayList<>(); diff --git a/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java b/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java index 350c0b21f..05770081d 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java +++ b/app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java @@ -95,7 +95,7 @@ public class PrefixUpdater extends AsyncTask> { //otherwise if user has typed something in that isn't in cache, search API for matching categories //URL: https://commons.wikimedia.org/w/api.php?action=query&list=allcategories&acprefix=filter&aclimit=25 - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); ApiResult result; ArrayList categories = new ArrayList<>(); try { diff --git a/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java b/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java index a372b353d..6ca46be0f 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java +++ b/app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java @@ -34,7 +34,7 @@ public class TitleCategories extends AsyncTask> { @Override protected ArrayList doInBackground(Void... voids) { - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); ApiResult result; ArrayList items = new ArrayList<>(); diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index d9dd05b26..73b657329 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java @@ -109,7 +109,7 @@ public class ContributionsActivity @Override protected void onAuthCookieAcquired(String authCookie) { // Do a sync everytime we get here! - ContentResolver.requestSync(((CommonsApplication) getApplicationContext()).getCurrentAccount(), ContributionsContentProvider.AUTHORITY, new Bundle()); + ContentResolver.requestSync(CommonsApplication.getInstance().getCurrentAccount(), ContributionsContentProvider.AUTHORITY, new Bundle()); Intent uploadServiceIntent = new Intent(this, UploadService.class); uploadServiceIntent.setAction(UploadService.ACTION_START_SERVICE); startService(uploadServiceIntent); @@ -219,7 +219,7 @@ public class ContributionsActivity @Override public Loader onCreateLoader(int i, Bundle bundle) { SharedPreferences sharedPref = - PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + PreferenceManager.getDefaultSharedPreferences(this); int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); return new CursorLoader(this, ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java index 3a6aa72c3..182e9762a 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java @@ -49,7 +49,7 @@ class ContributionsListAdapter extends CursorAdapter { if(views.url == null || !views.url.equals(actualUrl)) { if(actualUrl.startsWith("http")) { MediaWikiImageView mwImageView = views.imageView; - mwImageView.setMedia(contribution, ((CommonsApplication) activity.getApplicationContext()).getImageLoader()); + mwImageView.setMedia(contribution, CommonsApplication.getInstance().getImageLoader()); // FIXME: For transparent images } else { ImageLoader.getInstance().displayImage(actualUrl, views.imageView, contributionDisplayOptions, new SimpleImageLoadingListener() { @@ -66,7 +66,7 @@ class ContributionsListAdapter extends CursorAdapter { public void onLoadingFailed(String imageUri, View view, FailReason failReason) { super.onLoadingFailed(imageUri, view, failReason); MediaWikiImageView mwImageView = views.imageView; - mwImageView.setMedia(contribution, ((CommonsApplication) activity.getApplicationContext()).getImageLoader()); + mwImageView.setMedia(contribution, CommonsApplication.getInstance().getImageLoader()); } }); } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java index 364071e22..be83b3327 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java @@ -159,8 +159,7 @@ public class ContributionsListFragment extends Fragment { menu.clear(); // See http://stackoverflow.com/a/8495697/17865 inflater.inflate(R.menu.fragment_contributions_list, menu); - CommonsApplication app = (CommonsApplication)getActivity().getApplicationContext(); - if (!app.deviceHasCamera()) { + if (!CommonsApplication.getInstance().deviceHasCamera()) { menu.findItem(R.id.menu_from_camera).setEnabled(false); } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java index 81510e23b..52b966cfd 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java @@ -61,7 +61,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { public void onPerformSync(Account account, Bundle bundle, String s, ContentProviderClient contentProviderClient, SyncResult syncResult) { // This code is fraught with possibilities of race conditions, but lalalalala I can't hear you! String user = account.name; - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); SharedPreferences prefs = this.getContext().getSharedPreferences("prefs", Context.MODE_PRIVATE); String lastModified = prefs.getString("lastSyncTimestamp", ""); Date curTime = new Date(); diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncService.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncService.java index 3af92935c..946da6915 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncService.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncService.java @@ -15,7 +15,7 @@ public class ContributionsSyncService extends Service { super.onCreate(); synchronized (sSyncAdapterLock) { if (sSyncAdapter == null) { - sSyncAdapter = new ContributionsSyncAdapter(getApplicationContext(), true); + sSyncAdapter = new ContributionsSyncAdapter(this, true); } } } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 6d46da801..b96845eb6 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -194,7 +194,7 @@ public class MediaDetailFragment extends Fragment { if(actualUrl.startsWith("http")) { Timber.d("Actual URL starts with http and is: %s", actualUrl); - ImageLoader loader = ((CommonsApplication)getActivity().getApplicationContext()).getImageLoader(); + ImageLoader loader = CommonsApplication.getInstance().getImageLoader(); MediaWikiImageView mwImage = (MediaWikiImageView)image; mwImage.setLoadingView(loadingProgress); //FIXME: Set this as an attribute mwImage.setMedia(media, loader); diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index 9adbdb882..c7e06cefa 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -123,7 +123,7 @@ public class MediaDetailPagerFragment extends Fragment implements ViewPager.OnPa if(savedInstanceState != null) { editable = savedInstanceState.getBoolean("editable"); } - app = (CommonsApplication)getActivity().getApplicationContext(); + app = CommonsApplication.getInstance(); setHasOptionsMenu(true); } diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java index fdc9e28a5..898c41f7d 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java @@ -61,7 +61,7 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { return; } - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); api.setAuthCookie(authCookie); String editToken; diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncService.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncService.java index b664aaaa4..bf6878622 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncService.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncService.java @@ -15,7 +15,7 @@ public class ModificationsSyncService extends Service { super.onCreate(); synchronized (sSyncAdapterLock) { if (sSyncAdapter == null) { - sSyncAdapter = new ModificationsSyncAdapter(getApplicationContext(), true); + sSyncAdapter = new ModificationsSyncAdapter(this, true); } } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index 2446800d3..181643e79 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -25,6 +25,7 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.theme.NavigationBaseActivity; @@ -184,7 +185,7 @@ public class NearbyActivity extends NavigationBaseActivity { @Override protected List doInBackground(Void... params) { return NearbyController - .loadAttractionsFromLocation(curLatLang, getApplicationContext() + .loadAttractionsFromLocation(curLatLang, CommonsApplication.getInstance() ); } diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index 84c5e1e13..bdac4a0f5 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -11,6 +11,7 @@ import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; @@ -46,7 +47,7 @@ public class SettingsFragment extends PreferenceFragment { final EditTextPreference uploadLimit = (EditTextPreference) findPreference("uploads"); final SharedPreferences sharedPref = PreferenceManager - .getDefaultSharedPreferences(getActivity().getApplicationContext()); + .getDefaultSharedPreferences(CommonsApplication.getInstance()); int uploads = sharedPref.getInt(Prefs.UPLOADS_SHOWING, 100); uploadLimit.setText(uploads + ""); uploadLimit.setSummary(uploads + ""); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java b/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java index 14988c60c..27b9ed8d8 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java @@ -38,7 +38,7 @@ public class ExistingFileAsync extends AsyncTask { @Override protected Boolean doInBackground(Void... voids) { - MWApi api = CommonsApplication.createMWApi(); + MWApi api = CommonsApplication.getInstance().getMWApi(); ApiResult result; // https://commons.wikimedia.org/w/api.php?action=query&list=allimages&format=xml&aisha1=801957214aba50cb63bb6eb1b0effa50188900ba diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java index 8c5e6b6d2..12b38a6ab 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java @@ -132,7 +132,11 @@ public class MultipleShareActivity dialog.setProgress(uploadCount); if(uploadCount == photosList.size()) { dialog.dismiss(); - Toast startingToast = Toast.makeText(getApplicationContext(), R.string.uploading_started, Toast.LENGTH_LONG); + Toast startingToast = Toast.makeText( + CommonsApplication.getInstance(), + R.string.uploading_started, + Toast.LENGTH_LONG + ); startingToast.show(); } } @@ -202,9 +206,9 @@ public class MultipleShareActivity uploadController = new UploadController(this); setContentView(R.layout.activity_multiple_uploads); + app = CommonsApplication.getInstance(); ButterKnife.bind(this); initDrawer(); - app = (CommonsApplication)this.getApplicationContext(); if(savedInstanceState != null) { photosList = savedInstanceState.getParcelableArrayList("uploadsList"); @@ -241,7 +245,7 @@ public class MultipleShareActivity @Override protected void onAuthCookieAcquired(String authCookie) { - app.getApi().setAuthCookie(authCookie); + app.getMWApi().setAuthCookie(authCookie); Intent intent = getIntent(); if(intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java index 6544b4fff..367309593 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MwVolleyApi.java @@ -101,7 +101,7 @@ public class MwVolleyApi { private static RequestQueue getQueue(Context context) { if (REQUEST_QUEUE == null) { - REQUEST_QUEUE = Volley.newRequestQueue(context.getApplicationContext()); + REQUEST_QUEUE = Volley.newRequestQueue(context); } return REQUEST_QUEUE; } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index 08ddbe821..2353dd465 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -106,12 +106,16 @@ public class ShareActivity getFileMetadata(false); } - Toast startingToast = Toast.makeText(getApplicationContext(), R.string.uploading_started, Toast.LENGTH_LONG); + Toast startingToast = Toast.makeText( + CommonsApplication.getInstance(), + R.string.uploading_started, + Toast.LENGTH_LONG + ); startingToast.show(); if (!cacheFound) { //Has to be called after apiCall.request() - app.cacheData.cacheCategory(); + app.getCacheData().cacheCategory(); Timber.d("Cache the categories found"); } @@ -189,7 +193,7 @@ public class ShareActivity @Override protected void onAuthCookieAcquired(String authCookie) { - app.getApi().setAuthCookie(authCookie); + app.getMWApi().setAuthCookie(authCookie); shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView"); categorizationFragment = (CategorizationFragment) getSupportFragmentManager().findFragmentByTag("categorization"); @@ -217,7 +221,7 @@ public class ShareActivity setContentView(R.layout.activity_share); ButterKnife.bind(this); initDrawer(); - app = (CommonsApplication)this.getApplicationContext(); + app = CommonsApplication.getInstance(); backgroundImageView = (ImageView)findViewById(R.id.backgroundImage); //Receive intent from ContributionController.java when user selects picture to upload @@ -398,12 +402,12 @@ public class ShareActivity if (imageObj.imageCoordsExists) { double decLongitude = imageObj.getDecLongitude(); double decLatitude = imageObj.getDecLatitude(); - app.cacheData.setQtPoint(decLongitude, decLatitude); + app.getCacheData().setQtPoint(decLongitude, decLatitude); } MwVolleyApi apiCall = new MwVolleyApi(this); - List displayCatList = app.cacheData.findCategory(); + List displayCatList = app.getCacheData().findCategory(); boolean catListEmpty = displayCatList.isEmpty(); // If no categories found in cache, call MediaWiki API to match image coords with nearby Commons categories diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java index 2bdee55f5..4266384c1 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadController.java @@ -36,7 +36,7 @@ public class UploadController { public UploadController(Activity activity) { this.activity = activity; - app = (CommonsApplication)activity.getApplicationContext(); + app = CommonsApplication.getInstance(); } private boolean isUploadServiceConnected; @@ -55,7 +55,7 @@ public class UploadController { }; public void prepareService() { - Intent uploadServiceIntent = new Intent(activity.getApplicationContext(), UploadService.class); + Intent uploadServiceIntent = new Intent(activity, UploadService.class); uploadServiceIntent.setAction(UploadService.ACTION_START_SERVICE); activity.startService(uploadServiceIntent); activity.bindService(uploadServiceIntent, uploadServiceConnection, Context.BIND_AUTO_CREATE); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java index 523b6a479..853952fae 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java @@ -115,7 +115,7 @@ public class UploadService extends HandlerService { super.onCreate(); notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - app = (CommonsApplication) this.getApplicationContext(); + app = CommonsApplication.getInstance(); contributionsProviderClient = this.getContentResolver().acquireContentProviderClient(ContributionsContentProvider.AUTHORITY); } @@ -176,7 +176,7 @@ public class UploadService extends HandlerService { } private void uploadContribution(Contribution contribution) { - MWApi api = app.getApi(); + MWApi api = app.getMWApi(); ApiResult result; InputStream file = null; @@ -201,7 +201,7 @@ public class UploadService extends HandlerService { .setContentText(getResources().getQuantityString(R.plurals.uploads_pending_notification_indicator, toUpload, toUpload)) .setOngoing(true) .setProgress(100, 0, true) - .setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, new Intent(this, ContributionsActivity.class), 0)) + .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, ContributionsActivity.class), 0)) .setTicker(getString(R.string.upload_progress_notification_title_in_progress, contribution.getDisplayTitle())); this.startForeground(NOTIFICATION_UPLOAD_IN_PROGRESS, curProgressNotification.build()); @@ -282,7 +282,7 @@ public class UploadService extends HandlerService { toUpload--; if(toUpload == 0) { // Sync modifications right after all uplaods are processed - ContentResolver.requestSync(((CommonsApplication) getApplicationContext()).getCurrentAccount(), ModificationsContentProvider.AUTHORITY, new Bundle()); + ContentResolver.requestSync((CommonsApplication.getInstance()).getCurrentAccount(), ModificationsContentProvider.AUTHORITY, new Bundle()); stopForeground(true); } } @@ -304,7 +304,7 @@ public class UploadService extends HandlerService { } private String findUniqueFilename(String fileName) throws IOException { - MWApi api = app.getApi(); + MWApi api = app.getMWApi(); String sequenceFileName; for ( int sequenceNumber = 1; true; sequenceNumber++ ) { if (sequenceNumber == 1) { From c712b561d4814d984037fbde7b9ce00833e13b1d Mon Sep 17 00:00:00 2001 From: addshore Date: Tue, 16 May 2017 11:22:17 +0200 Subject: [PATCH 09/17] Get rid of other singletons --- .../fr/free/nrw/commons/CommonsApplication.java | 17 +++++++++++++++++ .../category/CategoryContentProvider.java | 3 ++- .../ContributionsContentProvider.java | 3 ++- .../fr/free/nrw/commons/data/DBOpenHelper.java | 13 ++++--------- .../ModificationsContentProvider.java | 3 ++- .../nrw/commons/nearby/NearbyController.java | 6 ++++-- .../free/nrw/commons/nearby/NearbyPlaces.java | 17 ----------------- 7 files changed, 31 insertions(+), 31 deletions(-) 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 ef9ea90d0..2a4f4ac65 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -30,6 +30,7 @@ import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.data.DBOpenHelper; import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.auth.AccountUtil; +import fr.free.nrw.commons.nearby.NearbyPlaces; import org.acra.ACRA; import org.acra.ReportingInteractionMode; @@ -85,6 +86,8 @@ public class CommonsApplication extends Application { private MWApi api = null; private CacheController cacheData = null; private RequestQueue volleyQueue = null; + private DBOpenHelper dbOpenHelper = null; + private NearbyPlaces nearbyPlaces = null; /** * This should not be called by ANY application code (other than the magic Android glue) @@ -146,6 +149,20 @@ public class CommonsApplication extends Application { return volleyQueue; } + public synchronized DBOpenHelper getDBOpenHelper() { + if(dbOpenHelper == null) { + dbOpenHelper = new DBOpenHelper(this); + } + return dbOpenHelper; + } + + public synchronized NearbyPlaces getNearbyPlaces() { + if (nearbyPlaces == null) { + nearbyPlaces = new NearbyPlaces(); + } + return nearbyPlaces; + } + @Override public void onCreate() { super.onCreate(); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java index 314ab33f2..de157265b 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java @@ -9,6 +9,7 @@ import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.data.DBOpenHelper; import timber.log.Timber; @@ -36,7 +37,7 @@ public class CategoryContentProvider extends ContentProvider { private DBOpenHelper dbOpenHelper; @Override public boolean onCreate() { - dbOpenHelper = DBOpenHelper.getInstance(getContext()); + dbOpenHelper = CommonsApplication.getInstance().getDBOpenHelper(); return false; } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java index 37d9dae18..838b9c922 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java @@ -9,6 +9,7 @@ import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.data.DBOpenHelper; import timber.log.Timber; @@ -35,7 +36,7 @@ public class ContributionsContentProvider extends ContentProvider{ private DBOpenHelper dbOpenHelper; @Override public boolean onCreate() { - dbOpenHelper = DBOpenHelper.getInstance(getContext()); + dbOpenHelper = CommonsApplication.getInstance().getDBOpenHelper(); return false; } diff --git a/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java b/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java index 58ab54a4d..22171857a 100644 --- a/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java +++ b/app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java @@ -12,16 +12,11 @@ public class DBOpenHelper extends SQLiteOpenHelper{ private static final String DATABASE_NAME = "commons.db"; private static final int DATABASE_VERSION = 6; - private static DBOpenHelper singleton = null; - public static synchronized DBOpenHelper getInstance(Context context) { - if ( singleton == null ) { - singleton = new DBOpenHelper(context); - } - return singleton; - } - - private DBOpenHelper(Context context) { + /** + * Do not use, please call CommonsApplication.getDBOpenHelper() + */ + public DBOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java index baba01770..097651aaf 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java @@ -9,6 +9,7 @@ import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.data.DBOpenHelper; import timber.log.Timber; @@ -35,7 +36,7 @@ public class ModificationsContentProvider extends ContentProvider{ private DBOpenHelper dbOpenHelper; @Override public boolean onCreate() { - dbOpenHelper = DBOpenHelper.getInstance(getContext()); + dbOpenHelper = CommonsApplication.getInstance().getDBOpenHelper(); return false; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java index e5fc3182c..0a290784a 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import timber.log.Timber; @@ -37,13 +38,14 @@ public class NearbyController { if (curLatLng == null) { return Collections.emptyList(); } + NearbyPlaces nearbyPlaces = CommonsApplication.getInstance().getNearbyPlaces(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); List places = prefs.getBoolean("useWikidata", true) - ? NearbyPlaces.getInstance().getFromWikidataQuery( + ? nearbyPlaces.getFromWikidataQuery( context, curLatLng, Locale.getDefault().getLanguage()) - : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); + : nearbyPlaces.getFromWikiNeedsPictures(); if (curLatLng != null) { Timber.d("Sorting places by distance..."); final Map distances = new HashMap<>(); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java index 152812fd2..3478e74e9 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java @@ -29,13 +29,9 @@ public class NearbyPlaces { private static final double MAX_RADIUS = 300.0; // in kilometer private static final double RADIUS_MULTIPLIER = 1.618; private static final String WIKIDATA_QUERY_URL = "https://query.wikidata.org/sparql?query=${QUERY}"; - private static NearbyPlaces singleton; private double radius = INITIAL_RADIUS; private List places; - private NearbyPlaces(){ - } - List getFromWikidataQuery(Context context, LatLng curLatLng, String lang) { @@ -199,17 +195,4 @@ public class NearbyPlaces { } return places; } - - /** - * Get the singleton instance of this class. - * The instance is created upon the first invocation of this method, and then reused. - * - * @return The singleton instance - */ - public static synchronized NearbyPlaces getInstance() { - if (singleton == null) { - singleton = new NearbyPlaces(); - } - return singleton; - } } From 1785e9b179be96702d219fb9851bc9cac1b0e868 Mon Sep 17 00:00:00 2001 From: addshore Date: Tue, 16 May 2017 11:29:33 +0200 Subject: [PATCH 10/17] Fix some codacy issues --- .../java/fr/free/nrw/commons/CommonsApplication.java | 12 ++++++------ .../fr/free/nrw/commons/auth/SignupActivity.java | 6 +++++- 2 files changed, 11 insertions(+), 7 deletions(-) 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 2a4f4ac65..91ce3c1ef 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -98,14 +98,14 @@ public class CommonsApplication extends Application { } public static CommonsApplication getInstance() { - if(instance == null) { + if (instance == null) { instance = new CommonsApplication(); } return instance; } public AbstractHttpClient getHttpClient() { - if(httpClient == null) { + if (httpClient == null) { httpClient = newHttpClient(); } return httpClient; @@ -123,7 +123,7 @@ public class CommonsApplication extends Application { } public MWApi getMWApi() { - if(api == null) { + if (api == null) { api = newMWApi(); } return api; @@ -134,14 +134,14 @@ public class CommonsApplication extends Application { } public CacheController getCacheData() { - if(cacheData == null) { + if (cacheData == null) { cacheData = new CacheController(); } return cacheData; } public RequestQueue getVolleyQueue() { - if(volleyQueue == null) { + if (volleyQueue == null) { DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024); volleyQueue = new RequestQueue(cache, new BasicNetwork(new HurlStack())); volleyQueue.start(); @@ -150,7 +150,7 @@ public class CommonsApplication extends Application { } public synchronized DBOpenHelper getDBOpenHelper() { - if(dbOpenHelper == null) { + if (dbOpenHelper == null) { dbOpenHelper = new DBOpenHelper(this); } return dbOpenHelper; diff --git a/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java index 530953c9f..62ccb5731 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/SignupActivity.java @@ -40,7 +40,11 @@ public class SignupActivity extends BaseActivity { //Signup success, so clear cookies, notify user, and load LoginActivity again Timber.d("Overriding URL %s", url); - Toast toast = Toast.makeText(CommonsApplication.getInstance(), "Account created!", Toast.LENGTH_LONG); + Toast toast = Toast.makeText( + CommonsApplication.getInstance(), + "Account created!", + Toast.LENGTH_LONG + ); toast.show(); Intent intent = new Intent(CommonsApplication.getInstance(), LoginActivity.class); From 4bda30116abb780f5cc1a1be001d27e7982fdb96 Mon Sep 17 00:00:00 2001 From: addshore Date: Tue, 16 May 2017 15:20:53 +0200 Subject: [PATCH 11/17] Update logic from PR 611 that was just merged --- app/src/main/java/fr/free/nrw/commons/CommonsApplication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 91ce3c1ef..df783be44 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -287,7 +287,7 @@ public class CommonsApplication extends Application { } //TODO: fix preference manager - PreferenceManager.getDefaultSharedPreferences(app).edit().clear().commit(); + PreferenceManager.getDefaultSharedPreferences(getInstance()).edit().clear().commit(); SharedPreferences preferences = context .getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE); preferences.edit().clear().commit(); @@ -302,7 +302,7 @@ public class CommonsApplication extends Application { * @param context context */ public void updateAllDatabases(Context context) { - DBOpenHelper dbOpenHelper = DBOpenHelper.getInstance(context); + DBOpenHelper dbOpenHelper = CommonsApplication.getInstance().getDBOpenHelper(); dbOpenHelper.getReadableDatabase().close(); SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); From c0397858ee339deaa90683a45e1dc0c49f1dae20 Mon Sep 17 00:00:00 2001 From: maskara Date: Tue, 16 May 2017 17:20:42 +0200 Subject: [PATCH 12/17] With icons in navigation drawer --- .../hamburger/NavigationBaseFragment.java | 13 +- .../ic_exit_to_app_black_24dp.png | Bin 0 -> 251 bytes .../drawable-hdpi/ic_feedback_black_24dp.png | Bin 0 -> 149 bytes .../ic_file_upload_black_24dp.png | Bin 0 -> 139 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 487 bytes .../ic_location_on_black_24dp.png | Bin 0 -> 376 bytes .../drawable-hdpi/ic_settings_black_24dp.png | Bin 0 -> 453 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 171 bytes .../drawable-mdpi/ic_feedback_black_24dp.png | Bin 0 -> 127 bytes .../ic_file_upload_black_24dp.png | Bin 0 -> 114 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 323 bytes .../ic_location_on_black_24dp.png | Bin 0 -> 263 bytes .../drawable-mdpi/ic_settings_black_24dp.png | Bin 0 -> 322 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 246 bytes .../drawable-xhdpi/ic_feedback_black_24dp.png | Bin 0 -> 187 bytes .../ic_file_upload_black_24dp.png | Bin 0 -> 144 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 640 bytes .../ic_location_on_black_24dp.png | Bin 0 -> 457 bytes .../drawable-xhdpi/ic_settings_black_24dp.png | Bin 0 -> 557 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 354 bytes .../ic_feedback_black_24dp.png | Bin 0 -> 246 bytes .../ic_file_upload_black_24dp.png | Bin 0 -> 175 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 940 bytes .../ic_location_on_black_24dp.png | Bin 0 -> 683 bytes .../ic_settings_black_24dp.png | Bin 0 -> 827 bytes .../ic_exit_to_app_black_24dp.png | Bin 0 -> 432 bytes .../ic_feedback_black_24dp.png | Bin 0 -> 311 bytes .../ic_file_upload_black_24dp.png | Bin 0 -> 214 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 1256 bytes .../ic_location_on_black_24dp.png | Bin 0 -> 868 bytes .../ic_settings_black_24dp.png | Bin 0 -> 1073 bytes .../main/res/drawable/hamburger_item_bg.xml | 15 ++ .../res/layout/navigation_drawer_menu.xml | 171 +++++++++++++----- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/dimens.xml | 1 + 35 files changed, 152 insertions(+), 49 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_feedback_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_file_upload_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_location_on_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_feedback_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_file_upload_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_location_on_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_feedback_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_file_upload_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_location_on_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_feedback_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_file_upload_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_location_on_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_feedback_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_file_upload_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_location_on_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png create mode 100644 app/src/main/res/drawable/hamburger_item_bg.xml 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..bcd115fcc 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 @@ -10,6 +10,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -31,22 +32,22 @@ public class NavigationBaseFragment extends Fragment { ImageView pictureOfTheDay; @BindView(R.id.upload_item) - TextView uploadItem; + LinearLayout uploadItem; @BindView(R.id.nearby_item) - TextView nearbyItem; + LinearLayout nearbyItem; @BindView(R.id.about_item) - TextView aboutItem; + LinearLayout aboutItem; @BindView(R.id.settings_item) - TextView settingsItem; + LinearLayout settingsItem; @BindView(R.id.feedback_item) - TextView feedbackItem; + LinearLayout feedbackItem; @BindView(R.id.logout_item) - TextView logoutItem; + LinearLayout logoutItem; private DrawerLayout drawerLayout; private RelativeLayout drawerPane; diff --git a/app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ad0f63e5b8a97d5951f1b4e8576dadee1ed7b06c GIT binary patch literal 251 zcmV7p6eU`=zZX-N|=GVrD^) zClqF&$Jv?-QOwy=^+Y}F$nfc4Bot;$_dOXQ9RzHI`#%>oY-)%aZoJrjFFFv3NmVRr z2?Sa`S#md3dQVyL$W)m~R+X1#=Sa*{6V0AVQq>n#Elps}Q)srP(H~^4sXZe4&|XbV z{WbCr8*-?%{P#rkbYwX65AuY=z)4@Wr^6vI^9JtMV7dP`o`V1Y002ovPDHLkV1iCn BWIO-> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_feedback_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f03168559b3ca90ff3223edcca99bdeb69fab070 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8jHioZNCo5DOB;C`40v2F#hkaU{$pwX`Q{|-xzl;s!!o(ZPixsi1yiwa(I*%-G}&=ob-s4h wtig%3lvSkUmTbzJB}oB>DmdKI;Vst0I{<%xc~qF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_file_upload_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_file_upload_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5b9fc4ac45134e7fc93da768e8730bd06734f5 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8kf)1dNCo5DGaGpw3^|ws-A=CP z`DLzH68?wnq{+mZb$^po%d51{T(_3?`MN-a%`0UAi`$|E6)p&|G$EzyQ~7y`l#B_A h(*qAb&7M%bkXz5?Z!+^^k2av`44$rjF6*2UngDS-P=?%O3jv@aJa6HGW<0ceyC!`rEoc~?j{U=`ic|b z9N*QPsMv*+MQv@1i8kR%)UIh1`=XoCqqIYBOKErvea{GWZ!y>;D~RpT`=%tUi9cM8 zjMJd-5IZXpx*;AQpQG66NVp4e3Hh{Q=T<@);yl@>u@F125nkF002ovPDHLkV1kFY-~<2w literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_location_on_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_location_on_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..df1f34062be8c86f602d304efdb738fbb4e4b4ea GIT binary patch literal 376 zcmV-;0f+vHP)Wg(Tpj&bdAc8oEppaIOE(LXPbaD_uiXgfuI0y=Ui?$Rg z3N9|rijvq&CiQlchlhJevpDqnjrr%mb8?c{t6qzumxlIL6n!zIh8Gl(U}e3LlM0Ef;V2BeJSjZb=;SQ|z+u z4yaibL-bf>PG6*TZCbM}(t2i;JWOXDi<+RJrJZgbD4Fy&xy-!MTym*5Ce+-mj<=}R zs*bfH=Sq2RG}Riq#p042E*7&*ne}3EUJe(E*_zBou{bA(tHo?vL#bs|A+IvyeHm7t#M^wEtHOK?m*3tk?OFDx*kh6Lst!v$eu1NdssLB&DM32-Q z^h4~jZ>A+~7n2>4r=NU@Dq}tg9ji`Suql$(%vHn+eg}v!7dsOm%)+nCb00000NkvXXu0mjfkE75f literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..dee407b59836072bd89a0f869c53cc8e47f3f7b7 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iB2O2`kP60Ri9HGv9;zO$xA`F2 zY~NKip@`{&YFE_;0j&cQmak%SZDZ!)T9OgL`NY;CL-7rhUE5<0T@KzKTjw-n9DJK;XQ(;) zfIpl+%uiyUOU4g>nI)^(6eNVC+VV9N7512(jy6 ZU}$NyaNHmn{TXN?gQu&X%Q~loCID#lCawSg literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_file_upload_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_file_upload_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f2954bd746cb090d74a9e549d8a7efe041ed1c GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1OHUWakP60R39AK+9G*e{&s5ci5fY}sT-yed|rRg0)~VyRe(RxP5| ziKSu?+iDTDUGbuL5L2~?+LgFdoQk=|C}Pxj7RQRtyXcJ~MwepHsvL@iJ?s4SCH8$Y z6AQgYt#Ro~-1uQ)CSvZwj!tLSm1hyxCe}LeCL$stVz6(6)`@$smX==JIoA4R{{X3C VfQx`Hg^K_H002ovPDHLkV1oM>kN^Mx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_location_on_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_location_on_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..92a0738278340a3707c072c4eb2747f2c6eccc8b GIT binary patch literal 263 zcmV+i0r>ujP)%xAWI(lU{PeAyA|mddA|zESzU6&jX$3$)8* zAXMjbPo~N*e?q_c++P^{2o3Uiqz(3r^UJ%?gH$G!s??Kvp(9D0Lt<}X{nb)u;o#H? zPYd-&D;=ok>a~4q+{_KGt+nl?)Sqo>pkti>Mn^*@rlyWH=gOrG`3LhIsfL;XzrFwf N002ovPDHLkV1mC(bHxAv literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c59419c02b6273e09063a0529d2239784818207f GIT binary patch literal 322 zcmV-I0lof-P)J%}fHzV<>iUk{yCv=|P(yFM9CIKrv6;vdj!^e)OQ=oM~3L z3Hov zYMc*TMS6^4Y*s#v8YK}AT(ig&XB4{J=afm7xZ$2C{CQWp)PoCx)G7YcXPY7T1DnU) UWG_v5V*mgE07*qoM6N<$f<$+V!T$2{8En0ePbXTEv8+xH$tl7$*|>0Q(JcpPKIn>;M1&07*qoM6N<$f)PV!8UO$Q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_feedback_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..63bec23315f1d4c4239102fb5ff07c23815834fd GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DCQlc~kP61Pmkjw1IqSf^O2*--OcVX9fx*LjPh=D zd*wSN?p5*vrXT4G>e==kXJI?nu-}8BMNYz=xteK~RK%78rw8U{~SKbLh*2~7YkkxJ_T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_file_upload_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_file_upload_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..41694c101b646ba0a0382831d12c8a234bfb4cba GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0Da8DPo#88fEO5na|OlO{3G z*yIPEVO{WsIjnKnVT>2DMzkql!ApMPMO=L<#3I9oI}LubOO+CNvScYxqQ)LKcQkDr zB9h}Xp02N~GG)+JIYyNnkc)PDZOnzu*#; zB8R%~1(i4Rl0>e>Eb#WLtxfOV(#vvo;8MrfX8# zOJwj-6bRC^RW#U^^>`Uk%GqUlp=9>%y-#&$qZ(w=qV2=#%SNueJg~}R_Q4VL}5`+@9~aM z91c`Iph*TZkfp^?^`Dp^0y)$Ij}vN48)8+LhbiruA|j3sO47|fb;`I*GKou>Ivq)^ z4u=V1QQ;ad;<{u73-W9;3T-}Qiy5qW$_D4g=4Y%kOJdS2(WFCW8GK5uatHXvo3W`#|5$P3?j&0QK~)Y2$Rv{Aw* zt}sHyW_X9Xc*`^uI>SEdVUK3{=X2zcmz$VjA35zYO|VhkqkuPz5NZhpT_#XQ8wIt< zaCZtNJYkNp!aS=eVIFrY$l@BEEhCFNxZ6zp-nNE}SGe0j#vHZyp@55o%lL?#K9EtO3&`m_C3}e+HYnXu4p0vV9HBz@ zQ4ja1)FfX}7u!ryu|?FyA~p07k@kREnxKsmJ~Kg09VbUd&M|821~RTwYZ=c_ho{uu z6fN{$iz)ihEV~G?%Pf8B9DfUE>0?(5!v?H>8`7pQS~rX*00000NkvXXu0mjfjSt0v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e84e188a1de15564930f961aefb5e591b2fa34ec GIT binary patch literal 557 zcmV+|0@D47P)Nkla9V}f0{{|82kXi@9MRd@?$weK4A^ju7 zLRBcZi6~YV4Y?x0YCBk^ee93}@A5qN9`;=V`Fy9md5-r894+Q7Vwa zKGHbsTJ3CbB>k$}G!3du63TIxO+;yvI}8$@RV#hZwGsJa1 zG(UeLOQIW*%YP$A_S8JsifkZzY=a`Er-+B1U^vMR;-MW*pvdqV@zg66vq)lJDKSEJ zw`0sxb4<_B;v8FuS(#q`)kg&}+hPL6xOrb?GQ?%fExvFHL!Kq|$LU4WPhFXQ&M?@z zxR1mtVOeOIy~lo>;tz)rETgf>fK;}TNLegBvB^KiQ=u3Ot|-Y( z2Uu+mzU3;1m}L#YE?|a1uJMlWb*&qR^Q=+kG@*msHr|$gaEk##XL&}z6#u1a9Hidf vu2=2VHre2#z3N8+Q5wRd6(rV6I@-ivWBUX&LwAlh00000NkvXXu0mjfs0IG% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..53b79d4c7b9cdad40cb666c5bb30ed44daa143a9 GIT binary patch literal 354 zcmV-o0iFJdP)3fpZFa4cDyL4)iGZOvQJns;a8`1-tx#POU72+yDRo07*qoM6N<$g3C0W AH~;_u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_feedback_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e68ceb906ae6b9192e3bfe3b5b77139d8f871f8f GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw_IkQFhEy=Vz2eAq$Uws7;r6cb z74B0Oxqm2W3e~9+a^%pvvO_#c(DQ%fnc1~JPCPnpXZRf|fP6E-N(i{Hi$zB#mC!UpTGM%;a!Y zGG&6}K4&&lhN&+lMT~$lE8cFB$_QZo8ns~J5*DeK4$M;|UwD47&hU;%lDT5BqA=j` rf@6-o%~I^9d|5z&BgJ!y-&Qlv?EZPH<*5`i&?5|S|nb&%Fb3ug|-}yriBQ0#W+tVLn7qpS_ zP~Tf$6T85n@f^2^MgWjr<#oZ@0>}sr4gL3m|Lx7MUUi92n}IH1@O1TaS?83{1OQ8~ BM!^68 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3847a9fe74774d3593dd694cff48ccca13cdec5a GIT binary patch literal 940 zcmV;d15^BoP)mdcfcOtJM6uO{+z8D@UxkKMBq1+Buz@6?P#P0jG1VJo zr4$sRhK5k2Z=fXRN~6nW@y^{1KD~XI=}gYdoFjX&pWp3sm>a@9yM-m0@&}6isAEB(Qj;>qRst`p9~=6q zAu7LO=u+TQ_K7Dd@dg8*_ZUX>5!&WBSSti4^<9Bi7`TY2+y<+KU=~psWnX%OzQeO# z$Y%%reeR=-{wJ-1^+Iq9eT6F#>jwG=^_&zcppV__#9BjN7F^M%z)NCy=&SoFTsf2ppC<<**2_ZI5@SJo9Db@pv9Dwel>@Q2Y|A^pR+ zXm)h0I4$&8t(hXy6*cz3S)t(J`aO{jqc{F(SB1>4AMjd@E;uWs|KhZ2{;};ky2AQ2 z)rxDxD$`NJH=PukQuA$!?4zc}-&3$&Xn>Du{t5dULsafqFEod!oWp?rpGSuiRtueB z&+LQNE+8tK3|cF6gtuz;3+FNP08y#Yj|~U-15sJR*io8@$}eQs#}cB_phN-_NT5>I zKj|$a=v*bC1q7WMgQRsN@Unzi63g)%L1&Ybq;ZC~2s(dqkQ990An0_M#V3gY=Ga5f z`5TXvN})=^4!0;^!e^R~NT^Pc418W7q3m*(v-Aa=K4XNz?fnc_RXp{J*(OZ^8ac7(2N>$@cY O0000L6B4wV&>Lp(J~?z>aHJdBBezTh(_h2 z2 zWl@4t;f%A2vMfcT|HoQF4ki3PTq#q?u`fQ?yB~SzE}qo0g*>#$3A`9Xo_dW34aj5l zI2%L(EigpSPD3oBfF9zgm=$E{CvC*o6{nqfWNC>5IB5wu3zh6u#U!%SjFWEb*Qq3( zY8H^O+c+6T#@aCHK*pZqWX7_}F-+o?^`6E_5*Zr8W*8Y-#K{IS)PqegGV}{4YgrD| zhYW4t1BrN|fC&S2CJ0_jT*fX5mM8@W+BApuRO}mAY)5y{! z)oI3=MwVJ|Qo>rmrSBllt~i|m7k`~n9KApREiz0meT>`06 zl!7Kix5q+Fq6=w?Bq2zRX%{Q=l9q~JFAfaD-fMk(ql{OMJp*hZ8Le@FKzb36b`fRvPbJZ#ihbmi`-huQ`v`H+dnnz5 zIO;AGB7BE9YM!%LJ&ic*2`mcPKpgfvmoR!03D^-c43Z$hAhR4H0ecmL8#qMtu}v3c zWQvny2hqm?F??uNd0r4z>Rub{-SwiV_KcJlc$@G(Y7OnY{oYXaZ@4M{dXjJ$v z`$eh=sKvO?Cei3I?)A;6Md`CXq2t(8SWgZw6G7n$pCQ&JiDGgU(}=YRim_lq5{{Tt>$z%L(Sw8>(002ovPDHLk FV1g%Ge~AD9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e30632b6b1dc6d3b8e1c7556a9f73e231851051f GIT binary patch literal 432 zcmV;h0Z;ykP)Q*LDW#NB5A+;4Q?5K`4y@^Lb;E`dIs-k^@$0`)8kp@^!iLhwtjC@G(##BWRM%4) znibU@n*!{q?%WjMM0MrY_zL*@!2kgS5I_I{49g67rckh~fcf`zmJu-jaiwJgy!^S= zG69|_|BU4U-16=r!~^_<;O`+n!4HTh!~@)fcz~A>4{#FV0Zu|Zz)6S)I0 zK*6#D3YHyEFadOg#*gV^^a{-azQ_XBZxk@&BjU$g{QB_#=lbyg-}>=@8K0T|slW5A zAAe)ZwSGLnxqdw0G5gJ3umrc)s|c3y5tHS9!~|fD_4Sxl54r^qKmY**NdMyNp(((Q z>efvG7F5?UH1zuYJ!F0Xf61t(Y@1mBl?jX`^uY&dV95km9V_;n0zNo*EH0gWrIb=i aDfIC5 z0U~ZGtWyrOOR&voRMJSkp!#RyOTj~JZRJag?=gM9e&fdWnKN&)aSFYa7jweIF5ED9(-rq)o#eL=sSjs1Ouy8ie7Nt+ zCG$5b4h;=l>JA5{v-mK_v2q9~0Qo5gW-~A{vGA-j0dmTLES35cCKiq#D;Nb79^|V# zG%zsw9^hAhFoW;La^`I}8;)5?Z)i?AV4J?P;aFat9jp8~+vsaPW=t_b`#$_!a$ddG x?&W9C`ToCZEfxyuV-isA&dY@l3kvio2ZwliL$%Lg^W_`Nd;nAh@ zH}Bba%6i?WXWQp^$Vi?nQYuVQYjTiaO5|Ya5bOdoS`-Boyc#4JlYk-$ZVeoaN-YWk s5H&!lrhpY0`CndqJXiEO^YQ;zbrQ36Ec&9=#Xzp}boFyt=akR{0EMJP4gdfE literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e2a03a4bc540419ce1165d5dedd8d5345fdec2 GIT binary patch literal 1256 zcmVP)W$LQv#I8j8T_{yf~=m$~;IXzu5?eh%l+bI*O5LnIQ3L?S-g zNEKIT<0XBJGshx}%rQL6n2^)65BytPpur(aAq3mzkx5L*!vp z0a@Ola>x)hq%a~$J)clM5drmH23z#q<|xU<0`*qKPGo7Si~n z%wqBU&0hSlj{%E?RDuuU7MJcXB=Jj%b`&x_e(Xp;ExUAT@Y|(jm(qjWZ(B;_Uor&Y z6!R#Nv*chaGsx+GPf(5^TbQOC&z>U}Plh0!MlPf-JUW9CsUc{WQ6klNkmN0L=W$Hb zI`=E``6_{H*O2>uGL!}iknh%)aH)U^vHJHyC=I|j;!5~HKCWcN1R5Z;2B2BgU%-W! zczBp#L#PcDi)Yo>;Taa!Y@Ptv;<}7l4r)8NeQGlwNF& zYb9ky8`z|cGKQ@=tt4)=frR*F&DNq;5;NLBOdDlk)i+CZzQKZh$R zK8n3)UuX^N7uDk=aj8xWGC(Sn1_~Jx)mdCiFf4{?52b-lQTv8C9#o@5E)leAD3OzR z)Fn^Gaf%@QAdedG1kbj}b8XCXgrFSb3rcL@n*sbhFEP*Qfd2Kr_;5}_cz_aF;&K3M ze+ebhM9$XHgOZ`06n-hB6D318YwImEMS(?`<%O>vfHEvXL&vNpLe#!|zDLp9b&_k9T z*x5;~c-Pf0-68_APCn*}yr+}vWZ1(d62yp+WD|SHaD&H;+SWI+mO!0l8Wm6`sU`&F zbfE&s6E+i?YKBohW{8u7EWu?ypnS+US>hOx&jq=;y2>EuNMckT2YAG1l*`QUkZ)PT z3X$L_jr@gjkUknXOq>;|goD)5%rkl!W0nOLm}QJ!o^qco2Ph^Ii9{k1-~0zqnGDmx SqDLYC0000 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_location_on_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_location_on_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2217e4651ee42cb7d34855d6b00689221ba304 GIT binary patch literal 868 zcmV-q1DpJbP)lK}w6qBBfbcPhRZBN@$Z3j(}cM(SiSVhj==W*POA^dwA zCq9ho}Ic7~9tX9@0t@$f{k9i$P08#mp$RigB>jv~84aI+|~t5{5+$i5)BCW@?q z#VHioT|zSru^JWwrePLb8%0*YqJ$z_C%AuNy?{2swSpa?gQigy+}FWw;?pRy9|`Vr z6xnqwCQ)QF1ox3?ko6Izmee3SgA9EVXr~<_xMxs+k3Nq~)d?=ged9Vk#8!rl>+}i* z9DIt5P0`P0HKviV&v5Z7GPlkIrx>8r?I5R_WF471kBcYipjaBf$(P7K=5RBL{9_b1 z`&mQIwK;&J3FO>OTs@DRdjV(PBFDbN-7CnkGq}ssL{7CR;*ZymQ^Ulf#IMMq-zXE4 zbI74{#HPScC~$Wv5~G(;;9e$Xb0}b6@dz>ad=-X(E+cQKWJW*;eVj19DdHaJE~yoYws`=myh@6ki{ z1A9r4L$ne0+8icj-a^=WlhnyEgN)6PBZaCgB14N*NvY#(7=ApDlVX=qM3+gmJh#v` z-6BuQRk(+?=pGe%z)>Ec|LFlo=@BFTe?ENDOXxEq##k{R3pG`V_=<^3NWfR4)j)KkE?kf% zU}CHb1trze6>4h;sTD;rtpyq(711_6TOXmFPeL**CLQm0&Kbrt$^HG8P44Zq_ne-d zIYT6GB9TZWvWW>Kq@TD8Z%rbKCJFFT3Q=|)UTQ^@t;I_ZBg!7bOS=$dFXN?m5M}%E z(wB&`ukq3!h_Yz{ypu!>x)$#=AqKVLoh^t#k5E8sIL>$MVhOq3&gY0hM`8YgceIr|YY&iqQ@`QK~6 zQos?!gFYj`%4WoqwqT*0?-5V>feMW6L_F#x3@zbr#H0S91|$0r&w3vNHzOXl4y8E9 z5Dz;}9F@lr$I={PD~(h#??P2Hv5k*OBaS_R%D0F^Gwfz5bE%<=S;V1HRE7}izM+=? zvXWuMx}&JnaTc-a1LhN^j9$d5v#dlZNx#*%UxG%$>Lq+a5(6c?YW(obN2{C>#Hd#& z!B{)f219oRCRP~?=PB;R(sE89s&->)k9y|05eEzCQO)~HF|~}eY5{Q-jsl(y{dFJ0 zLg+*>%Tom8#bC&-wqj#@$W=cjZ_b3=su3H_Ay*wEUqWZ2%FD7H{2O^AAiF$gQgUe1!CaxCt9AAy+*GP?%|S8#ZFe%*GOO> z#bLy_Ugb>^^dZI#kVL7TbBI;FloO_cKI?z#>rnXuv2KJ_AwQf^#JVG>3?mNBvWI0k zCeFQ%8(UwY@+jh1ntry^Op?+IC23&?1EdS}PEAbz5c&FESu5gU4Th($JgXZci}?%j zAcuGCUqC#n17l^3BOc^%YUO^!lkUMvz+uFL`muJC2Zudosl~w?NY31kB51DEg_A{d zo(4V7yWC2^CMFTbCfGp0ZS3d#oLeiEIC_%o8Q~cgkx|9lh(m9&kc<=^oYC)hXq9s6 z($m<(9mL4iY&qBmXe3*lJNfX^nst-}xU1(FC+XyRa$C!w;mW?1+!pg9Cm5oZ0(uZJ z=)Phh(s literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/hamburger_item_bg.xml b/app/src/main/res/drawable/hamburger_item_bg.xml new file mode 100644 index 000000000..cdd545602 --- /dev/null +++ b/app/src/main/res/drawable/hamburger_item_bg.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/navigation_drawer_menu.xml b/app/src/main/res/layout/navigation_drawer_menu.xml index 9b0e5cfb2..71d093e1e 100644 --- a/app/src/main/res/layout/navigation_drawer_menu.xml +++ b/app/src/main/res/layout/navigation_drawer_menu.xml @@ -1,6 +1,7 @@ - + android:layout_height="52dp" + android:background="@drawable/hamburger_item_bg" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + android:layout_height="52dp" + android:background="@drawable/hamburger_item_bg" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + android:layout_height="52dp" + android:background="@drawable/hamburger_item_bg" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + android:layout_height="52dp" + android:background="@drawable/hamburger_item_bg" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + android:layout_height="52dp" + android:background="@drawable/hamburger_item_bg" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + android:layout_height="52dp" + android:background="@drawable/hamburger_item_bg" + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 19959021f..60164d6bf 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -22,4 +22,5 @@ #77000000 #44000000 + #f5f5f5 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d48714b16..2194587a7 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,4 +3,5 @@ 4dp 8dp 240dp + 18sp From ce15b677ba99bd2a3c414d64733ff3f0ba76aaf2 Mon Sep 17 00:00:00 2001 From: Neslihan Date: Tue, 16 May 2017 18:29:24 +0300 Subject: [PATCH 13/17] Change orange irrelevant questionmark --- app/src/main/res/drawable/round_icon_unknown.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/drawable/round_icon_unknown.xml b/app/src/main/res/drawable/round_icon_unknown.xml index ba0f2e52b..33905d93b 100644 --- a/app/src/main/res/drawable/round_icon_unknown.xml +++ b/app/src/main/res/drawable/round_icon_unknown.xml @@ -1,7 +1,5 @@ - - - - - + + + From bc60cff5fe4fd3656e44597bb6449ee7980be754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Tue, 16 May 2017 21:41:18 +0200 Subject: [PATCH 14/17] Fix lat-long format and add tests Currently the lat-long string in the gallery still contains negative numbers. Also W values do not work correctly. This commit fixes the calculations and adds tests for the LatLng class. --- .../fr/free/nrw/commons/location/LatLng.java | 9 ++- .../java/fr/free/nrw/commons/LatLngTests.java | 64 +++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 app/src/test/java/fr/free/nrw/commons/LatLngTests.java diff --git a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java index 47d112991..acd67ebf7 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java @@ -6,6 +6,8 @@ public class LatLng { public final double longitude; /** Accepts latitude and longitude. + * North and South values are cut off at 90° + * * @param latitude double value * @param longitude double value */ @@ -44,14 +46,15 @@ public class LatLng { } /** - * Rounds the float to 4 digits. + * Rounds the float to 4 digits and returns absolute value. * * @param coordinate A coordinate value as string. * @return String of the rounded number. */ private String formatCoordinate(double coordinate) { double roundedNumber = Math.round(coordinate * 10000d) / 10000d; - return String.valueOf(roundedNumber); + double absoluteNumber = Math.abs(roundedNumber); + return String.valueOf(absoluteNumber); } /** @@ -73,7 +76,7 @@ public class LatLng { * @return "E" or "W". */ private String getEastWest() { - if (this.longitude < 180) { + if (this.longitude >= 0 && this.longitude < 180) { return "E"; } diff --git a/app/src/test/java/fr/free/nrw/commons/LatLngTests.java b/app/src/test/java/fr/free/nrw/commons/LatLngTests.java new file mode 100644 index 000000000..6d2f19386 --- /dev/null +++ b/app/src/test/java/fr/free/nrw/commons/LatLngTests.java @@ -0,0 +1,64 @@ +package fr.free.nrw.commons; + +import static org.hamcrest.CoreMatchers.is; + +import org.junit.Assert; +import org.junit.Test; + +import fr.free.nrw.commons.location.LatLng; + +public class LatLngTests { + @Test public void testZeroZero() { + LatLng place = new LatLng(0, 0); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("0.0 N, 0.0 E")); + } + + @Test public void testAntipode() { + LatLng place = new LatLng(0, 180); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("0.0 N, 180.0 W")); + } + + @Test public void testNorthPole() { + LatLng place = new LatLng(90, 0); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("90.0 N, 0.0 E")); + } + + @Test public void testSouthPole() { + LatLng place = new LatLng(-90, 0); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("90.0 S, 0.0 E")); + } + + @Test public void testLargerNumbers() { + LatLng place = new LatLng(120, 380); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("90.0 N, 20.0 E")); + } + + @Test public void testNegativeNumbers() { + LatLng place = new LatLng(-120, -30); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("90.0 S, 30.0 W")); + } + + @Test public void testTooBigWestValue() { + LatLng place = new LatLng(20, -190); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("20.0 N, 170.0 E")); + } + + @Test public void testRounding() { + LatLng place = new LatLng(0.1234567, -0.33333333); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("0.1235 N, 0.3333 W")); + } + + @Test public void testRoundingAgain() { + LatLng place = new LatLng(-0.000001, -0.999999); + String prettyString = place.getPrettyCoordinateString(); + Assert.assertThat(prettyString, is("0.0 S, 1.0 W")); + } +} From e42b22398c2bf9967f446a55dec29e82ef215f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Tue, 16 May 2017 21:51:49 +0200 Subject: [PATCH 15/17] Code style: sort imports --- app/src/test/java/fr/free/nrw/commons/LatLngTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/fr/free/nrw/commons/LatLngTests.java b/app/src/test/java/fr/free/nrw/commons/LatLngTests.java index 6d2f19386..b0c8d774e 100644 --- a/app/src/test/java/fr/free/nrw/commons/LatLngTests.java +++ b/app/src/test/java/fr/free/nrw/commons/LatLngTests.java @@ -1,11 +1,12 @@ package fr.free.nrw.commons; +import fr.free.nrw.commons.location.LatLng; + import static org.hamcrest.CoreMatchers.is; import org.junit.Assert; import org.junit.Test; -import fr.free.nrw.commons.location.LatLng; public class LatLngTests { @Test public void testZeroZero() { From 7abd61348b442ac76f2b37693c4941481ce95b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6nberg?= Date: Tue, 16 May 2017 21:58:43 +0200 Subject: [PATCH 16/17] Code style --- app/src/test/java/fr/free/nrw/commons/LatLngTests.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/test/java/fr/free/nrw/commons/LatLngTests.java b/app/src/test/java/fr/free/nrw/commons/LatLngTests.java index b0c8d774e..5267a48bd 100644 --- a/app/src/test/java/fr/free/nrw/commons/LatLngTests.java +++ b/app/src/test/java/fr/free/nrw/commons/LatLngTests.java @@ -1,13 +1,12 @@ package fr.free.nrw.commons; -import fr.free.nrw.commons.location.LatLng; - import static org.hamcrest.CoreMatchers.is; +import fr.free.nrw.commons.location.LatLng; + import org.junit.Assert; import org.junit.Test; - public class LatLngTests { @Test public void testZeroZero() { LatLng place = new LatLng(0, 0); From 547f2a062c87d41f4a1451f77db0d7efb6017222 Mon Sep 17 00:00:00 2001 From: Fawwaz Yusran Date: Wed, 17 May 2017 13:49:04 +0700 Subject: [PATCH 17/17] Replace 'removeAll()' with 'clear()' --- app/src/main/java/fr/free/nrw/commons/Media.java | 2 +- .../java/fr/free/nrw/commons/media/MediaDetailFragment.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index f8f90896a..1bd0344b7 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -173,7 +173,7 @@ public class Media implements Parcelable { } public void setCategories(List categories) { - this.categories.removeAll(this.categories); + this.categories.clear(); this.categories.addAll(categories); } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index b96845eb6..7f39a7ffd 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -235,7 +235,7 @@ public class MediaDetailFragment extends Fragment { coordinates.setText(prettyCoordinates(media)); uploadedDate.setText(prettyUploadedDate(media)); - categoryNames.removeAll(categoryNames); + categoryNames.clear(); categoryNames.addAll(media.getCategories()); categoriesLoaded = true; @@ -280,7 +280,7 @@ public class MediaDetailFragment extends Fragment { desc.setText(prettyDescription(media)); license.setText(prettyLicense(media)); - categoryNames.removeAll(categoryNames); + categoryNames.clear(); categoryNames.addAll(media.getCategories()); categoriesLoaded = true;