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/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/assets/queries/nearby_query.txt b/app/src/main/assets/queries/nearby_query.rq similarity index 75% rename from app/src/main/assets/queries/nearby_query.txt rename to app/src/main/assets/queries/nearby_query.rq index 02f741228..b6610c6c2 100644 --- a/app/src/main/assets/queries/nearby_query.txt +++ b/app/src/main/assets/queries/nearby_query.rq @@ -6,7 +6,8 @@ SELECT (SAMPLE(COALESCE(?class_label_preferred_language, ?class_label_any_language, "?")) as ?class_label) (SAMPLE(COALESCE(?icon0, ?icon1)) as ?icon) (SAMPLE(COALESCE(?emoji0, ?emoji1)) as ?emoji) - (SAMPLE(?sitelink) as ?sitelink) + ?wikipediaArticle + ?commonsArticle WHERE { # Around given location... SERVICE wikibase:around { @@ -37,7 +38,18 @@ SELECT OPTIONAL { ?sitelink schema:about ?item . ?sitelink schema:inLanguage "en" - } + } + OPTIONAL { + ?wikipediaArticle schema:about ?item ; + schema:isPartOf . + SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } + } + + OPTIONAL { + ?commonsArticle schema:about ?item ; + schema:isPartOf . + SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } + } } } - GROUP BY ?item \ No newline at end of file + GROUP BY ?item ?wikipediaArticle ?commonsArticle \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java index b7de470fc..1f11be2dc 100644 --- a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java @@ -1,14 +1,15 @@ package fr.free.nrw.commons; +import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.widget.TextView; -import fr.free.nrw.commons.theme.BaseActivity; - import butterknife.BindView; import butterknife.ButterKnife; +import fr.free.nrw.commons.theme.NavigationBaseActivity; -public class AboutActivity extends BaseActivity { +public class AboutActivity extends NavigationBaseActivity { @BindView(R.id.about_version) TextView versionText; @Override @@ -19,5 +20,11 @@ public class AboutActivity extends BaseActivity { ButterKnife.bind(this); versionText.setText(BuildConfig.VERSION_NAME); + initDrawer(); + } + + public static void startYourself(Context context) { + Intent settingsIntent = new Intent(context, AboutActivity.class); + context.startActivity(settingsIntent); } } \ No newline at end of file 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..df783be44 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; @@ -20,7 +24,14 @@ 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 fr.free.nrw.commons.nearby.NearbyPlaces; + import org.acra.ACRA; import org.acra.ReportingInteractionMode; import org.acra.annotation.ReportsCrashes; @@ -35,9 +46,10 @@ 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.utils.FileUtils; import timber.log.Timber; // TODO: Use ProGuard to rip out reporting when publishing @@ -51,7 +63,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"; @@ -70,13 +81,37 @@ 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; + private DBOpenHelper dbOpenHelper = null; + private NearbyPlaces nearbyPlaces = 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)); @@ -87,14 +122,50 @@ 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; + } + + 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(); - app = this; Timber.plant(new Timber.DebugTree()); @@ -105,9 +176,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); @@ -136,13 +206,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; @@ -150,7 +213,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); @@ -165,13 +228,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) { @@ -192,21 +251,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; } @@ -217,4 +267,47 @@ 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")) { + FileUtils.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(getInstance()).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; + } + + /** + * Deletes all tables and re-creates them. + * @param context context + */ + public void updateAllDatabases(Context context) { + DBOpenHelper dbOpenHelper = CommonsApplication.getInstance().getDBOpenHelper(); + dbOpenHelper.getReadableDatabase().close(); + SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); + + ModifierSequence.Table.onDelete(db); + Category.Table.onDelete(db); + Contribution.Table.onDelete(db); + } } 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/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/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/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/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 5fddb0034..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 @@ -12,8 +12,9 @@ import java.io.IOException; import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.CommonsApplication; +import fr.free.nrw.commons.theme.NavigationBaseActivity; -public abstract class AuthenticatedActivity extends BaseActivity { +public abstract class AuthenticatedActivity extends NavigationBaseActivity { String accountType; CommonsApplication app; @@ -131,7 +132,7 @@ public abstract class AuthenticatedActivity extends BaseActivity { @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..6db5f8654 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; @@ -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..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 @@ -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,14 @@ 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/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/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/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/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/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index 4e4c10052..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 @@ -25,11 +25,13 @@ import android.widget.AdapterView; import java.util.ArrayList; import java.util.Locale; +import butterknife.ButterKnife; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.HandlerService; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.AuthenticatedActivity; +import fr.free.nrw.commons.hamburger.HamburgerMenuContainer; import fr.free.nrw.commons.media.MediaDetailPagerFragment; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.upload.UploadService; @@ -41,7 +43,8 @@ public class ContributionsActivity AdapterView.OnItemClickListener, MediaDetailPagerFragment.MediaDetailProvider, FragmentManager.OnBackStackChangedListener, - ContributionsListFragment.SourceRefresher { + ContributionsListFragment.SourceRefresher, + HamburgerMenuContainer { private Cursor allContributions; private ContributionsListFragment contributionsList; @@ -50,6 +53,7 @@ public class ContributionsActivity private boolean isUploadServiceConnected; private ArrayList observersWaitingForLoad = new ArrayList<>(); private String CONTRIBUTION_SELECTION = ""; + /* This sorts in the following order: Currently Uploading @@ -105,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); @@ -119,8 +123,8 @@ public class ContributionsActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTitle(R.string.title_activity_contributions); setContentView(R.layout.activity_contributions); + ButterKnife.bind(this); // Activity can call methods in the fragment by acquiring a reference to the Fragment from FragmentManager, using findFragmentById() contributionsList = (ContributionsListFragment)getSupportFragmentManager().findFragmentById(R.id.contributionsListFragment); @@ -136,6 +140,7 @@ public class ContributionsActivity } } requestAuthToken(); + initDrawer(); } @Override @@ -214,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, @@ -320,4 +325,9 @@ public class ContributionsActivity public void refreshSource() { getSupportLoaderManager().restartLoader(0, null, this); } + + public static void startYourself(Context context) { + Intent settingsIntent = new Intent(context, ContributionsActivity.class); + context.startActivity(settingsIntent); + } } 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/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 f5efb8061..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 @@ -126,46 +126,6 @@ public class ContributionsListFragment extends Fragment { case R.id.menu_from_camera: controller.startCameraCapture(); return true; - case R.id.menu_settings: - Intent settingsIntent = new Intent(getActivity(), SettingsActivity.class); - startActivity(settingsIntent); - return true; - case R.id.menu_about: - Intent aboutIntent = new Intent(getActivity(), AboutActivity.class); - startActivity(aboutIntent); - return true; - case R.id.menu_feedback: - Intent feedbackIntent = new Intent(Intent.ACTION_SEND); - feedbackIntent.setType("message/rfc822"); - feedbackIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { CommonsApplication.FEEDBACK_EMAIL }); - feedbackIntent.putExtra(Intent.EXTRA_SUBJECT, String.format(CommonsApplication.FEEDBACK_EMAIL_SUBJECT, BuildConfig.VERSION_NAME)); - try { - startActivity(feedbackIntent); - } - catch (ActivityNotFoundException e) { - Toast.makeText(getActivity(), R.string.no_email_client, Toast.LENGTH_SHORT).show(); - } - return true; - case R.id.menu_nearby: - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (ContextCompat.checkSelfPermission(this.getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - //See http://stackoverflow.com/questions/33169455/onrequestpermissionsresult-not-being-called-in-dialog-fragment - requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 2); - return true; - } else { - Intent nearbyIntent = new Intent(getActivity(), NearbyActivity.class); - startActivity(nearbyIntent); - return true; - } - } - else { - Intent nearbyIntent = new Intent(getActivity(), NearbyActivity.class); - startActivity(nearbyIntent); - return true; - } - case R.id.menu_refresh: - ((SourceRefresher)getActivity()).refreshSource(); - return true; default: return super.onOptionsItemSelected(item); } @@ -199,12 +159,9 @@ 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); } - - menu.findItem(R.id.menu_refresh).setVisible(false); } @Override 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/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/hamburger/HamburgerMenuContainer.java b/app/src/main/java/fr/free/nrw/commons/hamburger/HamburgerMenuContainer.java new file mode 100644 index 000000000..677200b54 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/hamburger/HamburgerMenuContainer.java @@ -0,0 +1,9 @@ +package fr.free.nrw.commons.hamburger; + +import android.support.v7.app.ActionBarDrawerToggle; + +public interface HamburgerMenuContainer { + void setDrawerListener(ActionBarDrawerToggle listener); + void toggleDrawer(); + boolean isDrawerVisible(); +} 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 new file mode 100644 index 000000000..a77d672bf --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/hamburger/NavigationBaseFragment.java @@ -0,0 +1,165 @@ +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; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +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; + + +public class NavigationBaseFragment extends Fragment { + @BindView(R.id.pictureOfTheDay) + ImageView pictureOfTheDay; + + @BindView(R.id.upload_item) + LinearLayout uploadItem; + + @BindView(R.id.nearby_item) + LinearLayout nearbyItem; + + @BindView(R.id.about_item) + LinearLayout aboutItem; + + @BindView(R.id.settings_item) + LinearLayout settingsItem; + + @BindView(R.id.feedback_item) + LinearLayout feedbackItem; + + @BindView(R.id.logout_item) + LinearLayout logoutItem; + + private DrawerLayout drawerLayout; + private RelativeLayout drawerPane; + + @Override + public View onCreateView(LayoutInflater inflater, + ViewGroup container, + Bundle savedInstanceState) { + View hamburgerView = inflater.inflate(R.layout.navigation_drawer_menu, container, false); + ButterKnife.bind(this, hamburgerView); + showPictureOfTheDay(); + setupHamburgerMenu(); + return hamburgerView; + } + + private void showPictureOfTheDay() { + pictureOfTheDay.setImageDrawable(getResources().getDrawable(R.drawable.commons_logo_large)); + } + + @Override + public void onResume() { + super.onResume(); + } + + private void setupHamburgerMenu() { + ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(getActivity(), + drawerLayout, R.string.ok, R.string.cancel); + if (getActivity() instanceof HamburgerMenuContainer) { + ((HamburgerMenuContainer) getActivity()).setDrawerListener(drawerToggle); + } + } + + @OnClick(R.id.upload_item) + protected void onUploadItemClicked() { + closeDrawer(); + ContributionsActivity.startYourself(getActivity()); + } + + @OnClick(R.id.settings_item) + protected void onSettingsItemClicked() { + closeDrawer(); + SettingsActivity.startYourself(getActivity()); + } + + @OnClick(R.id.about_item) + protected void onAboutItemClicked() { + closeDrawer(); + AboutActivity.startYourself(getActivity()); + } + + @OnClick(R.id.nearby_item) + protected void onNearbyItemClicked() { + closeDrawer(); + NearbyActivity.startYourself(getActivity()); + } + + @OnClick(R.id.feedback_item) + protected void onFeedbackItemClicked() { + closeDrawer(); + Intent feedbackIntent = new Intent(Intent.ACTION_SEND); + feedbackIntent.setType("message/rfc822"); + feedbackIntent.putExtra(Intent.EXTRA_EMAIL, + new String[]{CommonsApplication.FEEDBACK_EMAIL}); + feedbackIntent.putExtra(Intent.EXTRA_SUBJECT, + String.format(CommonsApplication.FEEDBACK_EMAIL_SUBJECT, + BuildConfig.VERSION_NAME)); + try { + startActivity(feedbackIntent); + } catch (ActivityNotFoundException e) { + Toast.makeText(getActivity(), R.string.no_email_client, Toast.LENGTH_SHORT).show(); + } + } + + @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); + } + } + + public void setDrawerLayout(DrawerLayout drawerLayout, RelativeLayout drawerPane) { + this.drawerLayout = drawerLayout; + this.drawerPane = drawerPane; + } +} 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/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 6d46da801..e9aec9ad6 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); @@ -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; @@ -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(); } } 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/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/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/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); + } } } 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 0782fc07b..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 @@ -1,12 +1,9 @@ package fr.free.nrw.commons.nearby; - import android.content.Context; - import android.content.DialogInterface; import android.content.Intent; import android.location.LocationManager; - import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; @@ -20,23 +17,22 @@ import android.view.View; import android.widget.ProgressBar; import android.widget.Toast; -import butterknife.BindView; -import butterknife.ButterKnife; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import fr.free.nrw.commons.location.LatLng; -import fr.free.nrw.commons.location.LocationServiceManager; -import fr.free.nrw.commons.theme.BaseActivity; -import fr.free.nrw.commons.utils.UriSerializer; - -import fr.free.nrw.commons.R; -import timber.log.Timber; - import java.util.List; -public class NearbyActivity extends BaseActivity { +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; +import fr.free.nrw.commons.utils.UriSerializer; +import timber.log.Timber; + +public class NearbyActivity extends NavigationBaseActivity { @BindView(R.id.progressBar) ProgressBar progressBar; private boolean isMapViewActive = false; @@ -64,7 +60,7 @@ public class NearbyActivity extends BaseActivity { curLatLang = locationManager.getLatestLocation(); nearbyAsyncTask = new NearbyAsyncTask(this); nearbyAsyncTask.execute(); - + initDrawer(); } @Override @@ -189,7 +185,7 @@ public class NearbyActivity extends BaseActivity { @Override protected List doInBackground(Void... params) { return NearbyController - .loadAttractionsFromLocation(curLatLang, getApplicationContext() + .loadAttractionsFromLocation(curLatLang, CommonsApplication.getInstance() ); } @@ -251,4 +247,9 @@ public class NearbyActivity extends BaseActivity { fragmentTransaction.replace(R.id.container, fragment); fragmentTransaction.commit(); } + + public static void startYourself(Context context) { + Intent settingsIntent = new Intent(context, NearbyActivity.class); + context.startActivity(settingsIntent); + } } 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/NearbyInfoDialog.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java index 3bf6f7a50..a4b9a74cb 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java @@ -14,7 +14,6 @@ import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; import fr.free.nrw.commons.R; -import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.ui.widget.OverlayDialog; import fr.free.nrw.commons.utils.DialogUtil; @@ -25,8 +24,7 @@ public class NearbyInfoDialog extends OverlayDialog { private final static String ARG_DESC = "placeDesc"; private final static String ARG_LATITUDE = "latitude"; private final static String ARG_LONGITUDE = "longitude"; - private final static String ARG_ARTICLE_LINK = "articleLink"; - private final static String ARG_WIKI_DATA_LINK = "wikiDataLink"; + private final static String ARG_SITE_LINK = "sitelink"; @BindView(R.id.link_preview_title) TextView placeTitle; @@ -58,15 +56,10 @@ public class NearbyInfoDialog extends OverlayDialog { } private void getArticleLink(Bundle bundle) { - String articleLink = bundle.getString(ARG_ARTICLE_LINK); - articleLink = articleLink.replace("<", "").replace(">", ""); + Sitelinks sitelinks = bundle.getParcelable(ARG_SITE_LINK); - if (Utils.isNullOrWhiteSpace(articleLink) || articleLink == "\n") { - articleLink = bundle.getString(ARG_WIKI_DATA_LINK).replace("<", "").replace(">", ""); - } - - if (!Utils.isNullOrWhiteSpace(articleLink) && articleLink != "\n") { - this.articleLink = Uri.parse(articleLink); + if (sitelinks.getWikipediaLink() != null) { + this.articleLink = sitelinks.getWikipediaLink(); } else { goToButton.setVisibility(View.GONE); } @@ -79,8 +72,7 @@ public class NearbyInfoDialog extends OverlayDialog { bundle.putString(ARG_DESC, place.description); bundle.putDouble(ARG_LATITUDE, place.location.latitude); bundle.putDouble(ARG_LONGITUDE, place.location.longitude); - bundle.putString(ARG_ARTICLE_LINK, place.siteLink.toString()); - bundle.putString(ARG_WIKI_DATA_LINK, place.wikiDataLink.toString()); + bundle.putParcelable(ARG_SITE_LINK, place.siteLinks); mDialog.setArguments(bundle); DialogUtil.showSafely(fragmentActivity, mDialog); } 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 { 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 a6d08be04..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 @@ -25,17 +25,13 @@ import timber.log.Timber; public class NearbyPlaces { private static final int MIN_RESULTS = 40; - private static final double INITIAL_RADIUS = 1.0; - private static final double MAX_RADIUS = 300.0; + private static final double INITIAL_RADIUS = 1.0; // in kilometer + 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) { @@ -69,16 +65,20 @@ public class NearbyPlaces { throws IOException { List places = new ArrayList<>(); - String query = FileUtils.readFromFile(context, "queries/nearby_query.txt"); + String query = FileUtils.readFromFile(context, "queries/nearby_query.rq") + .replace("${RADIUS}", String.format(Locale.ROOT, "%.2f", radius)) + .replace("${LAT}", String.format(Locale.ROOT, "%.4f", cur.latitude)) + .replace("${LONG}", String.format(Locale.ROOT, "%.4f", cur.longitude)) + .replace("${LANG}", lang); - Timber.d(query); + Timber.d("Wikidata query "+ query); + + // format as a URL + String url = WIKIDATA_QUERY_URL.replace( + "${QUERY}", + URLEncoder.encode(query, "utf-8").replace("+", "%20") + ); - query = query.replace("${RADIUS}", "" + radius) - .replace("${LAT}", "" + String.format(Locale.ROOT, "%.3f", cur.latitude)) - .replace("${LONG}", "" + String.format(Locale.ROOT, "%.3f", cur.longitude)) - .replace("${LANG}", "" + lang); - query = URLEncoder.encode(query, "utf-8").replace("+", "%20"); - String url = WIKIDATA_QUERY_URL.replace("${QUERY}", query); Timber.d(url); URLConnection conn = new URL(url).openConnection(); conn.setRequestProperty("Accept", "text/tab-separated-values"); @@ -97,8 +97,9 @@ public class NearbyPlaces { String point = fields[0]; String name = Utils.stripLocalizedString(fields[2]); String type = Utils.stripLocalizedString(fields[4]); - String sitelink = Utils.stripLocalizedString(fields[7]); - String wikiDataLink = Utils.stripLocalizedString(fields[3]); + String wikipediaSitelink = Utils.stripLocalizedString(fields[7]); + String commonsSitelink = Utils.stripLocalizedString(fields[8]); + String wikiDataLink = Utils.stripLocalizedString(fields[1]); String icon = fields[5]; double latitude = 0; @@ -121,8 +122,11 @@ public class NearbyPlaces { type, // details Uri.parse(icon), new LatLng(latitude, longitude), - Uri.parse(sitelink), - Uri.parse(wikiDataLink) + new Sitelinks.Builder() + .setWikipediaLink(wikipediaSitelink) + .setCommonsLink(commonsSitelink) + .setWikidataLink(wikiDataLink) + .build() )); } in.close(); @@ -180,8 +184,7 @@ public class NearbyPlaces { type, // details null, new LatLng(latitude, longitude), - null, - null + new Sitelinks.Builder().build() )); } in.close(); @@ -192,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; - } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyViewHolder.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyViewHolder.java index 19e008068..c853dba78 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyViewHolder.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyViewHolder.java @@ -25,9 +25,12 @@ public class NearbyViewHolder implements ViewHolder { public void bindModel(Context context, Place place) { // Populate the data into the template view using the data object tvName.setText(place.name); - tvDesc.setText(place.description); + String description = place.description; + if ( description == null || description.isEmpty() || description.equals("?")) { + description = "No Description Found"; + } + tvDesc.setText(description); distance.setText(place.distance); - icon.setImageResource(ResourceUtils.getDescriptionIcon(place.description)); } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java index a975282e9..dcc7fd74f 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java @@ -16,19 +16,17 @@ public class Place { public Bitmap image; public Bitmap secondaryImage; public String distance; - public Uri siteLink; - public Uri wikiDataLink; + public Sitelinks siteLinks; public Place(String name, String description, String longDescription, - Uri secondaryImageUrl, LatLng location, Uri siteLink, Uri wikiDataLink) { + Uri secondaryImageUrl, LatLng location, Sitelinks siteLinks) { this.name = name; this.description = description; this.longDescription = longDescription; this.secondaryImageUrl = secondaryImageUrl; this.location = location; - this.siteLink = siteLink; - this.wikiDataLink = wikiDataLink; + this.siteLinks = siteLinks; } public void setDistance(String distance) { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java b/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java new file mode 100644 index 000000000..6222ec909 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java @@ -0,0 +1,106 @@ +package fr.free.nrw.commons.nearby; + +import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.Nullable; + +import fr.free.nrw.commons.Utils; + +public class Sitelinks implements Parcelable { + private final String wikipediaLink; + private final String commonsLink; + private final String wikidataLink; + + + protected Sitelinks(Parcel in) { + wikipediaLink = in.readString(); + commonsLink = in.readString(); + wikidataLink = in.readString(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(wikipediaLink); + dest.writeString(commonsLink); + dest.writeString(wikidataLink); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public Sitelinks createFromParcel(Parcel in) { + return new Sitelinks(in); + } + + @Override + public Sitelinks[] newArray(int size) { + return new Sitelinks[size]; + } + }; + + @Nullable + public Uri getWikipediaLink() { + return sanitiseString(wikipediaLink); + } + + @Nullable + public Uri getCommonsLink() { + return sanitiseString(commonsLink); + } + + @Nullable + public Uri getWikidataLink() { + return sanitiseString(wikidataLink); + } + + @Nullable + private Uri sanitiseString(String stringUrl) { + stringUrl = stringUrl + .replaceAll("<", "") + .replaceAll(">", "") + .replaceAll("\n", ""); + if (!Utils.isNullOrWhiteSpace(stringUrl) && stringUrl != null) { + return Uri.parse(stringUrl); + } + return null; + } + + public Sitelinks(Sitelinks.Builder builder) { + this.wikidataLink = builder.wikidataLink; + this.wikipediaLink = builder.wikipediaLink; + this.commonsLink = builder.commonsLink; + } + + public static class Builder { + private String wikidataLink; + private String commonsLink; + private String wikipediaLink; + + public Builder() { + } + + public Sitelinks.Builder setWikipediaLink(String link) { + this.wikipediaLink = link; + return this; + } + + public Sitelinks.Builder setWikidataLink(String link) { + this.wikidataLink = link; + return this; + } + + public Sitelinks.Builder setCommonsLink(@Nullable String link) { + this.commonsLink = link; + return this; + } + + public Sitelinks build() { + return new Sitelinks(this); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java index 1838619c0..f1aceb517 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java @@ -1,14 +1,20 @@ package fr.free.nrw.commons.settings; +import android.content.Context; +import android.content.Intent; import android.os.Bundle; -import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatDelegate; import android.view.MenuItem; +import butterknife.BindView; +import butterknife.ButterKnife; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.theme.NavigationBaseActivity; + +public class SettingsActivity extends NavigationBaseActivity { + private SettingsFragment settingsFragment; -public class SettingsActivity extends PreferenceActivity { private AppCompatDelegate settingsDelegate; @Override @@ -20,11 +26,13 @@ public class SettingsActivity extends PreferenceActivity { setTheme(R.style.LightAppTheme); } - // Display the fragment as the main content. - getFragmentManager().beginTransaction() - .replace(android.R.id.content, new SettingsFragment()).commit(); + settingsFragment = (SettingsFragment) getFragmentManager().findFragmentById(R.id.settingsFragment); super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + + ButterKnife.bind(this); + initDrawer(); } // Get an action bar @@ -37,7 +45,7 @@ public class SettingsActivity extends PreferenceActivity { settingsDelegate.onPostCreate(savedInstanceState); //Get an up button - settingsDelegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + //settingsDelegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true); } //Handle action-bar clicks @@ -51,4 +59,9 @@ public class SettingsActivity extends PreferenceActivity { return super.onOptionsItemSelected(item); } } + + public static void startYourself(Context context) { + Intent settingsIntent = new Intent(context, SettingsActivity.class); + context.startActivity(settingsIntent); + } } \ No newline at end of file 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/theme/BaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java index b0be190a4..62f0d2767 100644 --- a/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/theme/BaseActivity.java @@ -3,14 +3,19 @@ package fr.free.nrw.commons.theme; import android.content.Intent; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AppCompatActivity; +import android.widget.RelativeLayout; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; +import fr.free.nrw.commons.hamburger.NavigationBaseFragment; +import fr.free.nrw.commons.utils.FragmentUtils; public class BaseActivity extends AppCompatActivity { boolean currentTheme; + @Override protected void onCreate(Bundle savedInstanceState) { if(Utils.isDarkTheme(this)){ diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java new file mode 100644 index 000000000..d5331c710 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java @@ -0,0 +1,82 @@ +package fr.free.nrw.commons.theme; + +import android.os.Bundle; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.widget.Toolbar; +import android.view.ViewGroup; +import android.widget.RelativeLayout; + +import butterknife.BindView; +import butterknife.ButterKnife; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.hamburger.HamburgerMenuContainer; +import fr.free.nrw.commons.hamburger.NavigationBaseFragment; +import fr.free.nrw.commons.utils.FragmentUtils; + +import static android.support.v4.view.GravityCompat.START; + +public class NavigationBaseActivity extends BaseActivity implements HamburgerMenuContainer { + @BindView(R.id.toolbar) + Toolbar toolbar; + + @BindView(R.id.drawer_layout) + DrawerLayout drawerLayout; + + @BindView(R.id.drawer_pane) + RelativeLayout drawerPane; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + public void initDrawer() { + initSubviews(); + NavigationBaseFragment baseFragment = new NavigationBaseFragment(); + baseFragment.setDrawerLayout(drawerLayout, drawerPane); + FragmentUtils.addAndCommitFragmentWithImmediateExecution(getSupportFragmentManager(), + R.id.drawer_fragment, + baseFragment); + } + + private void initSubviews() { + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, + drawerLayout, + toolbar, + R.string.navigation_drawer_open, + R.string.navigation_drawer_close); + drawerLayout.setDrawerListener(toggle); + toggle.setDrawerIndicatorEnabled(true); + toggle.syncState(); + setDrawerPaneWidth(); + } + + private void setDrawerPaneWidth() { + ViewGroup.LayoutParams params = drawerPane.getLayoutParams(); + // set width to lowerBound of 80% of the screen size + params.width = (getResources().getDisplayMetrics().widthPixels * 70) / 100; + drawerPane.setLayoutParams(params); + } + + @Override + public void setDrawerListener(ActionBarDrawerToggle listener) { + drawerLayout.setDrawerListener(listener); + } + + @Override + public void toggleDrawer() { + if (drawerLayout.isDrawerVisible(START)) { + drawerLayout.closeDrawer(START); + } else { + drawerLayout.openDrawer(START); + } + } + + @Override + public boolean isDrawerVisible() { + return drawerLayout.isDrawerVisible(START); + } +} 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/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; 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 aae338516..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 @@ -20,6 +20,8 @@ import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.Toast; +import butterknife.ButterKnife; + import java.util.ArrayList; import fr.free.nrw.commons.CommonsApplication; @@ -130,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(); } } @@ -200,7 +206,9 @@ public class MultipleShareActivity uploadController = new UploadController(this); setContentView(R.layout.activity_multiple_uploads); - app = (CommonsApplication)this.getApplicationContext(); + app = CommonsApplication.getInstance(); + ButterKnife.bind(this); + initDrawer(); if(savedInstanceState != null) { photosList = savedInstanceState.getParcelableArrayList("uploadsList"); @@ -237,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 8cc9246d2..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 @@ -25,6 +25,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import butterknife.ButterKnife; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.EventLog; import fr.free.nrw.commons.R; @@ -105,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"); } @@ -188,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"); @@ -214,8 +219,9 @@ public class ShareActivity super.onCreate(savedInstanceState); uploadController = new UploadController(this); setContentView(R.layout.activity_share); - - app = (CommonsApplication)this.getApplicationContext(); + ButterKnife.bind(this); + initDrawer(); + app = CommonsApplication.getInstance(); backgroundImageView = (ImageView)findViewById(R.id.backgroundImage); //Receive intent from ContributionController.java when user selects picture to upload @@ -396,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) { 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 4cb20ae0a..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,22 +3,25 @@ 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; +import timber.log.Timber; + public class FileUtils { public static String readFromFile(Context context, String fileName) { String stringBuilder = ""; BufferedReader reader = null; try { reader = new BufferedReader( - new InputStreamReader(context.getAssets().open(fileName), "UTF-8")); + new InputStreamReader(context.getAssets().open(fileName))); String mLine; while ((mLine = reader.readLine()) != null) { stringBuilder += mLine + "\n"; } } catch (IOException e) { - //log the exception + Timber.e("File not found exception", e); } finally { if (reader != null) { try { @@ -30,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; + } + + } diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java new file mode 100644 index 000000000..aa79513e8 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/FragmentUtils.java @@ -0,0 +1,31 @@ +package fr.free.nrw.commons.utils; + +import android.support.annotation.IdRes; +import android.support.annotation.NonNull; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; + +import timber.log.Timber; + +public class FragmentUtils { + + public static boolean addAndCommitFragmentWithImmediateExecution( + @NonNull FragmentManager fragmentManager, + @IdRes int containerViewId, + @NonNull Fragment fragment) { + if (fragment.isAdded()) { + Timber.w("Could not add fragment. The fragment is already added."); + return false; + } + try { + fragmentManager.beginTransaction() + .add(containerViewId, fragment) + .commitNow(); + return true; + } catch (IllegalStateException e) { + Timber.e(e, "Could not add & commit fragment. " + + "Did you mean to call commitAllowingStateLoss?"); + } + return false; + } +} 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 000000000..ad0f63e5b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_exit_to_app_black_24dp.png differ 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 000000000..f03168559 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_feedback_black_24dp.png differ 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 000000000..5e5b9fc4a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_file_upload_black_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png new file mode 100644 index 000000000..4b5ab06e1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png differ 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 000000000..df1f34062 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_location_on_black_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png new file mode 100644 index 000000000..acf1ddf85 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png differ 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 000000000..dee407b59 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_exit_to_app_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_feedback_black_24dp.png new file mode 100644 index 000000000..8be6849cb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_feedback_black_24dp.png differ 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 000000000..c5f2954bd Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_file_upload_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png new file mode 100644 index 000000000..e0c9fe0eb Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png differ 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 000000000..92a073827 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_location_on_black_24dp.png differ 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 000000000..c59419c02 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_exit_to_app_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_exit_to_app_black_24dp.png new file mode 100644 index 000000000..5a536d57c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_exit_to_app_black_24dp.png differ 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 000000000..63bec2331 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_feedback_black_24dp.png differ 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 000000000..41694c101 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_file_upload_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png new file mode 100644 index 000000000..b706f0d06 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_location_on_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_location_on_black_24dp.png new file mode 100644 index 000000000..b2696b6d4 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_location_on_black_24dp.png differ 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 000000000..e84e188a1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png differ 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 000000000..53b79d4c7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_exit_to_app_black_24dp.png differ 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 000000000..e68ceb906 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_feedback_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_file_upload_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_file_upload_black_24dp.png new file mode 100644 index 000000000..bb5d0923b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_file_upload_black_24dp.png differ 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 000000000..3847a9fe7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_location_on_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_location_on_black_24dp.png new file mode 100644 index 000000000..5a21dfae6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_location_on_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png new file mode 100644 index 000000000..3023ff8da Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png differ 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 000000000..e30632b6b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_exit_to_app_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_feedback_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_feedback_black_24dp.png new file mode 100644 index 000000000..1343fa837 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_feedback_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_file_upload_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_file_upload_black_24dp.png new file mode 100644 index 000000000..9ce5b8a7b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_file_upload_black_24dp.png differ 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 000000000..c1e2a03a4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png differ 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 000000000..7c2217e46 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_location_on_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png new file mode 100644 index 000000000..476d5c978 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png differ 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/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 @@ - - - - - + + + diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 91bf8e73f..2af3765ae 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -1,71 +1,103 @@ - + android:layout_height="match_parent"> - + - + - + - + - + - + - - + - \ No newline at end of file + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_contributions.xml b/app/src/main/res/layout/activity_contributions.xml index e980662d3..106f1ff20 100644 --- a/app/src/main/res/layout/activity_contributions.xml +++ b/app/src/main/res/layout/activity_contributions.xml @@ -1,17 +1,48 @@ - + android:layout_height="match_parent"> - + android:layout_height="match_parent"> + - \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_multiple_uploads.xml b/app/src/main/res/layout/activity_multiple_uploads.xml index 725c16968..a83ce3429 100644 --- a/app/src/main/res/layout/activity_multiple_uploads.xml +++ b/app/src/main/res/layout/activity_multiple_uploads.xml @@ -1,8 +1,38 @@ - + + + + + + + + + - \ No newline at end of file + android:layout_gravity="start" + android:background="@android:color/white"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_nearby.xml b/app/src/main/res/layout/activity_nearby.xml index 53f31056b..995136383 100644 --- a/app/src/main/res/layout/activity_nearby.xml +++ b/app/src/main/res/layout/activity_nearby.xml @@ -1,22 +1,50 @@ - + android:layout_height="match_parent"> - + android:layout_height="match_parent"> - + + + + + + + + + + + - + android:layout_gravity="start" + android:background="@android:color/white"> - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 000000000..739621929 --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_share.xml b/app/src/main/res/layout/activity_share.xml index 3eecb6ec1..00ad0ecd9 100644 --- a/app/src/main/res/layout/activity_share.xml +++ b/app/src/main/res/layout/activity_share.xml @@ -1,20 +1,50 @@ - + + android:layout_height="match_parent"> - + android:layout_height="match_parent"> - + - \ No newline at end of file + + + + + + + + + + + + + + + \ No newline at end of file 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/toolbar.xml b/app/src/main/res/layout/toolbar.xml new file mode 100644 index 000000000..c7aac814a --- /dev/null +++ b/app/src/main/res/layout/toolbar.xml @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/welcome_do_upload.xml b/app/src/main/res/layout/welcome_do_upload.xml index 74d62ec8a..26b945461 100644 --- a/app/src/main/res/layout/welcome_do_upload.xml +++ b/app/src/main/res/layout/welcome_do_upload.xml @@ -1,6 +1,5 @@ - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 414a22971..a960d4353 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -57,8 +57,8 @@ الإعدادات سجّل حول - برنامج مفتوح المصدر منشور <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">برخصة أباتشي النسخة 2</a> - المصدر على <a href=\"https://github.com/wikimedia/apps-android-commons\">غِتهب</a>. العلل في <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">بغزِلا</a>. + برنامج مفتوح المصدر منشور <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">برخصة أباتشي النسخة 2</a> + المصدر على <a href=\"https://github.com/commons-app/apps-android-commons\">غِتهب</a>. العلل في <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">بغزِلا</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">سياسة الخصوصية</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CREDITS</a> حول diff --git a/app/src/main/res/values-b+nds+NL/strings.xml b/app/src/main/res/values-b+nds+NL/strings.xml index d6fa5df03..393d8ce9b 100644 --- a/app/src/main/res/values-b+nds+NL/strings.xml +++ b/app/src/main/res/values-b+nds+NL/strings.xml @@ -53,8 +53,8 @@ Klik op dit bericht (of gao weerumme) um disse stap over te slaon. Gebruuksrapporten naor Wikimedia sturen um ons te helpen de applikasie te verbeteren Veurkeuren Informasie - Open Source-programmatuur uutgeven onder de linsensie <a href=\"https://github.com/wikimedia/android-commons/blob/master/COPYING\">Apache License v2</a> - Bronkode op <a href=\"https://github.com/wikimedia/android-commons\">GitHub</a>. Fouten bie <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. + Open Source-programmatuur uutgeven onder de linsensie <a href=\"https://github.com/commons-app/android-commons/blob/master/COPYING\">Apache License v2</a> + Bronkode op <a href=\"https://github.com/commons-app/android-commons\">GitHub</a>. Fouten bie <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Gegevensbeleid</a> Informasie Wat wi\'j ons vertellen? (per netpost) diff --git a/app/src/main/res/values-bcl/strings.xml b/app/src/main/res/values-bcl/strings.xml index 914c5e8ff..5b954d1ca 100644 --- a/app/src/main/res/values-bcl/strings.xml +++ b/app/src/main/res/values-bcl/strings.xml @@ -50,8 +50,8 @@ Taptapon ining mensahe (o pinduta an ibalik) tanganing luksuhan ining panuntunga Ipadara an mga talaan nin paggagamit sa Wikimidya sa pagtabang samuya na mapakarhay an app Mga Panuytoy Panunungod - Bukas na Ginikanang panuklob ipinaghaya na sa lindong kan <a href=\"https://github.com/wikimedia/android-commons/blob/master/COPYING\">Apache License v2</a> - Ginikanan sa <a href=\"https://github.com/wikimedia/android-commons\">GitHub</a>. Mga kubol sa <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. + Bukas na Ginikanang panuklob ipinaghaya na sa lindong kan <a href=\"https://github.com/commons-app/android-commons/blob/master/COPYING\">Apache License v2</a> + Ginikanan sa <a href=\"https://github.com/commons-app/android-commons\">GitHub</a>. Mga kubol sa <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. Ano ini? Panunungod Ipadara an balik-simbag (sa paagi nin E-surat) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 8e1da4211..ec25a5a3f 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -74,7 +74,7 @@ সেটিং নিবন্ধন করুন পরিচিতি - ওপেন সোর্স সফটওয়্যার <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">এ্যাপাচি লাইসেন্স v2</a> অধীনে প্রকাশিত + ওপেন সোর্স সফটওয়্যার <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">এ্যাপাচি লাইসেন্স v2</a> অধীনে প্রকাশিত <a href=\"https://github.com/commons-app/apps-android-commons\">উৎস</a> ও <a href=\"https://commons-app.github.io/\">ওয়েবসাইট</a> GitHub এ</a>। কোন সমস্যা ও পরামর্শের জন্য <a href=\"https://github.com/commons-app/apps-android-commons/issues\">গিটহাব ইস্যু</a> তৈরি করুন। <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">গোপনীয়তা নীতি</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">কৃতিত্ব</a> diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 9ec89fa4b..a53781025 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -70,8 +70,8 @@ Paràmetres Registre Quant a - Programari de codi obert distribuït sota la <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">llicència Apache v2</a> - Codi a <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Informes d\'error a <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Programari de codi obert distribuït sota la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">llicència Apache v2</a> + Codi a <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Informes d\'error a <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. Wikimedia:Commons-android-texts-sobre privacitat/ca Quant a Envia comentaris (per correu) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 9ca09635f..6e42fa479 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -71,7 +71,7 @@ Cyffyrddwch y neges hon (neu ddewis Nôl) i fynd i\'r cam nesaf. Gosodiadau Cofrestru Amdanom - Meddalwedd Cynnwys Agored wedi\'i rhyddhau o dan <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Drwydded Apache v2</a> Mae logo a nod masnach Comin Wicimedia yn eiddo i Sefydliad Wicimedia ac fe\'u defnyddir gyda chaniatad y Sefydliad hwnnw. Nid ydym ni wedi cael sêl bendith y sefydliad nac yn perthyn iddyn nhw. + Meddalwedd Cynnwys Agored wedi\'i rhyddhau o dan <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Drwydded Apache v2</a> Mae logo a nod masnach Comin Wicimedia yn eiddo i Sefydliad Wicimedia ac fe\'u defnyddir gyda chaniatad y Sefydliad hwnnw. Nid ydym ni wedi cael sêl bendith y sefydliad nac yn perthyn iddyn nhw. <a href=\"https://github.com/commons-app/apps-android-commons\">Mae\'r codau ffynhonnell ar wefanau</a> Comin a <a href=\"https://commons-app.github.io/\">gwefan </a> GitHub. Gellwch greu <a href=\"https://github.com/commons-app/apps-android-commons/issues\">Ymholiad Github</a> os gwelwch byg, neu i awgrymu gwelliannau. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Polisi preifatrwydd</a> Amdanom diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 56a585ac1..930b6ae2b 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -49,8 +49,8 @@ Send brugsrapporter til Wikimedia, så vi kan forbedre denne app Indstillinger Om - Open Source-software frigivet under <a href=\"https://github.com/wikimedia/android-commons/blob/master/COPYING\">Apache License v2</a> - Kildekode på <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Fejlmeldinger på <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Open Source-software frigivet under <a href=\"https://github.com/commons-app/android-commons/blob/master/COPYING\">Apache License v2</a> + Kildekode på <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Fejlmeldinger på <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Privacy policy</a> Om Send tilbagemelding (med e-mail) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 36aeed2a9..0dac7447a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -74,7 +74,7 @@ Ρυθμίσεις Εγγραφή Σχετικά - Λογισμικό ανοικτού κώδικα και κυκλοφορεί υπό την <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Άδεια Apache v2</a>. Το Wikimedia Commons και το λογότυπο είναι εμπορικά σήματα του Ιδρύματος Wikimedia και χρησιμοποιούνται με άδεια από το Ίδρυμα Wikimedia. Δεν προτεινόμαστε ή συνδεόμαστε με το Ίδρυμα Wikimedia. + Λογισμικό ανοικτού κώδικα και κυκλοφορεί υπό την <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Άδεια Apache v2</a>. Το Wikimedia Commons και το λογότυπο είναι εμπορικά σήματα του Ιδρύματος Wikimedia και χρησιμοποιούνται με άδεια από το Ίδρυμα Wikimedia. Δεν προτεινόμαστε ή συνδεόμαστε με το Ίδρυμα Wikimedia. <a href=\"https://github.com/commons-app/apps-android-commons\">Πηγή</a> και <a href=\"https://commons-app.github.io/\">ιστοσελίδα</a> στο GitHub. Δημιουργήστε ένα νέο <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub θέμα</a> για αναφορές σφαλμάτων και προτάσεις. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Πολιτική προσωπικών δεδομένων</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CREDITS</a> diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 026da57b1..db1cf899a 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -73,7 +73,7 @@ تنظیمات ثبت نام درباره - نرم‌افزار متن‌باز آزاد تحت <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">مجوز آپاچی نسخهٔ ۲</a> + نرم‌افزار متن‌باز آزاد تحت <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">مجوز آپاچی نسخهٔ ۲</a> ویکی‌انبار و نشانش یک نشان تجاری‌ست و با اجازهٔ بنیاد ویکی‌مدیا استفاده می‌شود. ما زیرمجموعه یا شعبهٔ بنیاد نیستیم. <a href=\"https://github.com/commons-app/apps-android-commons\">Source</a> and <a href=\"https://commons-app.github.io/\">وب‌سایت</a> در گیت‌هاب. ایجاد یک <a href=\"https://github.com/commons-app/apps-android-commons/issues\">درخواست در گیت‌هاب</a> برای گزارش باگ و یا پیشنهاد یک خصوصیت جدید. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 99ab3b272..f02725f72 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -73,7 +73,7 @@ Napauta tätä viestiä (tai paina takaisin) ohittaaksesi tämän vaiheen.Asetukset Rekisteröidy Tietoja - Vapaan lähdekoodin ohjelmisto, joka on julkaistu <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> -lisenssin alaisena. Wikimedia Commons ja sen logo ovat Wikimedia Foundationin tavaramerkkejä ja niitä käytetään Wikimedia Foundationin luvalla. Emme ole hyväksyttyjä tai sidoksissa Wikimedia Foundationioniin. + Vapaan lähdekoodin ohjelmisto, joka on julkaistu <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> -lisenssin alaisena. Wikimedia Commons ja sen logo ovat Wikimedia Foundationin tavaramerkkejä ja niitä käytetään Wikimedia Foundationin luvalla. Emme ole hyväksyttyjä tai sidoksissa Wikimedia Foundationioniin. <a href=\"https://github.com/commons-app/apps-android-commons\">Lähde</a> ja <a href=\"https://commons-app.github.io/\">nettisivusto</a> GitHubissa. Luo uusi <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-issue</a> bugiraporteille ja ehdotuksille. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Yksityisyydensuoja</a> Tietoja diff --git a/app/src/main/res/values-fo/strings.xml b/app/src/main/res/values-fo/strings.xml index 55ac6c40e..e0c3ba1bd 100644 --- a/app/src/main/res/values-fo/strings.xml +++ b/app/src/main/res/values-fo/strings.xml @@ -52,8 +52,8 @@ Trýst hetta boðið (ella vend aftur) fyri at droppa hetta stigið. Send brúkarafrágreiðingar til Wikimedia fyri at hjálpa okkum at betra um appina Innstillingar Um - Open Source ritbúnaður útgivin undir <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> - Kelda á <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Lýs (bugs) á <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Open Source ritbúnaður útgivin undir <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> + Kelda á <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Lýs (bugs) á <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Privatlívs politikkur</a> Um Send afturmelding (við T-posti) diff --git a/app/src/main/res/values-frr/strings.xml b/app/src/main/res/values-frr/strings.xml index 4fa9357eb..37fcd6d22 100644 --- a/app/src/main/res/values-frr/strings.xml +++ b/app/src/main/res/values-frr/strings.xml @@ -71,7 +71,7 @@ Iinstelangen Iinskriiw Auer - Open Source software ütjden oner det lisens <a href=\"https://github.com/wikimedia/android-commons/blob/master/COPYING\">Apache License v2</a>. + Open Source software ütjden oner det lisens <a href=\"https://github.com/commons-app/android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons an det Wikimedia-Commons-Logo san markintiaken faan\'t Wikimedia Foundation an wurd mä ferloof faan\'t Wikimedia Foundation brükt. Wi hiar ei tu\'t Wikimedia Foundation. <a href=\"https://github.com/commons-app/apps-android-commons\">Code</a> an <a href=\"https://commons-app.github.io/\">Wääbsteed</a> üüb GitHub</a>. En neien <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-iindrach</a> för feelern of föörslacher maage. Brükerreegeln diff --git a/app/src/main/res/values-haw/strings.xml b/app/src/main/res/values-haw/strings.xml index d8d295356..00da5e933 100644 --- a/app/src/main/res/values-haw/strings.xml +++ b/app/src/main/res/values-haw/strings.xml @@ -49,8 +49,8 @@ Hoʻouka i nā hōʻike hana iā Wikimedia no ka holomua ʻana o kēia pōlamu Makemake Pilina - Hāʻawi ʻia nā lako pōlamu kūmolenoa ma lalo o ka <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Laikini ʻApaki m2</a> - Aia ke kūmole ma <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Aia nā mū ma <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a> + Hāʻawi ʻia nā lako pōlamu kūmolenoa ma lalo o ka <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Laikini ʻApaki m2</a> + Aia ke kūmole ma <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Aia nā mū ma <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a> <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Kulekele pilikino</a> Pilina Hoʻouna Manaʻo (ia Lekauila) diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index bd4329bbc..15c783dce 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -53,8 +53,8 @@ לשלוח דוחות שימוש לויקימדיה כדי לעזור לנו לשפר את היישום הגדרות אודות - תוכנת קוד-פתוח המשוחררת תחת רישיון <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">אפאצ\'י גרסה 2</a> - קוד מקור ב־<a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. דיווחי באגים ב<a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">באגזילה</a>. + תוכנת קוד-פתוח המשוחררת תחת רישיון <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">אפאצ\'י גרסה 2</a> + קוד מקור ב־<a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. דיווחי באגים ב<a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">באגזילה</a>. אודות שליחת משוב (בדוא\"ל) diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index d9c8cf019..5b5bc8eaa 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -74,7 +74,7 @@ पसंद खाता खोलें परिचय - मुक्त स्रोत सॉफ्टवेयर जो <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">अपाचे लाइसेन्स</a> के अंतर्गत जारी किया गया है। विकिमीडिया कॉमन्स और इसका लोगो विकिमीडिया संस्था का व्यापारिक चिह्न है और इसके मर्जी से ही उपयोग किया जाना चाहिए। हम किसी भी प्रकार से विकिमीडिया संस्था से जुड़े नहीं हैं। + मुक्त स्रोत सॉफ्टवेयर जो <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">अपाचे लाइसेन्स</a> के अंतर्गत जारी किया गया है। विकिमीडिया कॉमन्स और इसका लोगो विकिमीडिया संस्था का व्यापारिक चिह्न है और इसके मर्जी से ही उपयोग किया जाना चाहिए। हम किसी भी प्रकार से विकिमीडिया संस्था से जुड़े नहीं हैं। <a href=\"https://github.com/commons-app/apps-android-commons\">स्रोत</a> और <a href=\"https://commons-app.github.io/\">वेबसाइट</a> गिटहब में है और त्रुटि व सुझाव हेतु <a href=\"https://github.com/commons-app/apps-android-commons/issues\">गिटहब समस्या</a> देखें। <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">गोपनियता नीति</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">श्रेय</a> diff --git a/app/src/main/res/values-hrx/strings.xml b/app/src/main/res/values-hrx/strings.xml index 62ee8c77c..f2d3e2292 100644 --- a/app/src/main/res/values-hrx/strings.xml +++ b/app/src/main/res/values-hrx/strings.xml @@ -52,8 +52,8 @@ Tippe uff die Nachricht orrer drücke \"Zurück\", um den Schritt zu üwerspring Nutzungsberichte an Wikimedia schicke, um der App sein Verbessrung beizutroohn. Instellunge Üwer - Open-Source-Software veröffentlicht unner der <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> - Quellcode uff <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Fehler unner <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. + Open-Source-Software veröffentlicht unner der <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> + Quellcode uff <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Fehler unner <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. <a href=\"//de.wikipedia.org/wiki/Wikipedia:Datenschutz\">Dateschutzrichtlinie</a> Üwer Rückmeldung doorrich E-Mail schicke diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index 29d76743a..662d10086 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -48,8 +48,8 @@ Pósćel nam wužiwanske rozprawy, zo by nam pomhał, nałoženje polěpšić Nastajenja Wo - Software zjawneho žórła wozjewjena pod licencu <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> - Žórłowy kod na <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Zdźělenja wo programowych zmylkach na <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. + Software zjawneho žórła wozjewjena pod licencu <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> + Žórłowy kod na <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Zdźělenja wo programowych zmylkach na <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. <a href=\"//de.wikipedia.org/wiki/Wikipedia:Datenschutz\">Prawidła priwatnosće</a> Wo Komentar pósłać (přez e-mejl) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index c6dba39a6..a990d235c 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -69,8 +69,8 @@ Tekan pesan ini (atau tekan kembali) untuk melewatkan langkah ini. Kirimkan laporan penggunaan ke Wikimedia untuk membantu kami memperbaiki aplikasi Pengaturan Tentang - Perangkat lunak terbuka dirilis di bawah <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">lisensi Apache v2</a> - Bersumber di <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Bug di <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Perangkat lunak terbuka dirilis di bawah <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">lisensi Apache v2</a> + Bersumber di <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Bug di <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/id\">Kebijakan privasi</a> Tentang Kirim umpan balik (via Surel) diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f4e49da86..dd8067c9c 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -73,8 +73,8 @@ Tekan pesan ini (atau tekan kembali) untuk melewatkan langkah ini. Pengaturan Mendaftar Tentang - Perangkat lunak sumber terbuka dirilis di bawah <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">lisensi Apache v2</a>. Wikimedia Commons dan logonya merupakan merek dagang dari Wikimedia Foundation dan digunakan dengan izin dari Wikimedia Foundation. Kami tidak disetujui oleh atau berafiliasi dengan Wikimedia Foundation. - Bersumber di <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Bug di <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. + Perangkat lunak sumber terbuka dirilis di bawah <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">lisensi Apache v2</a>. Wikimedia Commons dan logonya merupakan merek dagang dari Wikimedia Foundation dan digunakan dengan izin dari Wikimedia Foundation. Kami tidak disetujui oleh atau berafiliasi dengan Wikimedia Foundation. + Bersumber di <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Bug di <a href=\"https://bugzilla.wikimedia.org/enter_bug.cgi?product=Commons%20App\">Bugzilla</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/id\">Kebijakan privasi</a> Tentang Kirim umpan balik (via Surel) diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 1a1b774ff..4b0bdc069 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -51,8 +51,8 @@ ផ្ញើរបាយការណ៍ស្ដីពីបម្រើបម្រាស់ទៅ Wikimedia ដើម្បីជួយកែលម្អកម្មវិធីយើងខ្ញុំ ការកំណត់ អំពី - សូហ្វវែរប្រភពបើកទូលាយត្រូវបានចេញផ្សាយក្រោមអាជ្ញាបណ្ណ <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> - ប្រភពកូដមាននៅ <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Bugs មាននៅ <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + សូហ្វវែរប្រភពបើកទូលាយត្រូវបានចេញផ្សាយក្រោមអាជ្ញាបណ្ណ <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> + ប្រភពកូដមាននៅ <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Bugs មាននៅ <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">គោលការភាពជាឯកជន</a> អំពី ផ្ញើមតិកែលម្អ (តាមអ៊ីមែល) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d8d0164ec..a749972e3 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -74,8 +74,8 @@ 설정 가입하기 정보 - 오픈 소스 소프트웨어는 <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">아파치 라이선스 v2</a>에 따라 공개됩니다 - 소스 코드는 <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>에 있으며, 버그는<a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">버그질라</a>에 보고하세요. + 오픈 소스 소프트웨어는 <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">아파치 라이선스 v2</a>에 따라 공개됩니다 + 소스 코드는 <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>에 있으며, 버그는<a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">버그질라</a>에 보고하세요. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/ko\">개인정보 정책</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">제작진</a> 정보 diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index 2b1f9d845..58a023002 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -69,8 +69,8 @@ Тиркемени жакшыртуу үчүн Уикимедианы колдонууда отчет жөнөтүү Ырастоолор Тиркеме жөнүндө - баштапкы коду ачык тиркемелер, <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> лицензиясынын негизинде чыгарылган - <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a> шилтемесине баштапкы код. <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a> шилтемесиндеги катачылык. + баштапкы коду ачык тиркемелер, <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> лицензиясынын негизинде чыгарылган + <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a> шилтемесине баштапкы код. <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a> шилтемесиндеги катачылык. <a href=\"https://wikimediafoundation.org/wiki/Конфиденциалдуулук_саясаты\">Конфиденциалдуулук саясаты</a> Тиркеме жөнүндө Шарттуу жооп жөнөтүү (Email) diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 1e0dcaebe..b8bca78f2 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -40,7 +40,7 @@ Iestatījumi Reģistrēties Par - Izejas kods pieejams <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Kļūdas ziņot <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Izejas kods pieejams <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Kļūdas ziņot <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Privātuma politika</a> Par Nosūtīt atsauksmes (pa e-pastu) diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 25a5d9e16..6237d2c0a 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -69,8 +69,8 @@ ഈ ആപ് മെച്ചപ്പെടുത്തുന്നതിനായി ഉപയോഗം സംബന്ധിച്ച റിപ്പോർട്ടുകൾ വിക്കിമീഡിയയ്ക്ക് അയയ്ക്കുക സജ്ജീകരണങ്ങൾ വിവരണം - <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">അപാച്ചേ അനുമതിപത്രം പതിപ്പ് 2</a> പ്രകാരം പുറത്തിറക്കപ്പെട്ട ഓപ്പൺ സോഴ്സ് സോഫ്റ്റ്‌വേർ - സ്രോതസ്സ് രൂപം <a href=\"https://github.com/wikimedia/apps-android-commons\">ജിറ്റ്ഹബിൽ</a> ലഭ്യമാണ്. + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">അപാച്ചേ അനുമതിപത്രം പതിപ്പ് 2</a> പ്രകാരം പുറത്തിറക്കപ്പെട്ട ഓപ്പൺ സോഴ്സ് സോഫ്റ്റ്‌വേർ + സ്രോതസ്സ് രൂപം <a href=\"https://github.com/commons-app/apps-android-commons\">ജിറ്റ്ഹബിൽ</a> ലഭ്യമാണ്. പ്രശ്നങ്ങൾ <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">ബഗ്സില്ലയിൽ</a> അറിയിക്കുക. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">സ്വകാര്യതാനയം</a> വിവരണം diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index be2d9869a..ba4b6f8bc 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -60,8 +60,8 @@ Ketik mesej ini (atau tekan butang undur) untuk melangkau langkah ini. Hantar laporan penggunaan kepada Wikimedia untuk membantu kami menambah baik app ini Tetapan Perihal - Perisian Sumber Terbuka yang dikeluarkan dengan <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Lesen Apache v2</a> - Sumber di <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Pepijat di <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Perisian Sumber Terbuka yang dikeluarkan dengan <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Lesen Apache v2</a> + Sumber di <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Pepijat di <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. Wikimedia:Commons-android-strings-about privacy policy/ms Perihal Hantar Maklum Balas (secara e-mel) diff --git a/app/src/main/res/values-mt/strings.xml b/app/src/main/res/values-mt/strings.xml index 4d20900e2..a0ddaf613 100644 --- a/app/src/main/res/values-mt/strings.xml +++ b/app/src/main/res/values-mt/strings.xml @@ -47,8 +47,8 @@ Agħfas fuq dan il-messaġġ (jew mur lura) sabiex taqbeż dan il-pass. Ibgħat ir-rapporti tal-użu lill-Wikimedia sabiex tgħinna ntejbdu l-app Issettjar Dwar - Softwer ta\' sors miftuħ rilaxxat taħt il-<a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Liċenzja Apache v2</a> - Sors fuq <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Żbalji fuq <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Softwer ta\' sors miftuħ rilaxxat taħt il-<a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Liċenzja Apache v2</a> + Sors fuq <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Żbalji fuq <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Politika tal-privatezza</a> Dwar Kategoriji wżati riċentament diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 9b22333eb..7290f5016 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -52,8 +52,8 @@ हामीलाई अनुप्रयोग सुधार गर्न सहयोग गर्न विकिमीडियामा प्रयोग रिपोर्ट पठाउनुहोस् सेटिङ्गहरू बारेमा - <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">अपाचे लाइसेन्स संस्करण२</a> को अाधारमा खुला स्रोत सफ्टवेयर जारी - <a href=\"https://github.com/wikimedia/apps-android-commons\">गिटहब</a> मा स्रोत। <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">बगजिल्ला</a> मा बग छ। + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">अपाचे लाइसेन्स संस्करण२</a> को अाधारमा खुला स्रोत सफ्टवेयर जारी + <a href=\"https://github.com/commons-app/apps-android-commons\">गिटहब</a> मा स्रोत। <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">बगजिल्ला</a> मा बग छ। <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">गोपनीयता नीति</a> बारेमा सुझाव पठाउने (इमेल मार्फत) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 8951c80f7..195f89f4f 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -75,7 +75,7 @@ Klik op dit bericht, of ga terug, om deze stap over te slaan. Instellingen Registreren Over - Open sourcesoftware vrijgegeven onder de <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons en haar logo zijn handelsmerken van de Wikimedia Foundation en worden gebruikt met toestemming van de Wikimedia Foundation. We worden niet bekrachtigd door en zijn niet verbonden met de Wikimedia Foundation. + Open sourcesoftware vrijgegeven onder de <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons en haar logo zijn handelsmerken van de Wikimedia Foundation en worden gebruikt met toestemming van de Wikimedia Foundation. We worden niet bekrachtigd door en zijn niet verbonden met de Wikimedia Foundation. <a href=\"https://github.com/commons-app/apps-android-commons\">Broncode</a> en <a href=\"https://commons-app.github.io/\">website</a> op GitHub. Maak een nieuwe <a href=\"https://github.com/commons-app/apps-android-commons/issues\">melding op GitHub</a> voor bugs en suggesties. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Privacybeleid</a> Over diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 9a80e12b3..80892d37b 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -50,8 +50,8 @@ ଉଇକିମିଡ଼ିଆକୁ ବ୍ୟବହାର ବିବରଣୀ ପଠାଇ ଆମକୁ ଏହି ଆପ୍ଲିକେସନଟିକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ ସଂରଚନା ବାବଦରେ - ଓପନ ସୋର୍ସ ସଫ୍ଟୱାର <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a>ରେ ବିତରିତ - ମୂଳସବୁ <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>ରେ ରହିଛି । ଅସୁବିଧାସବୁ <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>ରେ ଜଣାଇବେ । + ଓପନ ସୋର୍ସ ସଫ୍ଟୱାର <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>ରେ ବିତରିତ + ମୂଳସବୁ <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>ରେ ରହିଛି । ଅସୁବିଧାସବୁ <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>ରେ ଜଣାଇବେ । <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">ଗୋପନୀୟତା ନୀତି</a> ବାବଦରେ ଇମେଲରେ ମତାମତ ପଠାଇବେ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 04308ad18..209435c84 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -69,8 +69,8 @@ ਇਸ ਐਪ ਨੂੰ ਸੁਧਾਰਣ ਵਿਚ ਮਦਦ ਕਰਨ ਲਈ ਵਿਕੀਮੀਡੀਆ ਨੂੰ ਵਰਤੋਂ ਰਪਟਾਂ ਭੇਜੋ ਸੈਟਿੰਗ ਇਸ ਬਾਰੇ - ਅਜ਼ਾਦ ਸਰੋਤ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> ਅਧੀਨ ਜਾਰੀ ਕੀਤਾ ਗਿਆ ਹੈ - ਸਰੋਤ <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a> ਉੱਤੇ। ਮੁਸ਼ਕਲਾਂ <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a> ਉੱਤੇ। + ਅਜ਼ਾਦ ਸਰੋਤ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> ਅਧੀਨ ਜਾਰੀ ਕੀਤਾ ਗਿਆ ਹੈ + ਸਰੋਤ <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a> ਉੱਤੇ। ਮੁਸ਼ਕਲਾਂ <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a> ਉੱਤੇ। <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Privacy policy</a> ਇਸ ਬਾਰੇ ਵਿਚਾਰ ਭੇਜੋ (ਈਮੇਲ ਰਾਹੀਂ) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 9e19793d6..e2afd6e85 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -71,8 +71,8 @@ Carregue nesta mensagem (ou carregue para voltar) para saltar este passoEnviar relatório de uso para a Wikimedia para ajudar-nos a melhorar a aplicação Configurações Sobre - Software em código aberto distribuído sob <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. O Wikimedia Commons e o seu logótipo são marcas registadas da Wikimedia Foundation e são usadas com permissão da Wikimedia Foundation. Não somos endossados ou afiliados à Wikimedia Foundation. - Código no <a href=\"https://github.com/wikimedia/android-commons\">GitHub</a>. Erros no <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Software em código aberto distribuído sob <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. O Wikimedia Commons e o seu logótipo são marcas registadas da Wikimedia Foundation e são usadas com permissão da Wikimedia Foundation. Não somos endossados ou afiliados à Wikimedia Foundation. + Código no <a href=\"https://github.com/commons-app/android-commons\">GitHub</a>. Erros no <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Política de privacidade</a> Sobre Enviar comentários (por e-mail) diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index ee6c11428..a81d09e48 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -75,8 +75,8 @@ Atingeți acest mesaj (sau mergeți înapoi) pentru a omite acest pas. Setări Înregistrare Despre - Software cu sursă deschisă lansat sub <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Licența Apache v2</a> - Sursa la <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Buguri la <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Software cu sursă deschisă lansat sub <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Licența Apache v2</a> + Sursa la <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Buguri la <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Politica de confidențialitate</a> Despre Trimitere reacții (prin e-mail) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c504cdc0f..b32243ebf 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -78,7 +78,7 @@ Зарегистрироваться О приложении Приложение с открытым исходным кодом, выпущено по лицензии <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Викисклад и его логотип являются товарными знаками Фонда Викимедиа и используются с разрешения Фонда Викимедиа. Мы не поддерживаемся и не связаны с Фондом Викимедиа. - <a href=\"https://github.com/wikimedia/apps-android-commons\">Исходный код</a> и <a href=\"https://commons-app.github.io/\">сайт</a> на GitHub. Создайте новый <a href=\"https://github.com/commons-app/apps-android-commons/issues\">запрос на GitHub</a>, чтоб сообщить об ошибке или внести предложение. + <a href=\"https://github.com/commons-app/apps-android-commons\">Исходный код</a> и <a href=\"https://commons-app.github.io/\">сайт</a> на GitHub. Создайте новый <a href=\"https://github.com/commons-app/apps-android-commons/issues\">запрос на GitHub</a>, чтоб сообщить об ошибке или внести предложение. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy/ru\">Политика конфиденциальности</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Благодарности</a> О приложении diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 3b68e5cff..f424477e3 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -60,8 +60,8 @@ Kliknite na tento odkaz (alebo na späť) ak chcete tento krok vynechať.Nastavenia Zaregistrovať sa O aplikácii - Open Source softvér dostupný za podmienok <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> - Zdroj na <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a>. Bugy na <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. + Open Source softvér dostupný za podmienok <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> + Zdroj na <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>. Bugy na <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>. <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Ochrana osobných údajov</a> O aplikácii Odoslať spätnú väzbu (emailom) diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 21828d652..6ce6e7b3e 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -52,7 +52,7 @@ వాడుక నివేదికలను వికీమీడియాకు పంపండి. యాప్‍ను మెరుగుపరచడంలో సాయపడండి. అమరికలు గురించి - ఓపెన్ సోర్సు సాఫ్టువేరు <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache License v2</a> కు లోబడి విడుదలైంది + ఓపెన్ సోర్సు సాఫ్టువేరు <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> కు లోబడి విడుదలైంది <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">గోప్యతా విధానం</a> గురించి ఫీడుబ్యాకును పంపండి (ఈమెయిలు ద్వారా) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c5bfdb52d..0ac3e0e6b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -69,8 +69,8 @@ Bu adımı atlamak için bu iletiye dokunun ya da geri tıklayın. Uygulamayı geliştirmemize yardımcı olmak için kullanım raporlarını Wikimedia\'ya gönder Ayarlar Hakkında - <a href=\"https://github.com/wikimedia/apps-android-commons/blob/master/COPYING\">Apache Lisansı s2</a> altında yayımlanan Açık Kaynak yazılımı - Kaynak: <a href=\"https://github.com/wikimedia/apps-android-commons\">GitHub</a> + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache Lisansı s2</a> altında yayımlanan Açık Kaynak yazılımı + Kaynak: <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a> Yazılım hataları: <a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a> <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Gizlilik Politikası</a> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1e8a4c858..a28be8953 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -69,8 +69,8 @@ 向维基媒体发送使用报告,帮助我们改进应用 设置 关于 - 开放源码软件在<a href=\"https://github.com/wikimedia/android-commons/blob/master/COPYING\">Apache License v2</a>下释放 - 源代码位于<a href=\"https://github.com/wikimedia/android-commons\">GitHub</a>。在<a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>报告错误。 + 开放源码软件在<a href=\"https://github.com/commons-app/android-commons/blob/master/COPYING\">Apache License v2</a>下释放 + 源代码位于<a href=\"https://github.com/commons-app/android-commons\">GitHub</a>。在<a href=\"https://github.com/nicolas-raoul/apps-android-commons/issues\">Github</a>报告错误。 <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">隐私政策</a> 关于 反馈(通过电子邮件) 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 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60fbe173d..5930cbc36 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -183,5 +183,16 @@ 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 + Close + Home + Upload + Nearby + About + Settings + Feedback + Logout diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 39fa1e4c4..a49b7b163 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,6 @@ - -