diff --git a/app/build.gradle b/app/build.gradle index 5bafd3f15..535f58143 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,7 @@ dependencies { implementation 'com.github.nicolas-raoul:Quadtree:ac16ea8035bf07' implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' implementation 'in.yuvi:http.fluent:1.3' + implementation 'com.github.chrisbanes:PhotoView:2.0.0' implementation 'com.android.volley:volley:1.0.0' implementation 'ch.acra:acra:4.9.2' implementation 'org.mediawiki:api:1.3' @@ -34,7 +35,7 @@ dependencies { implementation "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION" kapt "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION" - implementation 'com.squareup.okhttp3:okhttp:3.8.1' + implementation 'com.squareup.okhttp3:okhttp:3.9.1' implementation 'com.squareup.okio:okio:1.13.0' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java b/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java index 705de23da..bca548632 100644 --- a/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons; +import android.net.Uri; import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.view.LayoutInflater; @@ -9,6 +10,7 @@ import android.widget.TextView; import butterknife.ButterKnife; import butterknife.OnClick; +import butterknife.Optional; public class WelcomePagerAdapter extends PagerAdapter { static final int[] PAGE_LAYOUTS = new int[]{ @@ -20,6 +22,7 @@ public class WelcomePagerAdapter extends PagerAdapter { }; private static final int PAGE_FINAL = 4; private Callback callback; + private ViewGroup container; /** * Changes callback to provided one @@ -53,6 +56,7 @@ public class WelcomePagerAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, int position) { + this.container=container; LayoutInflater inflater = LayoutInflater.from(container.getContext()); ViewGroup layout = (ViewGroup) inflater.inflate(PAGE_LAYOUTS[position], container, false); if( BuildConfig.FLAVOR == "beta"){ @@ -102,5 +106,15 @@ public class WelcomePagerAdapter extends PagerAdapter { } } + @Optional + @OnClick(R.id.welcomeInfo) + void onHelpClicked () { + try { + Utils.handleWebUrl(container.getContext(),Uri.parse("https://commons.wikimedia.org/wiki/Help:Contents" )); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } 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 ef46869c4..7b2b0a97f 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 @@ -29,6 +29,7 @@ import android.widget.EditText; import android.widget.TextView; import java.io.IOException; +import java.util.Locale; import javax.inject.Inject; import javax.inject.Named; @@ -83,6 +84,10 @@ public class LoginActivity extends AccountAuthenticatorActivity { private LoginTextWatcher textWatcher = new LoginTextWatcher(); private Boolean loginCurrentlyInProgress = false; + private Boolean errorMessageShown = false; + private String resultantError; + private static final String RESULTANT_ERROR = "resultantError"; + private static final String ERROR_MESSAGE_SHOWN = "errorMessageShown"; private static final String LOGING_IN = "logingIn"; @Override @@ -123,7 +128,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { forgotPasswordText.setOnClickListener(view -> forgotPassword()); - if(BuildConfig.FLAVOR == "beta"){ + if(BuildConfig.FLAVOR.equals("beta")){ loginCredentials.setText(getString(R.string.login_credential)); } else { loginCredentials.setVisibility(View.GONE); @@ -140,8 +145,12 @@ public class LoginActivity extends AccountAuthenticatorActivity { } public void hideKeyboard(View view) { - InputMethodManager inputMethodManager =(InputMethodManager)this.getSystemService(Activity.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + if (view != null) { + InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } } @@ -216,6 +225,8 @@ public class LoginActivity extends AccountAuthenticatorActivity { handlePassResult(username, password); } else { loginCurrentlyInProgress = false; + errorMessageShown = true; + resultantError = result; handleOtherResults(result); } } @@ -267,18 +278,18 @@ public class LoginActivity extends AccountAuthenticatorActivity { if (result.equals("NetworkFailure")) { // Matches NetworkFailure which is created by the doInBackground method showMessageAndCancelDialog(R.string.login_failed_network); - } else if (result.toLowerCase().contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) { + } else if (result.toLowerCase(Locale.getDefault()).contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) { // Matches nosuchuser, nosuchusershort, noname showMessageAndCancelDialog(R.string.login_failed_username); emptySensitiveEditFields(); - } else if (result.toLowerCase().contains("wrongpassword".toLowerCase())) { + } else if (result.toLowerCase(Locale.getDefault()).contains("wrongpassword".toLowerCase())) { // Matches wrongpassword, wrongpasswordempty showMessageAndCancelDialog(R.string.login_failed_password); emptySensitiveEditFields(); - } else if (result.toLowerCase().contains("throttle".toLowerCase())) { + } else if (result.toLowerCase(Locale.getDefault()).contains("throttle".toLowerCase())) { // Matches unknown throttle error codes showMessageAndCancelDialog(R.string.login_failed_throttled); - } else if (result.toLowerCase().contains("userblocked".toLowerCase())) { + } else if (result.toLowerCase(Locale.getDefault()).contains("userblocked".toLowerCase())) { // Matches login-userblocked showMessageAndCancelDialog(R.string.login_failed_blocked); } else if (result.equals("2FA")) { @@ -342,15 +353,22 @@ public class LoginActivity extends AccountAuthenticatorActivity { protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(LOGING_IN, loginCurrentlyInProgress); + outState.putBoolean(ERROR_MESSAGE_SHOWN, errorMessageShown); + outState.putString(RESULTANT_ERROR, resultantError); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); loginCurrentlyInProgress = savedInstanceState.getBoolean(LOGING_IN, false); + errorMessageShown = savedInstanceState.getBoolean(ERROR_MESSAGE_SHOWN, false); if(loginCurrentlyInProgress){ performLogin(); } + if(errorMessageShown){ + resultantError = savedInstanceState.getString(RESULTANT_ERROR); + handleOtherResults(resultantError); + } } public void askUserForTwoFactorAuth() { @@ -362,7 +380,9 @@ public class LoginActivity extends AccountAuthenticatorActivity { public void showMessageAndCancelDialog(@StringRes int resId) { showMessage(resId, R.color.secondaryDarkColor); - progressDialog.cancel(); + if(progressDialog != null){ + progressDialog.cancel(); + } } public void showSuccessAndDismissDialog() { diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index a41a52139..101d4b21e 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -10,7 +10,6 @@ import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -43,7 +42,6 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.upload.MwVolleyApi; -import fr.free.nrw.commons.upload.SingleUploadFragment; import fr.free.nrw.commons.utils.StringSortingUtils; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -131,8 +129,13 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment { } public void hideKeyboard(View view) { - InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + + if (view != null) { + InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } } @Override diff --git a/app/src/main/java/fr/free/nrw/commons/delete/DeleteTask.java b/app/src/main/java/fr/free/nrw/commons/delete/DeleteTask.java index 0cce496f0..37b9a7a82 100644 --- a/app/src/main/java/fr/free/nrw/commons/delete/DeleteTask.java +++ b/app/src/main/java/fr/free/nrw/commons/delete/DeleteTask.java @@ -83,7 +83,7 @@ public class DeleteTask extends AsyncTask { String logPageString = "\n{{Commons:Deletion requests/" + media.getFilename() + "}}\n"; - SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd", Locale.getDefault()); String date = sdf.format(calendar.getTime()); String userPageString = "\n{{subst:idw|" + media.getFilename() + diff --git a/app/src/main/java/fr/free/nrw/commons/featured/FeaturedImagesListFragment.java b/app/src/main/java/fr/free/nrw/commons/featured/FeaturedImagesListFragment.java index 3e5c37bd6..19e33b0ee 100644 --- a/app/src/main/java/fr/free/nrw/commons/featured/FeaturedImagesListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/featured/FeaturedImagesListFragment.java @@ -16,11 +16,6 @@ import dagger.android.support.DaggerFragment; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; - -/** - * Created by root on 09.01.2018. - */ - public class FeaturedImagesListFragment extends DaggerFragment { private GridView gridView; private MockGridViewAdapter gridAdapter; 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 5acfb218e..037f92e56 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 @@ -458,7 +458,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { if (date == null || date.toString() == null || date.toString().isEmpty()) { return "Uploaded date not available"; } - SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy"); + SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault()); return formatter.format(date); } 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 d1c6ae717..2a423de93 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 @@ -369,7 +369,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp Gson gson = new GsonBuilder() .registerTypeAdapter(Uri.class, new UriSerializer()) .create(); - String gsonCurLatLng = gson.toJson(curLatLang); + String gsonCurLatLng = gson.toJson(curLatLng); bundle.clear(); bundle.putString("CurLatLng", gsonCurLatLng); 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 037f0d792..6dd6056f7 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 @@ -102,6 +102,11 @@ public class SettingsFragment extends PreferenceFragment { return true; }); + Preference betaTesterPreference = findPreference("becomeBetaTester"); + betaTesterPreference.setOnPreferenceClickListener(preference -> { + Utils.handleWebUrl(getActivity(),Uri.parse(getResources().getString(R.string.beta_opt_in_link))); + return true; + }); Preference sendLogsPreference = findPreference("sendLogFile"); sendLogsPreference.setOnPreferenceClickListener(preference -> { //first we need to check if we have the necessary permissions @@ -128,8 +133,8 @@ public class SettingsFragment extends PreferenceFragment { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + { sendAppLogsViaEmail(); } } 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 13056ad4b..612b86458 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 @@ -59,7 +59,7 @@ public class FileUtils { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( - Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); + Uri.parse("content://downloads/document"), Long.valueOf(id)); returnPath = getDataColumn(context, contentUri, null, null); } else if (isMediaDocument(uri)) { // MediaProvider 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 5525f1ba7..9c31e2b4d 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 @@ -166,7 +166,8 @@ public class MultipleShareActivity extends AuthenticatedActivity View target = getCurrentFocus(); if (target != null) { InputMethodManager imm = (InputMethodManager) target.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(target.getWindowToken(), 0); + if (imm != null) + imm.hideSoftInputFromWindow(target.getWindowToken(), 0); } getSupportFragmentManager().beginTransaction() .add(R.id.uploadsFragmentContainer, categorizationFragment, "categorization") @@ -221,8 +222,8 @@ public class MultipleShareActivity extends AuthenticatedActivity //TODO: 15/10/17 should location permission be explicitly requested if not provided? //check if location permission is enabled - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + { locationPermitted = true; } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java index 5b39b92f7..c7f3c39c0 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java @@ -11,7 +11,6 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.DisplayMetrics; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -89,9 +88,9 @@ public class MultipleUploadListFragment extends Fragment { if (view == null) { view = LayoutInflater.from(getContext()).inflate(R.layout.layout_upload_item, viewGroup, false); holder = new UploadHolderView(); - holder.image = (SimpleDraweeView) view.findViewById(R.id.uploadImage); - holder.title = (TextView) view.findViewById(R.id.uploadTitle); - holder.overlay = (RelativeLayout) view.findViewById(R.id.uploadOverlay); + holder.image = view.findViewById(R.id.uploadImage); + holder.title = view.findViewById(R.id.uploadTitle); + holder.overlay = view.findViewById(R.id.uploadOverlay); holder.image.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, photoSize.y)); holder.image.setHierarchy(GenericDraweeHierarchyBuilder @@ -129,11 +128,8 @@ public class MultipleUploadListFragment extends Fragment { super.onStop(); // FIXME: Stops the keyboard from being shown 'stale' while moving out of this fragment into the next - View target = getView().findFocus(); - if (target != null) { - InputMethodManager imm = (InputMethodManager) target.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(target.getWindowToken(), 0); - } + View target = getActivity().getCurrentFocus(); + hideKeyboard(target); } // FIXME: Wrong result type @@ -169,8 +165,8 @@ public class MultipleUploadListFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_multiple_uploads_list, container, false); - photosGrid = (GridView) view.findViewById(R.id.multipleShareBackground); - baseTitle = (EditText) view.findViewById(R.id.multipleBaseTitle); + photosGrid = view.findViewById(R.id.multipleShareBackground); + baseTitle = view.findViewById(R.id.multipleBaseTitle); photosAdapter = new PhotoDisplayAdapter(); photosGrid.setAdapter(photosAdapter); @@ -190,8 +186,12 @@ public class MultipleUploadListFragment extends Fragment { } public void hideKeyboard(View view) { - InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + if (view != null) { + InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } } @Override 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 aca17601c..aea703f5e 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 @@ -2,33 +2,50 @@ package fr.free.nrw.commons.upload; import android.Manifest; import android.app.Activity; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapRegionDecoder; +import android.graphics.Point; +import android.graphics.Rect; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.ParcelFileDescriptor; +import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; +import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.BitmapCompat; import android.support.v7.app.AlertDialog; +import android.util.Log; import android.view.MenuItem; import android.view.View; +import android.view.WindowManager; +import android.view.animation.DecelerateInterpolator; +import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.Toast; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.view.SimpleDraweeView; +import com.github.chrisbanes.photoview.PhotoView; + import java.io.File; import java.io.FileNotFoundException; @@ -63,8 +80,11 @@ import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; + + import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED; import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE; +import static java.lang.Long.min; /** * Activity for the title/desc screen after image is selected. Also starts processing image @@ -120,6 +140,12 @@ public class ShareActivity private boolean haveCheckedForOtherImages = false; private boolean isNearbyUpload = false; + private Animator CurrentAnimator; + private long ShortAnimationDuration; + private FloatingActionButton zoomInButton; + private FloatingActionButton zoomOutButton; + + /** * Called when user taps the submit button. */ @@ -257,6 +283,18 @@ public class ShareActivity if (mediaUri != null) { backgroundImageView.setImageURI(mediaUri); } + zoomInButton = (FloatingActionButton) findViewById(R.id.media_upload_zoom_in); + try { + zoomInButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + zoomImageFromThumb(backgroundImageView, mediaUri); + } + }); + } catch (Exception e){ + Log.i("exception", e.toString()); + } + zoomOutButton = (FloatingActionButton) findViewById(R.id.media_upload_zoom_out); if (savedInstanceState != null) { contribution = savedInstanceState.getParcelable("contribution"); @@ -690,4 +728,189 @@ public class ShareActivity } } } + + private void zoomImageFromThumb(final View thumbView, Uri imageuri ) { + // If there's an animation in progress, cancel it + // immediately and proceed with this one. + if (CurrentAnimator != null) { + CurrentAnimator.cancel(); + } + hideKeyboard(ShareActivity.this); + InputStream input = null; + Bitmap scaled = null; + try { + input = this.getContentResolver().openInputStream(imageuri); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + BitmapRegionDecoder decoder = null; + try { + decoder = BitmapRegionDecoder.newInstance(input, false); + } catch (IOException e) { + e.printStackTrace(); + } + Bitmap bitmap = decoder.decodeRegion(new Rect(10, 10, 50, 50), null); + try { + //Compress the Image + System.gc(); + Runtime rt = Runtime.getRuntime(); + long maxMemory = rt.freeMemory(); + bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageuri); + int bitmapByteCount= BitmapCompat.getAllocationByteCount(bitmap); + long height = bitmap.getHeight(); + long width = bitmap.getWidth(); + long calHeight = (long) ((height * maxMemory)/(bitmapByteCount * 1.1)); + long calWidth = (long) ((width * maxMemory)/(bitmapByteCount * 1.1)); + scaled = Bitmap.createScaledBitmap(bitmap,(int) Math.min(width,calWidth), (int) Math.min(height,calHeight), true); + } catch (IOException e) { + } catch (NullPointerException e){ + scaled = bitmap; + } + // Load the high-resolution "zoomed-in" image. + PhotoView expandedImageView = (PhotoView) findViewById( + R.id.expanded_image); + expandedImageView.setImageBitmap(scaled); + + + + // Calculate the starting and ending bounds for the zoomed-in image. + // This step involves lots of math. Yay, math. + final Rect startBounds = new Rect(); + final Rect finalBounds = new Rect(); + final Point globalOffset = new Point(); + + // The start bounds are the global visible rectangle of the thumbnail, + // and the final bounds are the global visible rectangle of the container + // view. Also set the container view's offset as the origin for the + // bounds, since that's the origin for the positioning animation + // properties (X, Y). + thumbView.getGlobalVisibleRect(startBounds); + findViewById(R.id.container) + .getGlobalVisibleRect(finalBounds, globalOffset); + startBounds.offset(-globalOffset.x, -globalOffset.y); + finalBounds.offset(-globalOffset.x, -globalOffset.y); + + // Adjust the start bounds to be the same aspect ratio as the final + // bounds using the "center crop" technique. This prevents undesirable + // stretching during the animation. Also calculate the start scaling + // factor (the end scaling factor is always 1.0). + float startScale; + if ((float) finalBounds.width() / finalBounds.height() + > (float) startBounds.width() / startBounds.height()) { + // Extend start bounds horizontally + startScale = (float) startBounds.height() / finalBounds.height(); + float startWidth = startScale * finalBounds.width(); + float deltaWidth = (startWidth - startBounds.width()) / 2; + startBounds.left -= deltaWidth; + startBounds.right += deltaWidth; + } else { + // Extend start bounds vertically + startScale = (float) startBounds.width() / finalBounds.width(); + float startHeight = startScale * finalBounds.height(); + float deltaHeight = (startHeight - startBounds.height()) / 2; + startBounds.top -= deltaHeight; + startBounds.bottom += deltaHeight; + } + + // Hide the thumbnail and show the zoomed-in view. When the animation + // begins, it will position the zoomed-in view in the place of the + // thumbnail. + thumbView.setAlpha(0f); + expandedImageView.setVisibility(View.VISIBLE); + zoomOutButton.setVisibility(View.VISIBLE); + zoomInButton.setVisibility(View.GONE); + + // Set the pivot point for SCALE_X and SCALE_Y transformations + // to the top-left corner of the zoomed-in view (the default + // is the center of the view). + expandedImageView.setPivotX(0f); + expandedImageView.setPivotY(0f); + + // Construct and run the parallel animation of the four translation and + // scale properties (X, Y, SCALE_X, and SCALE_Y). + AnimatorSet set = new AnimatorSet(); + set + .play(ObjectAnimator.ofFloat(expandedImageView, View.X, + startBounds.left, finalBounds.left)) + .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, + startBounds.top, finalBounds.top)) + .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, + startScale, 1f)) + .with(ObjectAnimator.ofFloat(expandedImageView, + View.SCALE_Y, startScale, 1f)); + set.setDuration(ShortAnimationDuration); + set.setInterpolator(new DecelerateInterpolator()); + set.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + CurrentAnimator = null; + } + + @Override + public void onAnimationCancel(Animator animation) { + CurrentAnimator = null; + } + }); + set.start(); + CurrentAnimator = set; + + // Upon clicking the zoomed-in image, it should zoom back down + // to the original bounds and show the thumbnail instead of + // the expanded image. + final float startScaleFinal = startScale; + zoomOutButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (CurrentAnimator != null) { + CurrentAnimator.cancel(); + } + zoomOutButton.setVisibility(View.GONE); + zoomInButton.setVisibility(View.VISIBLE); + + // Animate the four positioning/sizing properties in parallel, + // back to their original values. + AnimatorSet set = new AnimatorSet(); + set.play(ObjectAnimator + .ofFloat(expandedImageView, View.X, startBounds.left)) + .with(ObjectAnimator + .ofFloat(expandedImageView, + View.Y,startBounds.top)) + .with(ObjectAnimator + .ofFloat(expandedImageView, + View.SCALE_X, startScaleFinal)) + .with(ObjectAnimator + .ofFloat(expandedImageView, + View.SCALE_Y, startScaleFinal)); + set.setDuration(ShortAnimationDuration); + set.setInterpolator(new DecelerateInterpolator()); + set.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + thumbView.setAlpha(1f); + expandedImageView.setVisibility(View.GONE); + CurrentAnimator = null; + } + + @Override + public void onAnimationCancel(Animator animation) { + thumbView.setAlpha(1f); + expandedImageView.setVisibility(View.GONE); + CurrentAnimator = null; + } + }); + set.start(); + CurrentAnimator = set; + + } + + }); + } + public static void hideKeyboard(Activity activity) { + View view = activity.findViewById(R.id.titleEdit | R.id.descEdit); + if (view != null) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } + } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index a88d03c03..56d443d08 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -3,21 +3,20 @@ package fr.free.nrw.commons.upload; import android.annotation.SuppressLint; import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; -import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v4.view.ViewCompat; import android.support.v7.app.AlertDialog; + import android.text.Editable; import android.text.Html; import android.text.TextWatcher; import android.text.method.LinkMovementMethod; -import android.util.Log; + import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -61,6 +60,7 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { @BindView(R.id.share_license_summary) TextView licenseSummaryView; @BindView(R.id.licenseSpinner) Spinner licenseSpinner; + @Inject @Named("default_preferences") SharedPreferences prefs; @Inject @Named("direct_nearby_upload_prefs") SharedPreferences directPrefs; @@ -184,9 +184,12 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { } public void hideKeyboard(View view) { - Log.i("hide", "hideKeyboard: "); - InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + if (view != null) { + InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } } @Override @@ -224,7 +227,7 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { setLicenseSummary(license); prefs.edit() .putString(Prefs.DEFAULT_LICENSE, license) - .commit(); + .apply(); } @@ -301,11 +304,8 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { super.onStop(); // FIXME: Stops the keyboard from being shown 'stale' while moving out of this fragment into the next - View target = getView().findFocus(); - if (target != null) { - InputMethodManager imm = (InputMethodManager) target.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(target.getWindowToken(), 0); - } + View target = getActivity().getCurrentFocus(); + hideKeyboard(target); } @NonNull @@ -346,6 +346,7 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { } } + private void showInfoAlert (int titleStringID, int messageStringID){ new AlertDialog.Builder(getContext()) .setTitle(titleStringID) diff --git a/app/src/main/java/fr/free/nrw/commons/utils/StringSortingUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/StringSortingUtils.java index 03b1469e0..e409b856d 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/StringSortingUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/StringSortingUtils.java @@ -1,6 +1,7 @@ package fr.free.nrw.commons.utils; import java.util.Comparator; +import java.util.Locale; import info.debatty.java.stringsimilarity.Levenshtein; @@ -28,8 +29,8 @@ public class StringSortingUtils { } private static double calculateSimilarity(String firstString, String secondString) { - String longer = firstString.toLowerCase(); - String shorter = secondString.toLowerCase(); + String longer = firstString.toLowerCase(Locale.getDefault()); + String shorter = secondString.toLowerCase(Locale.getDefault()); if (firstString.length() < secondString.length()) { longer = secondString; diff --git a/app/src/main/res/drawable-hdpi/ic_zoom_in_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_zoom_in_white_24dp.png new file mode 100644 index 000000000..637329408 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_zoom_in_white_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 000000000..7772ceea7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_zoom_out_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_zoom_in_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_zoom_in_white_24dp.png new file mode 100644 index 000000000..36a659dd2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_zoom_in_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 000000000..e69da0ba0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_zoom_out_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_zoom_in_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_zoom_in_white_24dp.png new file mode 100644 index 000000000..ce88ebdd7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_zoom_in_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 000000000..8c6ccea7b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_zoom_out_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_zoom_in_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_zoom_in_white_24dp.png new file mode 100644 index 000000000..30b847067 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_zoom_in_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 000000000..68aaec6d8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_zoom_out_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_zoom_in_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_zoom_in_white_24dp.png new file mode 100644 index 000000000..b636f6e3c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_zoom_in_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_zoom_out_white_24dp.png new file mode 100644 index 000000000..d85e242b9 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_zoom_out_white_24dp.png differ diff --git a/app/src/main/res/drawable/ic_zoom_in_white_24dp.png b/app/src/main/res/drawable/ic_zoom_in_white_24dp.png new file mode 100644 index 000000000..637329408 Binary files /dev/null and b/app/src/main/res/drawable/ic_zoom_in_white_24dp.png differ diff --git a/app/src/main/res/drawable/ic_zoom_out_white_24dp.png b/app/src/main/res/drawable/ic_zoom_out_white_24dp.png new file mode 100644 index 000000000..7772ceea7 Binary files /dev/null and b/app/src/main/res/drawable/ic_zoom_out_white_24dp.png differ diff --git a/app/src/main/res/layout-land/welcome_final.xml b/app/src/main/res/layout-land/welcome_final.xml index 0b99b481f..d44339647 100644 --- a/app/src/main/res/layout-land/welcome_final.xml +++ b/app/src/main/res/layout-land/welcome_final.xml @@ -1,13 +1,33 @@ - + > + + + + - \ No newline at end of file + \ 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 e915517b5..ca8097495 100644 --- a/app/src/main/res/layout/activity_share.xml +++ b/app/src/main/res/layout/activity_share.xml @@ -19,7 +19,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/toolbar" - android:background="?attr/mainBackground"> + android:background="?attr/mainBackground" + android:id="@+id/container"> + + + + + + + + diff --git a/app/src/main/res/layout/layout_upload_item.xml b/app/src/main/res/layout/layout_upload_item.xml index fb552560a..155664d91 100644 --- a/app/src/main/res/layout/layout_upload_item.xml +++ b/app/src/main/res/layout/layout_upload_item.xml @@ -34,6 +34,7 @@ android:textColor="#FFFFFFFF" style="?android:textAppearanceSmall" /> + \ 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 be4e086e4..11f95bf2e 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 + + + \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index dd1d37993..e833932a8 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -71,6 +71,7 @@ Etsi luokkia Tallenna Päivitä + Lista GPS ei ole käytössä. Haluatko ottaa sen käyttöön? Ota GPS käyttöön Ei tallennuksia vielä @@ -161,8 +162,8 @@ Ei kuvausta Tuntematon lisenssi Päivitä - Vaadittu oikeus: Ulkoisen tallennustilan luku. Appi ei toimi ilman tätä oikeutta. - Vaadittava lupa: Kirjoita ulkoiseen tallennustilaan. Sovellus ei voi toimia ilman tätä. + Vaadittu oikeus: Ulkoisen tallennustilan luku. Appi ei voi päästä galleriaasi ilman tätä oikeutta. + Vaadittava lupa: Kirjoita ulkoiseen tallennustilaan. Appi ei voi päästä kameraasi ilman tätä oikeutta. Valinnainen lupa: Saada tämänhetkinen sijainti loukkasuosituksia varten. OK Lähellä olevat paikat @@ -175,6 +176,7 @@ Median otsikko Kuvaus Median kuvaus menee tänne. Tämä voi mahdollisesti olla melko pitkä, ja sen täytyy kääriä poikittain useita rivejä. Toivomme, että se näyttää silti hyvältä. + Tekijä Tallennuspäivämäärä Lisenssi Koordinaatit @@ -221,6 +223,7 @@ kuvausta ei löytynyt Commons-tiedostosivu Wikidata-kohde + Wikipedia-artikkeli Virhe varastoidessa kuvia Tiedoston yksilöllinen ja kuvaava otsikko, jota käytetään tiedostonimenä. Voit käyttää tavallista kieltä välilyönnein. Älä sisällytä tiedoston päätettä. Kuvaile mediaa niin paljon kuin mahdollista: Missä se otettiin? Mitä se esittää? Mikä on asiayhteys? Kuvaile esineitä tai henkilöitä. Tuo ilmi tietoja, joita ei ole helppo arvailla, esimerkiksi vuorokaudenaika, jos se on maisema. Jos media esittää jotain epätavallista, selitä, mikä tekee siitä epätavallisen. @@ -233,6 +236,9 @@ Lähetä lokitiedosto Lähetä lokitiedosto kehittäjille sähköpostin kautta Virhe! URL-osoitetta ei löytynyt + Ehdotettu poistettavaksi + Tätä kuvaa on ehdotettu poistettavaksi. + Näytä selaimessa Sijainti ei ole muuttunut. Sijainti ei käytettävissä. Lupa vaaditaan läheisten paikkojen luettelon näyttämiseen @@ -243,6 +249,17 @@ Kiitos muokkaamisestasi %1$s mainitsi sinut %2$s. Vaihda näkymä - Usein Kysytyt Kysymykset + WIKIDATA + WIKIPEDIA + COMMONS + <u>Arvostele meidät</u> + <u>UKK</u> Ohita opetus + Internet ei saatavissa + Internet saatavana + <u>Käännä</u> + Kielet + Jatka + Peruuta + Yritä uudelleen diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index e17c0991a..5524afb0e 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -13,6 +13,7 @@ * ViDam --> + Általános Visszajelzés Helyszín Commons @@ -54,6 +55,7 @@ Megosztás Megtekintés böngészőben Cím + Kérlek, adj címet a fájlnak Leírás Nem lehet bejelentkezni - hálózati hiba Nem lehet bejelentkezni - ellenőrizd a felhasználóneved @@ -91,11 +93,12 @@ Kategóriák Beállítások Regisztráció + Kiemelt képek Névjegy A Wikimedia Commons applikáció egy nyílt forráskódú szoftver, amit a Wikimedia-közösség önkéntesei készítettek és tartanak karban. A Wikimédia Alapítvány nem vesz részt az applikáció megalkotásában, fejlesztésében és üzemeltetésében. Nyiss egy új <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-problémát</a> hibabejelentéssel vagy fejlesztési javaslattal. - <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Adatvédelmi irányelvek</a> - <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Köszönetnyilvánítás</a> + <u>Adatvédelmi irányelvek</u> + <u>Köszönetnyilvánítás</u> Névjegy Visszajelzés küldése (e-mailben) Nincs telepített levelezőprogram @@ -136,7 +139,10 @@ A Wikimédia Commons tárolja a Wikipédián használt képek többségét. A képeid segítik az ismeretterjesztést az egész világon! Kérjük, tölts fel képeket, amelyeket teljes mértékben te fotóztál vagy készítettél: - - Természeti tárgyak (virágok, állatok, hegyek)\n- Hasznos tárgyak (kerékpárok, vasútállomások)\n- Híres emberek (a polgármestered, olimpikonok, akikkel találkoztál) + Természeti tárgyak (virágok, állatok, hegyek)\n• Hasznos tárgyak (kerékpárok, vasútállomások)\n• Híres emberek (a polgármestered, olimpikonok, akikkel találkoztál) + Természeti tárgyak (virágok, állatok, hegyek) + Hasznos tárgyak (kerékpárok, vasútállomások) + Híres emberek (a polgármestered, olimpikonok, akikkel találkoztál) Kérjük, NE tölts fel: - Szelfiket vagy képeket a barátaidról\n- Internetröl letöltött képeket\n- Kereskedelmi alkalmazások képernyőképeit Példa feltöltés: @@ -168,6 +174,7 @@ Média címe Leírás A média leírása kerül ide. Ez akár egészen hosszú is lehet, és több sorba fog kerülni. Azért reméljük, jól néz majd ki. + Szerző Feltöltési dátum Licenc Koordináták @@ -207,6 +214,7 @@ Kijelentkezés Bevezető Értesítések + Kiemelt Közeli helyek nem megjeleníthetőek a helyadatokhoz való hozzáférés engedélyezése nélkül nincs leírás Commons leírólap @@ -221,10 +229,26 @@ Bejelentkezés a fiókodba Naplófájlok küldése Naplófájlok küldése e-mailben a fejlesztőknek + Nem található böngésző az URL megnyitásához Hiba! URL nem található. Törlésre jelölés + Ezt a képet törlésre jelölték. + Megtekintés böngészőben A hely nem változott. A hely nem érhető el. + Közeli helyek listájának megtekintéséhez engedély szükséges Üdvözlünk a Wikimedia Commonson, %1$s! Örülünk, hogy itt vagy. Köszönjük a szerkesztésedet! + WIKIDATA + WIKIPÉDIA + COMMONS + <u>Értékelj minket</u> + <u>GYIK</u> + Útmutató átugrása + Internet nem elérhető + Internet elérhető + Nincs értesítés + Nyelvek + Mégse + Újra diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 3985a654b..ba5bdfe42 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -84,6 +84,7 @@ Flokkar Stillingar Nýskrá + Áberandi myndir Um Wikimedia Commons forritið er opinn og frjáls hugbúnaður sem gerður er og viðhaldið af stuðningsaðilum og sjálfboðaliðum Wikimedia samfélagsins. Wikimedia Foundation sjálfseignarstofnunin kemur ekki að gerð, forritun eða viðhaldi forritsins. \ Útbúðu nýjar <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub tilkynningar (issue)</a> til að koma villum og uppástungum á framfæri. @@ -169,6 +170,8 @@ Titill þessa gagnamiðils Lýsing Lýsing á gagnamiðlinum kemur hér. Þetta má vera nokkuð langt og mun þurfa að skríða yfir nokkrar línur. Við vonum að þetta líti samt þokkalega út. + Höfundur + Nafn höfundar myndarinnar kemur hér. Sent inn þann Notkunarleyfi Hnit @@ -211,6 +214,7 @@ Útskráning Kennsla Tilkynningar + Efst á baugi Ekki er hægt að birta nálæga staði an heimildar til að ná í hnattstaðsetningu engin lýsing fannst Síða Commons-skrár diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 27968b8d7..306a1e3a4 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -5,6 +5,7 @@ * Davio * Nemo bis * S4b1nuz E.656 +* Sarah Bernabei * Una giornata uggiosa '94 * Wim b --> @@ -87,6 +88,7 @@ Categorie Impostazioni Registrati + Immagini in evidenza Informazioni L\'app di Wikimedia Commons è un\'applicazione open source creata e mantenuta da beneficiari e volontari della comunità Wikimedia. La Fondazione Wikimedia non è coinvolta nella creazione, sviluppo o manutenzione dell\'applicazione. Crea una nuova <a href=\"https://github.com/commons-app/apps-android-commons/issues\">segnalazione GitHub</a> per riportare errori e suggerimenti. @@ -161,6 +163,7 @@ Titolo del file multimediale Descrizione Autore + Il nome dell\'autore dell\'immagine in evidenza va scritto qui. Data di caricamento Licenza Coordinate @@ -194,6 +197,7 @@ Esci Tutorial Notifiche + In evidenza nessuna descrizione trovata Pagina di Commons del file Elemento Wikidata diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 186df118a..48750daf9 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -17,6 +17,7 @@ משוב מיקום ויקישיתוף + הגדרות שם משתמש ססמה @@ -208,6 +209,7 @@ בלי תמונות סלפי תמונה קניינית ברוך בואך ויקיפדיה + הודעה לגבי זכויות יוצרים בית האופרה של סידני ביטול פתיחה @@ -226,6 +228,7 @@ לא נמצא תיאור דף קובץ בוויקישיתוף פריט ויקינתונים + ערך בוויקיפדיה שגיאה במשירת תמונות במטמון כותרת מתארת ייחודית לקובץ, שתשמש שם קובץ. אפשר להשתמש בשפה פשוטה עם רווחים. אין לכלול סיומת קובץ נא לתאר את המדיה כמה שיותר: איפה היא נוצרה? מה היא מראה? מה ההקשר? נא לתאר את העצמים או את האנשים. נא לחשוף מידע שאי־אפשר לנחש בקלות, למשל, הזמן ביום אם זאת תמונת נוף. אם המדיה מציגה משהו בלתי־רגיל, נא להסביר מה מיוחד בה. @@ -238,8 +241,10 @@ שליחת קובץ יומן שליחת קובץ יומן למפתחים בדואר אלקטרוני לא נמצא דפדפן שיוכל לפתוח את הכתובת + שגיאה! כתובת ה־URL לא נמצאה להציע מחיקה התמונה הזאת מועמדת למחיקה + הצגה בדפדפן המיקום לא השתנה. המיקום אינו זמין. diff --git a/app/src/main/res/values-ji/strings.xml b/app/src/main/res/values-ji/strings.xml index 9122cc710..6bcb88760 100644 --- a/app/src/main/res/values-ji/strings.xml +++ b/app/src/main/res/values-ji/strings.xml @@ -3,6 +3,9 @@ * פוילישער --> + אַלגעמיין + פֿידבעק + לאקאציע קאמאנס איינשטעלונגען באַניצער־נאָמען @@ -48,6 +51,7 @@ זוכן קאטעגאריעס אויפֿהיטן דערפֿרישן + ליסטע \@string/contributions_subtitle_zero איין ארויפֿלאד @@ -66,7 +70,7 @@ לעצטיק־געניצטע קאטעגאריעס אַנולירן אראָפלאָדן - ליצענץ + סטאנדארט־ליצענץ Attribution-ShareAlike 3.0 Attribution 3.0 CC0 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 16ba9fe2f..aac473c92 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -69,6 +69,7 @@ Hişyarî Erê Na + Xwedî Koordînat Betal bike Veke diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 321d2a189..5abca6562 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -89,7 +89,7 @@ D\'App Wikimedia Commons ass eng \'Open-Source-App\' déi vu Fräiwëllege vun der Wikimedia Foundation entwéckelt gouf an och vun hinnen ënnerhal gëtt. D\'Wikimedia Foundation ass net an d\'Entwécklung oder den Ënnerhalt vun der App implizéiert. Leet w.e.g. <a href=\"https://github.com/commons-app/apps-android-commons/issues\"> e GitHub Problem</a> fir Problemer ze mellen a Proposen ze maachen. <u>Dateschutzrichtlinn</u> - <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Merci</a> + <u>Merci</u> Iwwer Feedback schécken (per E-Mail) Keen E-Mail-Client installéiert diff --git a/app/src/main/res/values-li/strings.xml b/app/src/main/res/values-li/strings.xml index 59dc53188..a14add497 100644 --- a/app/src/main/res/values-li/strings.xml +++ b/app/src/main/res/values-li/strings.xml @@ -87,6 +87,27 @@ Registreer Oetgeleechde plaetjes Euver + De Wikimedia Commons-app is \'nen app op aope brónne, gemaak en óngerhaje door gerechtigde en vriewilligers vanne Wikimedia-gemeinsjap. De Wikimedia Foundation is neet betróch inne maak, óntwikkeling of \'t óngerhawd vannen app. + Maak e nuuj <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-perbleem</a> veur fouteverslaag en veurstèlle. + <u>Privaatbeleid</u> + <u>Toesjrif</u> + Euver + Sjik feedback (mitten e-mail) + Geine e-mailcliënt geïnstalleerd + Recèntelik gebroekde categorieje + Oppe ieëste synchronisatie \'nt wachte... + Doe höbs nag gein plaetjes geüpload. + Perbeer oppernuuj + Braek aaf + Dit plaetje weurt gelicenseerd ónger %1$s + Door dit plaetje toe te veuge verklaor ich det dit mien eige werk is en det \'t gein auteursrechtelik besjurmp matterjaal of selfies bevatj en angeszins instump mit \'t <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">beleid op Wikimedia Commons</a>. + Download + Standerdlicentie + Gebroek veurige naam/besjrieving + Haol autematis de hujige locatie op + Haol de hujige locatie op veur categorieveurstèlle te make wen \'t bild gein geotags haet + Nachmodus + Gebroeker duuster thema Naamsvermeljing-GeliekDeile 4.0 Naamsvermeljing 4.0 Naamsvermeljing-GeliekDeile 3.0 @@ -109,5 +130,41 @@ CC Zero Op Wikimedia Commons staon de meiste plaetjes die waere gebroek op Wikipedia. Dien plaetjes helpe luuj oppe ganse werreld mit \'t opdoon van kènnis! + Upload estebleef allein plaetjes die gans door dichzelf zint gemaak: + Netuurobjekte (blome, bieëster, berg)\n• Henjige veurwerpe (fietsje, treinstaasjes)\n• Bekandje luuj (de börgermeisters, Olumpische atlete die se kins) + Netuurobjekte (blome, bieëster, berg) + Henjige veurwerpe (fietsje, treinstaasjes) + Bekandje luuj (de börgermeisters, Olumpische atlete die se kins) + Upload estebleef NEET: + - Selfies of foto\'s van dien vrunj\n- Foto\'s die se höbs downgeload van \'t internet\n- Sjermplaetjes van eige apps + Selfies of foto\'s van dien vrunj + Foto\'s die se höbs downgeload van \'t internet + Sjermplaetjes van eige apps + Uploadveurbild: + - Titel: Operahoes in Sydney\n- Besjrieving: Operahoes in Sydney gezeen vanaaf d\'n euverkantj vanne bej\n- Categorieje: Operahoes in Sydney vanoet \'t wèste, Operahoes in Sydney van wied aaf + Titel: Operahoes in Sydney + Besjrieving: Operahoes in Sydney gezeen vanaaf d\'n euverkantj vanne bej + Categorieje: Operahoes in Sydney vanoet \'t wèste, Operahoes in Sydney van wied aaf + Draag dien plaetjes bie. Help Wikipedia-artikel toet laeve te kómme! + Plaetjes op Wikipedia kómme van Wikimedia Commons. + Dien plaetjes helpe luuj van euver de ganse werreld mit lieëre. + Verkóm auteursrechtelik besjurmp matterjaal det se op internet höbs gevónje wie plaetjes van poeasters, beuk en zo wiejer. + Versteis se \'t? + Jao! + Categorieje + \'nt laje... + Geine gekaoze + Gein besjrieving + Ónbekande licentie Vernuuj + Klaor + Plaatse in de buurt + Gein plaatse in de buurt gevónje + Waorsjoewing + Dit bestandj besteit al op Commons. Wèts se zeker det se door wils gaon? + Jao + Nae + Titel + Bestandjstitel + Besjrieving diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index d73312361..1eba570d2 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -79,6 +79,7 @@ Nosaukums Apraksts + Autors Augšupielādēšanas datums Licence Koordinātas diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d19dfc7c8..77cdb547d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -172,6 +172,7 @@ Tytuł pliku Opis Tu jest miejsce na opis pliku. Mogą być dość długie i wymagać przewijania podczas czytania. Chcemy, by wszystko wyglądało dobrze. + Autor Data przesłania Licencja Współrzędne diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index d1d1d5d87..796ae8555 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -89,6 +89,7 @@ عنوان میڈیا دا عنوان تفصیل + مصنف اپ لوڈ تھیوݨ دی تاریخ لائیسنس کوآرڈینیٹ @@ -113,6 +114,7 @@ تہاڈی رائے لاگ آؤٹ ٹیٹوریل + خاص وکی ڈیٹا آئٹم وکی پیڈیا دا مضمون اجازت ݙیوو diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 94d383ff9..95548b662 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -16,6 +16,7 @@ Geri bildirim Konum Commons + Ayarlar Kullanıcı adı Parola @@ -91,6 +92,7 @@ Kategoriler Ayarlar Kaydol + Seçkin Resimler Hakkında Wikimedia Commons uygulaması, Wikimedia topluluğunun imtiyaz sahibi ve gönüllüleri tarafından oluşturulmuş ve sürdürülmüş açık kaynak kodlu bir uygulamadır. Vikipedi Vakfı, uygulamanın oluşturulması, geliştirilmesi veya bakımına dahil değildir. GitHub üzerinde <a href=\"https://github.com/commons-app/apps-android-commons\">Kaynak</a> ve <a href=\"https://commons-app.github.io/\">website</a>. Hata raporları ve önerileri için yeni bir <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub sorunu</a> oluştur. @@ -149,6 +151,7 @@ - Başlık: Sydney Opera Binası\n- Tanım: Körfezin genelinden bakıldığında Sydney Opera Binası\n- Kategoriler: Sydney Opera Binası, batıdan Sydney Opera Binası Başlık: Sidney Opera Binası Açıklama: Sidney Opera Binası\'nın körfezin karşısından görünümü + Kategoriler: Batıdan Sidney Opera Binası, Sidney Opera Binası uzaktan manzaraları Resimleriniz ile Vikipedi maddelerinin canlandırılmasına katkıda bulunabilirsiniz! Vikipedi\'ye Wikimedia Commons\'tan gelen görüntüler. Görüntüler dünya insanlarının eğitiminde yardımcı olur. @@ -161,8 +164,8 @@ Açıklama yok Bilinmeyen lisans Yenile - Gerekli izinler: Harici depolama biriminin okunması. Uygulama buna izin verilmeden çalışmaz. - Gerekli izin: Harici depolama birimi üzerine yazma. Uygulama buna izin verilmeden çalışmaz. + Gerekli izin: Harici belleği oku. Uygulama, galerinize bu olmadan erişemez. + Gerekli izin: Harici depolama yazın. Uygulama kameranıza bu olmadan erişemez. İsteğe bağlı izin: Kategori önerileri için geçerli konum alma Tamam Yakındaki yerler @@ -175,6 +178,8 @@ Medyanın başlığı Açıklama Medya için yapılan tanımı/açıklamayı buraya yazınız. Açıklamanız uzun olabilir ve birden fazla satıra sığabilir. Umuyoruz ki güzel ve bilgilendirici olacaktır. + Yazar + Seçkin resim yazarının kullanıcı adı buraya eklenir. Yükleme tarihi Lisans Koordinatlar @@ -217,6 +222,7 @@ Çıkış Eğitim Bildirimler + Seçkin Yakındaki yerler, konum izinleri olmadan görüntülenemez hiçbir açıklama bulunamadı Commons dosya sayfası @@ -244,7 +250,25 @@ TALİMATLAR MADDE OKU Wikimedia Commons\'a hoşgedin %1$s! Burada olduğun için mutluyuz. + %1$s mesaj sayfasınıza bir mesaj bıraktı. Düzenlemeniz için teşekkürler %1$s , %2$s \'de senden bahsetti + Görünümü değiştir YOL TARİFİ + VİKİVERİ + VİKİPEDİ + COMMONS + <u>Bizi oyla</u> + <u>SSS</u> + Eğiticiyi Atla + İnternet kullanılamıyor + İnternet kullanılabilir + Bildirim alınırken hata oluştu + Bildirim bulunamadı + <u>Çevir</u> + Diller + Çevirileri göndermek istediğiniz dili seçin + İlerle + Vazgeç + Tekrar Deneyin diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 28ecaeb8f..efdeeec7e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -149,6 +149,7 @@ Avoid copyrighted materials you found from the Internet as well as images of posters, book covers, etc. You think you got it? Yes! + More Information Categories Loading… None selected diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index baf1a760e..49720b247 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -52,10 +52,10 @@ - -