mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 21:03:54 +01:00
Merge from commons-app/master
This commit is contained in:
commit
7cbc2a674c
31 changed files with 683 additions and 181 deletions
|
|
@ -19,12 +19,13 @@ android:
|
|||
components:
|
||||
- tools
|
||||
- platform-tools
|
||||
- build-tools-26.0.2
|
||||
- build-tools-27.0.0
|
||||
- extra-google-m2repository
|
||||
- extra-android-m2repository
|
||||
- ${ANDROID_TARGET}
|
||||
- android-25
|
||||
- android-26
|
||||
- android-27
|
||||
- sys-img-${ANDROID_ABI}-${ANDROID_TARGET}
|
||||
licenses:
|
||||
- 'android-sdk-license-.+'
|
||||
|
|
|
|||
|
|
@ -1,3 +1,7 @@
|
|||
## Title (required)
|
||||
|
||||
Fixes #{GitHub issue number and title (Please do not forget adding title) }
|
||||
|
||||
## Description (required)
|
||||
|
||||
Fixes #{GitHub issue number and title}
|
||||
|
|
|
|||
|
|
@ -69,6 +69,10 @@ dependencies {
|
|||
testImplementation 'com.nhaarman:mockito-kotlin:1.5.0'
|
||||
testImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1'
|
||||
|
||||
implementation 'com.caverock:androidsvg:1.2.1'
|
||||
implementation 'com.github.bumptech.glide:glide:4.7.1'
|
||||
kapt 'com.github.bumptech.glide:compiler:4.7.1'
|
||||
|
||||
androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
||||
androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1'
|
||||
androidTestImplementation "com.android.support:support-annotations:$SUPPORT_LIB_VERSION"
|
||||
|
|
@ -117,7 +121,7 @@ android {
|
|||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false // See https://stackoverflow.com/questions/40232404/google-play-apk-and-android-studio-apk-usb-debug-behaving-differently - proguard.cfg modification alone insufficient.
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-glide.txt'
|
||||
}
|
||||
debug {
|
||||
applicationIdSuffix ".debug"
|
||||
|
|
|
|||
9
app/proguard-glide.txt
Normal file
9
app/proguard-glide.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||
-keep public class * extends com.bumptech.glide.module.AppGlideModule
|
||||
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
|
||||
**[] $VALUES;
|
||||
public *;
|
||||
}
|
||||
|
||||
# for DexGuard only
|
||||
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
|
||||
|
|
@ -18,7 +18,7 @@ task checkstyle(type: Checkstyle) {
|
|||
reports {
|
||||
html {
|
||||
enabled true
|
||||
destination "${project.buildDir}/reports/checkstyle/checkstyle.html"
|
||||
destination file("${project.buildDir}/reports/checkstyle/checkstyle.html")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -36,10 +36,10 @@ task pmd(type: Pmd) {
|
|||
xml.enabled = false
|
||||
html.enabled = true
|
||||
xml {
|
||||
destination "${project.buildDir}/reports/pmd/pmd.xml"
|
||||
destination file("${project.buildDir}/reports/pmd/pmd.xml")
|
||||
}
|
||||
html {
|
||||
destination "${project.buildDir}/reports/pmd/pmd.html"
|
||||
destination file("${project.buildDir}/reports/pmd/pmd.html")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -271,11 +271,11 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
|||
showMessageAndCancelDialog(R.string.login_failed_network);
|
||||
} else if (result.toLowerCase(Locale.getDefault()).contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) {
|
||||
// Matches nosuchuser, nosuchusershort, noname
|
||||
showMessageAndCancelDialog(R.string.login_failed_username);
|
||||
showMessageAndCancelDialog(R.string.login_failed_wrong_credentials);
|
||||
emptySensitiveEditFields();
|
||||
} else if (result.toLowerCase(Locale.getDefault()).contains("wrongpassword".toLowerCase())) {
|
||||
// Matches wrongpassword, wrongpasswordempty
|
||||
showMessageAndCancelDialog(R.string.login_failed_password);
|
||||
showMessageAndCancelDialog(R.string.login_failed_wrong_credentials);
|
||||
emptySensitiveEditFields();
|
||||
} else if (result.toLowerCase(Locale.getDefault()).contains("throttle".toLowerCase())) {
|
||||
// Matches unknown throttle error codes
|
||||
|
|
|
|||
36
app/src/main/java/fr/free/nrw/commons/glide/SvgDecoder.java
Normal file
36
app/src/main/java/fr/free/nrw/commons/glide/SvgDecoder.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package fr.free.nrw.commons.glide;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.bumptech.glide.load.Options;
|
||||
import com.bumptech.glide.load.ResourceDecoder;
|
||||
import com.bumptech.glide.load.engine.Resource;
|
||||
import com.bumptech.glide.load.resource.SimpleResource;
|
||||
import com.caverock.androidsvg.SVG;
|
||||
import com.caverock.androidsvg.SVGParseException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* Decodes an SVG internal representation from an {@link InputStream}.
|
||||
*/
|
||||
public class SvgDecoder implements ResourceDecoder<InputStream, SVG> {
|
||||
|
||||
@Override
|
||||
public boolean handles(@NonNull InputStream source, @NonNull Options options) {
|
||||
// TODO: Can we tell?
|
||||
return true;
|
||||
}
|
||||
|
||||
public Resource<SVG> decode(@NonNull InputStream source, int width, int height,
|
||||
@NonNull Options options)
|
||||
throws IOException {
|
||||
try {
|
||||
SVG svg = SVG.getFromInputStream(source);
|
||||
return new SimpleResource<>(svg);
|
||||
} catch (SVGParseException ex) {
|
||||
throw new IOException("Cannot load SVG from stream", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package fr.free.nrw.commons.glide;
|
||||
|
||||
import android.graphics.Picture;
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.bumptech.glide.load.Options;
|
||||
import com.bumptech.glide.load.engine.Resource;
|
||||
import com.bumptech.glide.load.resource.SimpleResource;
|
||||
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
|
||||
import com.caverock.androidsvg.SVG;
|
||||
|
||||
/**
|
||||
* Convert the {@link SVG}'s internal representation to an Android-compatible one
|
||||
* ({@link Picture}).
|
||||
*/
|
||||
public class SvgDrawableTranscoder implements ResourceTranscoder<SVG, PictureDrawable> {
|
||||
@Nullable
|
||||
@Override
|
||||
public Resource<PictureDrawable> transcode(@NonNull Resource<SVG> toTranscode,
|
||||
@NonNull Options options) {
|
||||
SVG svg = toTranscode.get();
|
||||
Picture picture = svg.renderToPicture();
|
||||
PictureDrawable drawable = new PictureDrawable(picture);
|
||||
return new SimpleResource<>(drawable);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
package fr.free.nrw.commons.glide;
|
||||
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.bumptech.glide.load.DataSource;
|
||||
import com.bumptech.glide.load.engine.GlideException;
|
||||
import com.bumptech.glide.request.RequestListener;
|
||||
import com.bumptech.glide.request.target.ImageViewTarget;
|
||||
import com.bumptech.glide.request.target.Target;
|
||||
|
||||
/**
|
||||
* Listener which updates the {@link ImageView} to be software rendered, because
|
||||
* {@link com.caverock.androidsvg.SVG SVG}/{@link android.graphics.Picture Picture} can't render on
|
||||
* a hardware backed {@link android.graphics.Canvas Canvas}.
|
||||
*/
|
||||
public class SvgSoftwareLayerSetter implements RequestListener<PictureDrawable> {
|
||||
|
||||
/**
|
||||
* Sets the layer type to none if the load fails
|
||||
* @param e
|
||||
* @param model
|
||||
* @param target
|
||||
* @param isFirstResource
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean onLoadFailed(GlideException e, Object model, Target<PictureDrawable> target,
|
||||
boolean isFirstResource) {
|
||||
ImageView view = ((ImageViewTarget<?>) target).getView();
|
||||
view.setLayerType(ImageView.LAYER_TYPE_NONE, null);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the layer type to software when the resource is ready
|
||||
* @param resource
|
||||
* @param model
|
||||
* @param target
|
||||
* @param dataSource
|
||||
* @param isFirstResource
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean onResourceReady(PictureDrawable resource, Object model,
|
||||
Target<PictureDrawable> target, DataSource dataSource, boolean isFirstResource) {
|
||||
ImageView view = ((ImageViewTarget<?>) target).getView();
|
||||
view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -23,9 +23,6 @@ import android.widget.ScrollView;
|
|||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.OnClick;
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -35,6 +32,9 @@ import java.util.Locale;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.OnClick;
|
||||
import fr.free.nrw.commons.License;
|
||||
import fr.free.nrw.commons.LicenseList;
|
||||
import fr.free.nrw.commons.Media;
|
||||
|
|
@ -56,16 +56,16 @@ import static android.widget.Toast.LENGTH_SHORT;
|
|||
public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||
|
||||
private boolean editable;
|
||||
private boolean isFeaturedMedia;
|
||||
private boolean isCategoryImage;
|
||||
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
|
||||
private int index;
|
||||
|
||||
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isFeaturedMedia) {
|
||||
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isCategoryImage) {
|
||||
MediaDetailFragment mf = new MediaDetailFragment();
|
||||
|
||||
Bundle state = new Bundle();
|
||||
state.putBoolean("editable", editable);
|
||||
state.putBoolean("isFeaturedMedia", isFeaturedMedia);
|
||||
state.putBoolean("isCategoryImage", isCategoryImage);
|
||||
state.putInt("index", index);
|
||||
state.putInt("listIndex", 0);
|
||||
state.putInt("listTop", 0);
|
||||
|
|
@ -128,7 +128,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
super.onSaveInstanceState(outState);
|
||||
outState.putInt("index", index);
|
||||
outState.putBoolean("editable", editable);
|
||||
outState.putBoolean("isFeaturedMedia", isFeaturedMedia);
|
||||
outState.putBoolean("isCategoryImage", isCategoryImage);
|
||||
|
||||
getScrollPosition();
|
||||
outState.putInt("listTop", initialListTop);
|
||||
|
|
@ -144,12 +144,12 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
|
||||
if (savedInstanceState != null) {
|
||||
editable = savedInstanceState.getBoolean("editable");
|
||||
isFeaturedMedia = savedInstanceState.getBoolean("isFeaturedMedia");
|
||||
isCategoryImage = savedInstanceState.getBoolean("isCategoryImage");
|
||||
index = savedInstanceState.getInt("index");
|
||||
initialListTop = savedInstanceState.getInt("listTop");
|
||||
} else {
|
||||
editable = getArguments().getBoolean("editable");
|
||||
isFeaturedMedia = getArguments().getBoolean("isFeaturedMedia");
|
||||
isCategoryImage = getArguments().getBoolean("isCategoryImage");
|
||||
index = getArguments().getInt("index");
|
||||
initialListTop = 0;
|
||||
}
|
||||
|
|
@ -161,7 +161,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
|
||||
ButterKnife.bind(this,view);
|
||||
|
||||
if (isFeaturedMedia){
|
||||
if (isCategoryImage){
|
||||
authorLayout.setVisibility(VISIBLE);
|
||||
} else {
|
||||
authorLayout.setVisibility(GONE);
|
||||
|
|
@ -328,7 +328,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
if (!TextUtils.isEmpty(licenseLink(media))) {
|
||||
openWebBrowser(licenseLink(media));
|
||||
} else {
|
||||
if(isFeaturedMedia) {
|
||||
if(isCategoryImage) {
|
||||
Timber.d("Unable to fetch license URL for %s", media.getLicense());
|
||||
} else {
|
||||
Toast toast = Toast.makeText(getContext(), getString(R.string.null_url), Toast.LENGTH_SHORT);
|
||||
|
|
@ -503,8 +503,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
if (media.getRequestedDeletion()){
|
||||
delete.setVisibility(GONE);
|
||||
nominatedForDeletion.setVisibility(VISIBLE);
|
||||
}
|
||||
else{
|
||||
} else if (!isCategoryImage) {
|
||||
delete.setVisibility(VISIBLE);
|
||||
nominatedForDeletion.setVisibility(GONE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -444,8 +444,8 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
|
|||
.param("notprop", "list")
|
||||
.param("format", "xml")
|
||||
.param("meta", "notifications")
|
||||
// .param("meta", "notifications")
|
||||
.param("notformat", "model")
|
||||
.param("notwikis", "wikidatawiki|commonswiki|enwiki")
|
||||
.get()
|
||||
.getNode("/api/query/notifications/list");
|
||||
} catch (IOException e) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package fr.free.nrw.commons.notification;
|
||||
|
||||
import android.util.Log;
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.text.Html;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
|
@ -8,17 +9,23 @@ import android.widget.ImageView;
|
|||
import android.widget.TextView;
|
||||
|
||||
import com.borjabravo.readmoretextview.ReadMoreTextView;
|
||||
import com.bumptech.glide.RequestBuilder;
|
||||
import com.pedrogomez.renderers.Renderer;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.glide.SvgSoftwareLayerSetter;
|
||||
|
||||
import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;
|
||||
|
||||
/**
|
||||
* Created by root on 19.12.2017.
|
||||
*/
|
||||
|
||||
public class NotificationRenderer extends Renderer<Notification> {
|
||||
private RequestBuilder<PictureDrawable> requestBuilder;
|
||||
|
||||
@BindView(R.id.title) ReadMoreTextView title;
|
||||
@BindView(R.id.time) TextView time;
|
||||
@BindView(R.id.icon) ImageView icon;
|
||||
|
|
@ -41,23 +48,32 @@ public class NotificationRenderer extends Renderer<Notification> {
|
|||
protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) {
|
||||
View inflatedView = layoutInflater.inflate(R.layout.item_notification, viewGroup, false);
|
||||
ButterKnife.bind(this, inflatedView);
|
||||
requestBuilder = GlideApp.with(inflatedView.getContext())
|
||||
.as(PictureDrawable.class)
|
||||
.error(R.drawable.round_icon_unknown)
|
||||
.transition(withCrossFade())
|
||||
.listener(new SvgSoftwareLayerSetter());
|
||||
return inflatedView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render() {
|
||||
Notification notification = getContent();
|
||||
String str = notification.notificationText.trim();
|
||||
str = str.concat(" ");
|
||||
title.setText(str);
|
||||
setTitle(notification.notificationText);
|
||||
time.setText(notification.date);
|
||||
switch (notification.notificationType) {
|
||||
case THANK_YOU_EDIT:
|
||||
icon.setImageResource(R.drawable.ic_edit_black_24dp);
|
||||
break;
|
||||
default:
|
||||
icon.setImageResource(R.drawable.round_icon_unknown);
|
||||
}
|
||||
requestBuilder.load(notification.iconUrl).into(icon);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up the notification text and sets it as the title
|
||||
* Clean up is required to fix escaped HTML string and extra white spaces at the beginning of the notification
|
||||
* @param notificationText
|
||||
*/
|
||||
private void setTitle(String notificationText) {
|
||||
notificationText = notificationText.trim().replaceAll("(^\\h*)|(\\h*$)", "");
|
||||
notificationText = Html.fromHtml(notificationText).toString();
|
||||
notificationText = notificationText.concat(" ");
|
||||
title.setText(notificationText);
|
||||
}
|
||||
|
||||
public interface NotificationClicked{
|
||||
|
|
|
|||
|
|
@ -16,12 +16,13 @@ import javax.annotation.Nullable;
|
|||
import fr.free.nrw.commons.BuildConfig;
|
||||
import fr.free.nrw.commons.R;
|
||||
|
||||
import static fr.free.nrw.commons.notification.NotificationType.THANK_YOU_EDIT;
|
||||
import static fr.free.nrw.commons.notification.NotificationType.UNKNOWN;
|
||||
|
||||
public class NotificationUtils {
|
||||
|
||||
private static final String COMMONS_WIKI = "commonswiki";
|
||||
private static final String WIKIDATA_WIKI = "wikidatawiki";
|
||||
private static final String WIKIPEDIA_WIKI = "enwiki";
|
||||
|
||||
public static boolean isCommonsNotification(Node document) {
|
||||
if (document == null || !document.hasAttributes()) {
|
||||
|
|
@ -31,6 +32,32 @@ public class NotificationUtils {
|
|||
return COMMONS_WIKI.equals(element.getAttribute("wiki"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the wiki attribute corresponds to wikidatawiki
|
||||
* @param document
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWikidataNotification(Node document) {
|
||||
if (document == null || !document.hasAttributes()) {
|
||||
return false;
|
||||
}
|
||||
Element element = (Element) document;
|
||||
return WIKIDATA_WIKI.equals(element.getAttribute("wiki"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the wiki attribute corresponds to enwiki
|
||||
* @param document
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWikipediaNotification(Node document) {
|
||||
if (document == null || !document.hasAttributes()) {
|
||||
return false;
|
||||
}
|
||||
Element element = (Element) document;
|
||||
return WIKIPEDIA_WIKI.equals(element.getAttribute("wiki"));
|
||||
}
|
||||
|
||||
public static NotificationType getNotificationType(Node document) {
|
||||
Element element = (Element) document;
|
||||
String type = element.getAttribute("type");
|
||||
|
|
@ -68,10 +95,17 @@ public class NotificationUtils {
|
|||
return notifications;
|
||||
}
|
||||
|
||||
/**
|
||||
* Currently the app is interested in showing notifications just from the following three wikis: commons, wikidata, wikipedia
|
||||
* This function returns true only if the notification belongs to any of the above wikis and is of a known notification type
|
||||
* @param node
|
||||
* @return
|
||||
*/
|
||||
private static boolean isUsefulNotification(Node node) {
|
||||
return isCommonsNotification(node)
|
||||
&& !getNotificationType(node).equals(UNKNOWN)
|
||||
&& !getNotificationType(node).equals(THANK_YOU_EDIT);
|
||||
return (isCommonsNotification(node)
|
||||
|| isWikidataNotification(node)
|
||||
|| isWikipediaNotification(node))
|
||||
&& !getNotificationType(node).equals(UNKNOWN);
|
||||
}
|
||||
|
||||
public static boolean isBundledNotification(Node document) {
|
||||
|
|
@ -97,7 +131,7 @@ public class NotificationUtils {
|
|||
|
||||
switch (type) {
|
||||
case THANK_YOU_EDIT:
|
||||
notificationText = context.getString(R.string.notifications_thank_you_edit);
|
||||
notificationText = getThankYouEditDescription(document);
|
||||
break;
|
||||
case EDIT_USER_TALK:
|
||||
notificationText = getNotificationText(document);
|
||||
|
|
@ -146,6 +180,16 @@ public class NotificationUtils {
|
|||
return body != null ? body.getTextContent() : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the header node returned in the XML document to form the description for thank you edits
|
||||
* @param document
|
||||
* @return
|
||||
*/
|
||||
private static String getThankYouEditDescription(Node document) {
|
||||
Node body = getNode(getModel(document), "header");
|
||||
return body != null ? body.getTextContent() : "";
|
||||
}
|
||||
|
||||
private static String getNotificationIconUrl(Node document) {
|
||||
String format = "%s%s";
|
||||
Node iconUrl = getNode(getModel(document), "iconUrl");
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
package fr.free.nrw.commons.notification;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.Registry;
|
||||
import com.bumptech.glide.annotation.GlideModule;
|
||||
import com.bumptech.glide.module.AppGlideModule;
|
||||
import com.caverock.androidsvg.SVG;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
import fr.free.nrw.commons.glide.SvgDecoder;
|
||||
import fr.free.nrw.commons.glide.SvgDrawableTranscoder;
|
||||
|
||||
/**
|
||||
* Module for the SVG sample app.
|
||||
*/
|
||||
@GlideModule
|
||||
public class SvgModule extends AppGlideModule {
|
||||
@Override
|
||||
public void registerComponents(@NonNull Context context, @NonNull Glide glide,
|
||||
@NonNull Registry registry) {
|
||||
registry.register(SVG.class, PictureDrawable.class, new SvgDrawableTranscoder())
|
||||
.append(InputStream.class, SVG.class, new SvgDecoder());
|
||||
}
|
||||
|
||||
// Disable manifest parsing to avoid adding similar modules twice.
|
||||
@Override
|
||||
public boolean isManifestParsingEnabled() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -26,6 +26,8 @@ import android.widget.GridView;
|
|||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
|
||||
|
|
@ -41,9 +43,13 @@ public class MultipleUploadListFragment extends Fragment {
|
|||
void OnMultipleUploadInitiated();
|
||||
}
|
||||
|
||||
private GridView photosGrid;
|
||||
@BindView(R.id.multipleShareBackground)
|
||||
GridView photosGrid;
|
||||
|
||||
@BindView(R.id.multipleBaseTitle)
|
||||
EditText baseTitle;
|
||||
|
||||
private PhotoDisplayAdapter photosAdapter;
|
||||
private EditText baseTitle;
|
||||
private TitleTextWatcher textWatcher = new TitleTextWatcher();
|
||||
|
||||
private Point photoSize;
|
||||
|
|
@ -166,9 +172,7 @@ 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 = view.findViewById(R.id.multipleShareBackground);
|
||||
baseTitle = view.findViewById(R.id.multipleBaseTitle);
|
||||
|
||||
ButterKnife.bind(this,view);
|
||||
photosAdapter = new PhotoDisplayAdapter();
|
||||
photosGrid.setAdapter(photosAdapter);
|
||||
photosGrid.setOnItemClickListener((AdapterView.OnItemClickListener) getActivity());
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ 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;
|
||||
|
|
@ -32,16 +31,16 @@ 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.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.OnClick;
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.github.chrisbanes.photoview.PhotoView;
|
||||
|
|
@ -69,22 +68,18 @@ import fr.free.nrw.commons.caching.CacheController;
|
|||
import fr.free.nrw.commons.category.CategorizationFragment;
|
||||
import fr.free.nrw.commons.category.OnCategoriesSaveHandler;
|
||||
import fr.free.nrw.commons.contributions.Contribution;
|
||||
import fr.free.nrw.commons.contributions.ContributionsActivity;
|
||||
import fr.free.nrw.commons.modifications.CategoryModifier;
|
||||
import fr.free.nrw.commons.modifications.ModificationsContentProvider;
|
||||
import fr.free.nrw.commons.modifications.ModifierSequence;
|
||||
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
|
||||
import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
|
||||
|
||||
import fr.free.nrw.commons.utils.ImageUtils;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
import timber.log.Timber;
|
||||
|
||||
import android.support.design.widget.FloatingActionButton;
|
||||
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
|
||||
|
|
@ -95,6 +90,22 @@ public class ShareActivity
|
|||
implements SingleUploadFragment.OnUploadActionInitiated,
|
||||
OnCategoriesSaveHandler,SimilarImageDialogFragment.onResponse {
|
||||
|
||||
@BindView(R.id.container)
|
||||
FrameLayout flContainer;
|
||||
@BindView(R.id.backgroundImage)
|
||||
SimpleDraweeView backgroundImageView;
|
||||
@BindView(R.id.media_map)
|
||||
FloatingActionButton mapsFragment; //Lets stick to camelCase
|
||||
@BindView(R.id.media_upload_zoom_in)
|
||||
FloatingActionButton zoomInButton;
|
||||
@BindView(R.id.media_upload_zoom_out)
|
||||
FloatingActionButton zoomOutButton;
|
||||
@BindView(R.id.main_fab)
|
||||
FloatingActionButton mainFab;
|
||||
@BindView(R.id.expanded_image)
|
||||
PhotoView expandedImageView;
|
||||
|
||||
|
||||
private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1;
|
||||
private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2;
|
||||
private static final int REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION = 3;
|
||||
|
|
@ -120,9 +131,6 @@ public class ShareActivity
|
|||
|
||||
private Uri mediaUri;
|
||||
private Contribution contribution;
|
||||
private SimpleDraweeView backgroundImageView;
|
||||
private FloatingActionButton maps_fragment;
|
||||
|
||||
private boolean cacheFound;
|
||||
|
||||
private GPSExtractor imageObj;
|
||||
|
|
@ -143,11 +151,14 @@ public class ShareActivity
|
|||
|
||||
private Animator CurrentAnimator;
|
||||
private long ShortAnimationDuration;
|
||||
private FloatingActionButton zoomInButton;
|
||||
private FloatingActionButton zoomOutButton;
|
||||
private FloatingActionButton mainFab;
|
||||
private boolean isFABOpen = false;
|
||||
|
||||
//Had to make them class variables, to extract out the click listeners, also I see no harm in this
|
||||
final Rect startBounds = new Rect();
|
||||
final Rect finalBounds = new Rect();
|
||||
final Point globalOffset = new Point();
|
||||
private float startScaleFinal;
|
||||
|
||||
/**
|
||||
* Called when user taps the submit button.
|
||||
* Requests Storage permission, if needed.
|
||||
|
|
@ -264,7 +275,6 @@ public class ShareActivity
|
|||
setContentView(R.layout.activity_share);
|
||||
ButterKnife.bind(this);
|
||||
initBack();
|
||||
backgroundImageView = (SimpleDraweeView) findViewById(R.id.backgroundImage);
|
||||
backgroundImageView.setHierarchy(GenericDraweeHierarchyBuilder
|
||||
.newInstance(getResources())
|
||||
.setPlaceholderImage(VectorDrawableCompat.create(getResources(),
|
||||
|
|
@ -337,6 +347,7 @@ public class ShareActivity
|
|||
if (mediaUri != null) {
|
||||
backgroundImageView.setImageURI(mediaUri);
|
||||
}
|
||||
<<<<<<< HEAD
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -388,18 +399,94 @@ public class ShareActivity
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
=======
|
||||
if (savedInstanceState != null) {
|
||||
contribution = savedInstanceState.getParcelable("contribution");
|
||||
}
|
||||
|
||||
requestAuthToken();
|
||||
|
||||
Timber.d("Uri: %s", mediaUri.toString());
|
||||
Timber.d("Ext storage dir: %s", Environment.getExternalStorageDirectory());
|
||||
|
||||
useNewPermissions = false;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
useNewPermissions = true;
|
||||
|
||||
if (!needsToRequestStoragePermission()) {
|
||||
storagePermitted = true;
|
||||
}
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
||||
locationPermitted = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check storage permissions if marshmallow or newer
|
||||
if (useNewPermissions && (!storagePermitted || !locationPermitted)) {
|
||||
if (!storagePermitted && !locationPermitted) {
|
||||
String permissionRationales =
|
||||
getResources().getString(R.string.read_storage_permission_rationale) + "\n"
|
||||
+ getResources().getString(R.string.location_permission_rationale);
|
||||
snackbar = requestPermissionUsingSnackBar(
|
||||
permissionRationales,
|
||||
new String[]{
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||
Manifest.permission.ACCESS_FINE_LOCATION},
|
||||
REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION);
|
||||
View snackbarView = snackbar.getView();
|
||||
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
|
||||
textView.setMaxLines(3);
|
||||
} else if (!storagePermitted) {
|
||||
requestPermissionUsingSnackBar(
|
||||
getString(R.string.read_storage_permission_rationale),
|
||||
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
|
||||
REQUEST_PERM_ON_CREATE_STORAGE);
|
||||
} else if (!locationPermitted) {
|
||||
requestPermissionUsingSnackBar(
|
||||
getString(R.string.location_permission_rationale),
|
||||
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
|
||||
REQUEST_PERM_ON_CREATE_LOCATION);
|
||||
}
|
||||
}
|
||||
performPreUploadProcessingOfFile();
|
||||
|
||||
|
||||
SingleUploadFragment shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView");
|
||||
categorizationFragment = (CategorizationFragment) getSupportFragmentManager().findFragmentByTag("categorization");
|
||||
if (shareView == null && categorizationFragment == null) {
|
||||
shareView = new SingleUploadFragment();
|
||||
getSupportFragmentManager()
|
||||
.beginTransaction()
|
||||
.add(R.id.single_upload_fragment_container, shareView, "shareView")
|
||||
.commitAllowingStateLoss();
|
||||
}
|
||||
uploadController.prepareService();
|
||||
mapsFragment.setVisibility(View.VISIBLE);
|
||||
if( imageObj == null || imageObj.imageCoordsExists != true){
|
||||
mapsFragment.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
>>>>>>> refs/remotes/commons-app/master
|
||||
* Function to display the zoom and map FAB
|
||||
*/
|
||||
private void showFABMenu() {
|
||||
isFABOpen=true;
|
||||
|
||||
<<<<<<< HEAD
|
||||
if( imageObj != null && imageObj.imageCoordsExists)
|
||||
maps_fragment.setVisibility(View.VISIBLE);
|
||||
=======
|
||||
if( imageObj != null && imageObj.imageCoordsExists == true)
|
||||
mapsFragment.setVisibility(View.VISIBLE);
|
||||
>>>>>>> refs/remotes/commons-app/master
|
||||
zoomInButton.setVisibility(View.VISIBLE);
|
||||
|
||||
mainFab.animate().rotationBy(180);
|
||||
maps_fragment.animate().translationY(-getResources().getDimension(R.dimen.second_fab));
|
||||
mapsFragment.animate().translationY(-getResources().getDimension(R.dimen.second_fab));
|
||||
zoomInButton.animate().translationY(-getResources().getDimension(R.dimen.first_fab));
|
||||
}
|
||||
|
||||
|
|
@ -409,7 +496,7 @@ public class ShareActivity
|
|||
private void closeFABMenu(){
|
||||
isFABOpen=false;
|
||||
mainFab.animate().rotationBy(-180);
|
||||
maps_fragment.animate().translationY(0);
|
||||
mapsFragment.animate().translationY(0);
|
||||
zoomInButton.animate().translationY(0).setListener(new Animator.AnimatorListener() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animator) {
|
||||
|
|
@ -418,7 +505,7 @@ public class ShareActivity
|
|||
@Override
|
||||
public void onAnimationEnd(Animator animator) {
|
||||
if(!isFABOpen){
|
||||
maps_fragment.setVisibility(View.GONE);
|
||||
mapsFragment.setVisibility(View.GONE);
|
||||
zoomInButton.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
|
@ -671,8 +758,9 @@ public class ShareActivity
|
|||
return;
|
||||
}
|
||||
|
||||
//I might not be supposed to change it, but still, I saw it
|
||||
@Override
|
||||
public void onPostiveResponse() {
|
||||
public void onPositiveResponse() {
|
||||
imageObj = tempImageObj;
|
||||
decimalCoords = imageObj.getCoords(false);// Not necessary to use gps as image already ha EXIF data
|
||||
Timber.d("EXIF from tempImageObj");
|
||||
|
|
@ -838,26 +926,19 @@ public class ShareActivity
|
|||
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);
|
||||
flContainer.getGlobalVisibleRect(finalBounds, globalOffset);
|
||||
startBounds.offset(-globalOffset.x, -globalOffset.y);
|
||||
finalBounds.offset(-globalOffset.x, -globalOffset.y);
|
||||
|
||||
|
|
@ -928,53 +1009,86 @@ public class ShareActivity
|
|||
// 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);
|
||||
mainFab.setVisibility(View.VISIBLE);
|
||||
startScaleFinal = startScale;
|
||||
|
||||
// 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;
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* called when upper arrow floating button
|
||||
*/
|
||||
@OnClick(R.id.main_fab)
|
||||
public void onMainFabClicked() {
|
||||
if (!isFABOpen) {
|
||||
showFABMenu();
|
||||
} else {
|
||||
closeFABMenu();
|
||||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.media_upload_zoom_in)
|
||||
public void onZoomInFabClicked() {
|
||||
//This try catch block was originally holding the entire click listener on the fab button, I did not wanted to risk exceptions
|
||||
try {
|
||||
zoomImageFromThumb(backgroundImageView, mediaUri);
|
||||
} catch (Exception e) {
|
||||
Log.i("exception", e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.media_upload_zoom_out)
|
||||
public void onZoomOutFabClicked() {
|
||||
if (CurrentAnimator != null) {
|
||||
CurrentAnimator.cancel();
|
||||
}
|
||||
zoomOutButton.setVisibility(View.GONE);
|
||||
mainFab.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) {
|
||||
//background image view is thumbView
|
||||
backgroundImageView.setAlpha(1f);
|
||||
expandedImageView.setVisibility(View.GONE);
|
||||
CurrentAnimator = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
//background image view is thumbView
|
||||
backgroundImageView.setAlpha(1f);
|
||||
expandedImageView.setVisibility(View.GONE);
|
||||
CurrentAnimator = null;
|
||||
}
|
||||
});
|
||||
set.start();
|
||||
CurrentAnimator = set;
|
||||
}
|
||||
|
||||
@OnClick(R.id.media_map)
|
||||
public void onFabShowMapsClicked() {
|
||||
if (imageObj != null && imageObj.imageCoordsExists == true) {
|
||||
Uri gmmIntentUri = Uri
|
||||
.parse("google.streetview:cbll=" + imageObj.getDecLatitude() + "," + imageObj
|
||||
.getDecLongitude());
|
||||
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
|
||||
mapIntent.setPackage("com.google.android.apps.maps");
|
||||
startActivity(mapIntent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@ import android.view.ViewGroup;
|
|||
import android.view.Window;
|
||||
import android.widget.Button;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.OnClick;
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.facebook.imagepipeline.listener.RequestListener;
|
||||
|
|
@ -29,29 +32,33 @@ import fr.free.nrw.commons.R;
|
|||
*/
|
||||
|
||||
public class SimilarImageDialogFragment extends DialogFragment {
|
||||
|
||||
@BindView(R.id.orginalImage)
|
||||
SimpleDraweeView originalImage;
|
||||
@BindView(R.id.possibleImage)
|
||||
SimpleDraweeView possibleImage;
|
||||
@BindView(R.id.postive_button)
|
||||
Button positiveButton;
|
||||
@BindView(R.id.negative_button)
|
||||
Button negativeButton;
|
||||
onResponse mOnResponse;//Implemented interface from shareActivity
|
||||
Boolean gotResponse = false;
|
||||
|
||||
public SimilarImageDialogFragment() {
|
||||
}
|
||||
public interface onResponse{
|
||||
public void onPostiveResponse();
|
||||
public void onPositiveResponse();
|
||||
|
||||
public void onNegativeResponse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.fragment_similar_image_dialog, container, false);
|
||||
ButterKnife.bind(this,view);
|
||||
Set<RequestListener> requestListeners = new HashSet<>();
|
||||
requestListeners.add(new RequestLoggingListener());
|
||||
|
||||
originalImage =(SimpleDraweeView) view.findViewById(R.id.orginalImage);
|
||||
possibleImage =(SimpleDraweeView) view.findViewById(R.id.possibleImage);
|
||||
positiveButton = (Button) view.findViewById(R.id.postive_button);
|
||||
negativeButton = (Button) view.findViewById(R.id.negative_button);
|
||||
|
||||
originalImage.setHierarchy(GenericDraweeHierarchyBuilder
|
||||
.newInstance(getResources())
|
||||
.setPlaceholderImage(VectorDrawableCompat.create(getResources(),
|
||||
|
|
@ -70,22 +77,6 @@ public class SimilarImageDialogFragment extends DialogFragment {
|
|||
originalImage.setImageURI(Uri.fromFile(new File(getArguments().getString("originalImagePath"))));
|
||||
possibleImage.setImageURI(Uri.fromFile(new File(getArguments().getString("possibleImagePath"))));
|
||||
|
||||
negativeButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
mOnResponse.onNegativeResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
positiveButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
mOnResponse.onPostiveResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
return view;
|
||||
}
|
||||
|
||||
|
|
@ -105,8 +96,23 @@ public class SimilarImageDialogFragment extends DialogFragment {
|
|||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
// I user dismisses dialog by pressing outside the dialog.
|
||||
if(!gotResponse)
|
||||
if (!gotResponse) {
|
||||
mOnResponse.onNegativeResponse();
|
||||
}
|
||||
super.onDismiss(dialog);
|
||||
}
|
||||
|
||||
@OnClick(R.id.negative_button)
|
||||
public void onNegativeButtonClicked() {
|
||||
mOnResponse.onNegativeResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
|
||||
@OnClick(R.id.postive_button)
|
||||
public void onPositiveButtonClicked() {
|
||||
mOnResponse.onPositiveResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@
|
|||
<string name="categories_activity_title">Categoríes</string>
|
||||
<string name="title_activity_settings">Configuración</string>
|
||||
<string name="title_activity_signup">Date d\'alta</string>
|
||||
<string name="title_activity_featured_images">Imáxenes destacaes</string>
|
||||
<string name="menu_about">Tocante a</string>
|
||||
<string name="about_license">La app de Wikimedia Commons ye software de códigu abiertu, creáu y calteníu por becaos y voluntarios de la comunidá de Wikimedia. La Fundación Wikimedia nun participa na creación, desendolcu nin caltenimientu de la app.</string>
|
||||
<string name="about_improve">Crea una nueva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia en GitHub</a> pa informar de problemes y suxerencies.</string>
|
||||
|
|
@ -169,6 +170,8 @@
|
|||
<string name="media_detail_media_title">Títulu del mediu</string>
|
||||
<string name="media_detail_description">Descripción</string>
|
||||
<string name="media_detail_description_explanation">Equí va la descripción del mediu. Esto pué ser llargo enforma, y necesitará espardese per delles llinies. Sicasí, esperamos que se vea bien.</string>
|
||||
<string name="media_detail_author">Autor</string>
|
||||
<string name="media_detail_author_explanation">El nome d\'usuariu del autor de la imaxe destacada va equí.</string>
|
||||
<string name="media_detail_uploaded_date">Data d\'unviu</string>
|
||||
<string name="media_detail_license">Llicencia</string>
|
||||
<string name="media_detail_coordinates">Coordenaes</string>
|
||||
|
|
@ -211,6 +214,7 @@
|
|||
<string name="navigation_item_logout">Salir</string>
|
||||
<string name="navigation_item_info">Tutorial</string>
|
||||
<string name="navigation_item_notification">Avisos</string>
|
||||
<string name="navigation_item_featured_images">Destacada</string>
|
||||
<string name="nearby_needs_permissions">Los sitios cercanos nun pueden amosase ensin los permisos d\'allugamientu</string>
|
||||
<string name="no_description_found">nun s\'atoparon descripciones</string>
|
||||
<string name="nearby_info_menu_commons_article">Páxina del ficheru en Commons</string>
|
||||
|
|
@ -259,4 +263,14 @@
|
|||
<string name="about_translate_proceed">Siguir</string>
|
||||
<string name="about_translate_cancel">Encaboxar</string>
|
||||
<string name="retry">Retentar</string>
|
||||
<string name="showcase_view_got_it_button">Entendílo</string>
|
||||
<string name="showcase_view_whole_nearby_activity">Estos son sitios cercanos a ti que precisen imaxes para ilustrar los sos artículos de Wikipedia</string>
|
||||
<string name="showcase_view_list_icon">Tocando esti botón amuésase la llista d\'esos llugares</string>
|
||||
<string name="showcase_view_plus_fab">Puedes xubir una imaxe pa cualquier sitiu dende la galería o la cámara</string>
|
||||
<string name="no_images_found">Nun s\'alcontró nenguna imaxe</string>
|
||||
<string name="error_loading_images">Asocedió un error al cargar les imáxenes.</string>
|
||||
<string name="image_uploaded_by">Xubida por: %1$s</string>
|
||||
<string name="share_app_title">Compartir app</string>
|
||||
<string name="share_coordinates_not_present">Nun s\'especificaron les coordenaes al escoyer la imaxe</string>
|
||||
<string name="error_fetching_nearby_places">Error al llograr los llugares cercanos.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
<string name="preference_category_general">Bıngeh</string>
|
||||
<string name="preference_category_location">Lokasyon</string>
|
||||
<string name="app_name">Commons</string>
|
||||
<string name="bullet">•</string>
|
||||
<string name="menu_settings">Eyari</string>
|
||||
<string name="username">Namey karberi</string>
|
||||
<string name="password">Parola</string>
|
||||
|
|
@ -84,7 +85,8 @@
|
|||
<string name="title_activity_signup">Qeyd be</string>
|
||||
<string name="menu_about">Heq te cı</string>
|
||||
<string name="about_improve">Qandê yew <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-cıkewtış</a>ê neweyi rê rapor û teklifan bıaferne.</string>
|
||||
<string name="about_privacy_policy" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Politikay nımıtışi</a></string>
|
||||
<string name="about_privacy_policy"><u>Politikaya nımıtışi</u></string>
|
||||
<string name="about_credits"><u>İştırakkerdoği</u></string>
|
||||
<string name="title_activity_about">Heq te cı</string>
|
||||
<string name="menu_feedback">Peyd rışten bırış (E-posta ra)</string>
|
||||
<string name="no_email_client">E-posta eyar nêbi</string>
|
||||
|
|
@ -92,7 +94,7 @@
|
|||
<string name="menu_retry_upload">Anciya bıcerrebne</string>
|
||||
<string name="menu_cancel_upload">Bıtexelne</string>
|
||||
<string name="menu_download">Ron</string>
|
||||
<string name="preference_license" fuzzy="true">Lisans</string>
|
||||
<string name="preference_license">Lisanso hesebiyaye</string>
|
||||
<string name="license_name_cc_by_sa"> Attribution-ShareAlike 3.0</string>
|
||||
<string name="license_name_cc_by">Attribution 3.0</string>
|
||||
<string name="license_name_cc0">CC0</string>
|
||||
|
|
@ -127,6 +129,8 @@
|
|||
<string name="yes">E</string>
|
||||
<string name="no">Nê</string>
|
||||
<string name="media_detail_title">Sername</string>
|
||||
<string name="media_detail_description">Şınasnayış</string>
|
||||
<string name="media_detail_author">Nuştekar</string>
|
||||
<string name="media_detail_license">Lisans</string>
|
||||
<string name="media_detail_coordinates">Koordinati</string>
|
||||
<string name="welcome_image_tulip">Korbıze</string>
|
||||
|
|
|
|||
|
|
@ -162,8 +162,8 @@
|
|||
<string name="detail_description_empty">Nincs leírás</string>
|
||||
<string name="detail_license_empty">Ismeretlen licenc</string>
|
||||
<string name="menu_refresh">Frissítés</string>
|
||||
<string name="read_storage_permission_rationale" fuzzy="true">Szükséges engedély: Külső tárhely olvasása. Az alkalmazás nem működik enélkül.</string>
|
||||
<string name="write_storage_permission_rationale" fuzzy="true">Szükséges engedély: Külső tárhely írása. Az alkalmazás nem működik enélkül.</string>
|
||||
<string name="read_storage_permission_rationale">Szükséges engedély: Külső tárhely olvasása. Az alkalmazás nem működik enélkül.</string>
|
||||
<string name="write_storage_permission_rationale">Szükséges engedély: Külső tárhely írása. Az alkalmazás nem tudja használni a kamerát enélkül.</string>
|
||||
<string name="location_permission_rationale">Lehetséges engedély: Jelenlegi hely megszerzése, a kategóriajavaslatok lehetőségéért.</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="title_activity_nearby">Közeli helyek</string>
|
||||
|
|
@ -242,6 +242,7 @@
|
|||
<string name="nearby_location_has_not_changed">A hely nem változott.</string>
|
||||
<string name="nearby_location_not_available">A hely nem érhető el.</string>
|
||||
<string name="location_permission_rationale_nearby">Közeli helyek listájának megtekintéséhez engedély szükséges</string>
|
||||
<string name="read_article">SZÓCIKK OLVASÁSA</string>
|
||||
<string name="notifications_welcome">Üdvözlünk a Wikimedia Commonson, %1$s! Örülünk, hogy itt vagy.</string>
|
||||
<string name="notifications_talk_page_message">%1$s üzenetet hagyott a vitalapodon</string>
|
||||
<string name="notifications_thank_you_edit">Köszönjük a szerkesztésedet!</string>
|
||||
|
|
@ -258,5 +259,12 @@
|
|||
<string name="about_translate_proceed">Folytatás</string>
|
||||
<string name="about_translate_cancel">Mégse</string>
|
||||
<string name="retry">Újra</string>
|
||||
<string name="showcase_view_whole_nearby_activity">Ezek a helyek vannak a közeledben, amikről van Wikipédia szócikk és nincs bennük kép.</string>
|
||||
<string name="showcase_view_list_icon">A gombra koppintva bejön egy lista, ami ezeket a helyeket mutatja.</string>
|
||||
<string name="showcase_view_plus_fab">Bármelyik helyhez feltölthetsz képet a galériádból vagy készíthetsz újat a kamerával.</string>
|
||||
<string name="no_images_found">Nem található kép!</string>
|
||||
<string name="error_loading_images">Képbetöltés közben hiba történt</string>
|
||||
<string name="share_app_title">Alkalmazás megosztása</string>
|
||||
<string name="share_coordinates_not_present">A koordináták nem lettek megadva a kép kiválasztásakor.</string>
|
||||
<string name="error_fetching_nearby_places">Hiba a közeli helyek elérésekor.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -263,4 +263,14 @@
|
|||
<string name="about_translate_proceed">Halda áfram</string>
|
||||
<string name="about_translate_cancel">Hætta við</string>
|
||||
<string name="retry">Reyna aftur</string>
|
||||
<string name="showcase_view_got_it_button">Náði því!</string>
|
||||
<string name="showcase_view_whole_nearby_activity">Þetta eru þeir staðir í næsta nágrenni við þig sem vantar myndir til að skýra með Wikipedia-greinar</string>
|
||||
<string name="showcase_view_list_icon">Ef ýtt er á þennan hnapp birtist listi yfir þessa staði</string>
|
||||
<string name="showcase_view_plus_fab">Þú getur sent inn mynd úr myndasafninu þínu eða myndavélinni</string>
|
||||
<string name="no_images_found">Engir myndir fundust!</string>
|
||||
<string name="error_loading_images">Villa kom upp við að hlaða inn myndum.</string>
|
||||
<string name="image_uploaded_by">Sent inn af: %1$s</string>
|
||||
<string name="share_app_title">Deila forriti</string>
|
||||
<string name="share_coordinates_not_present">Hnit voru ekki tilgreind við val myndar</string>
|
||||
<string name="error_fetching_nearby_places">Villa við að sækja nálæga staði.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -40,7 +40,8 @@
|
|||
<string name="upload_failed_notification_title">%1$s のアップロードに失敗しました</string>
|
||||
<string name="upload_failed_notification_subtitle">閲覧するにはタップしてください</string>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="other">%1$d 件のファイルをアップロード中</item>
|
||||
<item quantity="one">%1$d file uploading</item>
|
||||
<item quantity="other">%1$d件のファイルをアップロード中</item>
|
||||
</plurals>
|
||||
<string name="title_activity_contributions">自分の最近のアップロードファイル</string>
|
||||
<string name="contribution_state_queued">順番待ち中</string>
|
||||
|
|
@ -59,9 +60,9 @@
|
|||
<string name="login_failed_network">ログインできません - ネットワークのエラーです</string>
|
||||
<string name="login_failed_username">ログインできません - 利用者名を確認してください</string>
|
||||
<string name="login_failed_password">ログインできません - パスワードを確認してください</string>
|
||||
<string name="login_failed_throttled">失敗した回数が多すぎます。数分でもう一度お試しください。</string>
|
||||
<string name="login_failed_throttled">失敗した回数が多すぎます。数分待ってからもう一度お試しください。</string>
|
||||
<string name="login_failed_blocked">申し訳ありませんが、この利用者はコモンズでブロックされています。</string>
|
||||
<string name="login_failed_2fa_needed">2 要素認証コードを提供する必要があります。</string>
|
||||
<string name="login_failed_2fa_needed">2要素認証コードを提供する必要があります。</string>
|
||||
<string name="login_failed_generic">ログイン失敗</string>
|
||||
<string name="share_upload_button">アップロード</string>
|
||||
<string name="multiple_share_base_title">このセットに名前をつけてください</string>
|
||||
|
|
@ -76,22 +77,24 @@
|
|||
<string name="contributions_subtitle_zero">まだ何もアップロードされていません。</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">\@string/contributions_subtitle_zero</item>
|
||||
<item quantity="other">%1$d 件のアップロード</item>
|
||||
<item quantity="other">pne=%1$d upload</item>
|
||||
</plurals>
|
||||
<plurals name="starting_multiple_uploads">
|
||||
<item quantity="other">%1$d 件のアップロードを開始中</item>
|
||||
<item quantity="one">Starting %1$d upload</item>
|
||||
<item quantity="other">%1$d件のアップロードを開始中</item>
|
||||
</plurals>
|
||||
<plurals name="multiple_uploads_title">
|
||||
<item quantity="one">%1$d upload</item>
|
||||
<item quantity="other">%1$d 件のアップロード</item>
|
||||
</plurals>
|
||||
<string name="categories_not_found">%1$s に一致するカテゴリが見つかりません</string>
|
||||
<string name="categories_skip_explanation">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\n\nカテゴリ名の入力を開始してください。\nこの手順をスキップするにはこのメッセージをタップしてください(または戻るボタン)。</string>
|
||||
<string name="categories_skip_explanation">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\nカテゴリ名の入力を開始してください。</string>
|
||||
<string name="categories_activity_title">カテゴリ</string>
|
||||
<string name="title_activity_settings">設定</string>
|
||||
<string name="title_activity_signup">利用者登録</string>
|
||||
<string name="title_activity_featured_images">秀逸な画像</string>
|
||||
<string name="menu_about">このアプリについて</string>
|
||||
<string name="about_license">ウィキメディア・コモンズ・アプリはウィキメディア・コミュニティの助成金受給者とボランティアによって製作・メンテナンスされているオープンソースソフトウェアです。ウィキメディア財団はこのアプリの製作・開発・メンテナンスに関与していません。</string>
|
||||
<string name="about_license">ウィキメディア・コモンズ・アプリはウィキメディア・コミュニティの助成金受給者とボランティアが製作・管理しているオープンソースソフトウェアです。ウィキメディア財団はこのアプリの製作・開発・メンテナンスに関与していません。</string>
|
||||
<string name="about_improve">バグとアイディアは <a href=\"https://github.com/commons-app/apps-android-commons/issues\">Github</a> へ。</string>
|
||||
<string name="about_privacy_policy"><u>プライバシー・ポリシー</u></string>
|
||||
<string name="about_credits"><u>クレジット</u></string>
|
||||
|
|
@ -103,7 +106,7 @@
|
|||
<string name="no_uploads_yet">まだ写真をアップロードしていません。</string>
|
||||
<string name="menu_retry_upload">再試行</string>
|
||||
<string name="menu_cancel_upload">キャンセル</string>
|
||||
<string name="share_license_summary">この画像が %1$s ライセンスでアップロードされます。</string>
|
||||
<string name="share_license_summary">この画像は%1$sライセンスのもとにアップロードされます。</string>
|
||||
<string name="media_upload_policy">この画像の投稿に当たり、私はこれが自分自身の作品であり、著作権のあるコンテンツや自撮りは含まれていないと宣言します。</string>
|
||||
<string name="menu_download">ダウンロード</string>
|
||||
<string name="preference_license">既定のライセンス</string>
|
||||
|
|
@ -148,6 +151,7 @@
|
|||
<string name="tutorial_4_subtext">- 題名: シドニー・オペラハウス\n- 説明: 湾の向こうから見たシドニー・オペラハウス\n- カテゴリ: 西側から見たシドニー・オペラハウス、遠くから見たシドニー・オペラハウス</string>
|
||||
<string name="tutorial_4_subtext_1">題名: シドニーのオペラハウス</string>
|
||||
<string name="tutorial_4_subtext_2">説明: シドニーのオペラハウス。湾を挟んで撮影。</string>
|
||||
<string name="tutorial_4_subtext_3">カテゴリ: シドニーオペラハウスの西面、シドニーオペラ遠景</string>
|
||||
<string name="welcome_wikipedia_text">画像を投稿してください。ウィキペディアの記事に彩りを!</string>
|
||||
<string name="welcome_wikipedia_subtext">ウィキペディアの画像はウィキメディア・コモンズに保管されています。</string>
|
||||
<string name="welcome_copyright_text">あなたの画像は世界中の人々が学習する助けになります</string>
|
||||
|
|
@ -167,7 +171,7 @@
|
|||
<string name="title_activity_nearby">近くの場所</string>
|
||||
<string name="no_nearby">付近の場所が見つかりません</string>
|
||||
<string name="warning">警告</string>
|
||||
<string name="file_exists">このファイルが既にコモンズにあります。本当にアップロードしますか?</string>
|
||||
<string name="file_exists">このファイルは既にコモンズにあります。本当にアップロードしますか?</string>
|
||||
<string name="yes">はい</string>
|
||||
<string name="no">いいえ</string>
|
||||
<string name="media_detail_title">タイトル</string>
|
||||
|
|
@ -185,7 +189,7 @@
|
|||
<string name="_2fa_code">2FA コード</string>
|
||||
<string name="number_of_uploads">最近のアップロードファイルに表示する最大件数</string>
|
||||
<string name="maximum_limit">最大限</string>
|
||||
<string name="maximum_limit_alert">500 以上の項目を表示できません</string>
|
||||
<string name="maximum_limit_alert">表示できるのは500件以下です</string>
|
||||
<string name="set_limit">最近のアップロードファイルに表示する最大件数</string>
|
||||
<string name="login_failed_2fa_not_supported">2段階認証は現在サポートされていません。</string>
|
||||
<string name="logout_verification">ログアウトしてもよろしいですか?</string>
|
||||
|
|
@ -226,7 +230,7 @@
|
|||
<string name="nearby_info_menu_wikipedia_article">ウィキペディアの記事</string>
|
||||
<string name="error_while_cache">画像をキャッシュする際のエラー</string>
|
||||
<string name="title_info">ファイル固有の説明的な表題。ファイル名として使われます。平易な言葉を使い、空白を入れることができます。拡張子は含めないでください。</string>
|
||||
<string name="description_info">可能な限りメディアを説明してください:どこで撮られましたか?それは何を示していますか?文脈とは何ですか?物や人を説明してください。容易に推測できない情報、例えば風景の場合の時刻を明らかにする。メディアに珍しいことがある場合は、何が珍しいのかを説明してください。</string>
|
||||
<string name="description_info">可能な限りメディアを説明してください: 撮影地はどこですか? それは何を示していますか? どんな文脈がありますか? 被写体の物や人を説明してください。容易に推測できない情報、例えば風景であれば時刻を明示します。特筆すべき物事が映っている場合は、何が珍しいのかを説明してください。</string>
|
||||
<string name="upload_image_too_dark">この画像は暗すぎますがアップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string>
|
||||
<string name="upload_image_blurry">ピントが合っていませんが、アップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string>
|
||||
<string name="give_permission">権限を付与</string>
|
||||
|
|
@ -255,7 +259,7 @@
|
|||
<string name="nearby_wikipedia">ウィキペディア</string>
|
||||
<string name="nearby_commons">コモンズ</string>
|
||||
<string name="about_rate_us"><u>評価する</u></string>
|
||||
<string name="about_faq"><u>FAQ</u></string>
|
||||
<string name="about_faq"><u>よくある質問</u></string>
|
||||
<string name="welcome_skip_button">チュートリアルをスキップする</string>
|
||||
<string name="no_internet">インターネットに接続していません</string>
|
||||
<string name="internet_established">インターネットに接続しました</string>
|
||||
|
|
@ -276,4 +280,5 @@
|
|||
<string name="image_uploaded_by">アップロードした人: %1$</string>
|
||||
<string name="share_app_title">アプリをシェアする</string>
|
||||
<string name="share_coordinates_not_present">画像の選択中に位置情報を特定できませんでした</string>
|
||||
<string name="error_fetching_nearby_places">付近の場所を取得しようとしてエラーが発生しました。</string>
|
||||
</resources>
|
||||
|
|
|
|||
96
app/src/main/res/values-kum/strings.xml
Normal file
96
app/src/main/res/values-kum/strings.xml
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Authors:
|
||||
* ArslanX
|
||||
-->
|
||||
<resources>
|
||||
<string name="preference_category_appearance">Гёрюнюш</string>
|
||||
<string name="preference_category_general">Ортакъ</string>
|
||||
<string name="bullet">•</string>
|
||||
<string name="menu_settings">Кюйлевлер</string>
|
||||
<string name="username">Къоллавчу аты</string>
|
||||
<string name="password">Чечил</string>
|
||||
<string name="login">Гирмек</string>
|
||||
<string name="forgot_password">Чечилни унутдунгму?</string>
|
||||
<string name="signup">Къайытланмакъ</string>
|
||||
<string name="upload_completed_notification_title">%1$s юкленген!</string>
|
||||
<string name="upload_progress_notification_title_in_progress">%1$s юкленип тура</string>
|
||||
<string name="upload_failed_notification_subtitle">Къарамакъ учун бас</string>
|
||||
<string name="contribution_state_queued">Гезикде</string>
|
||||
<string name="contribution_state_starting">Юклев</string>
|
||||
<string name="menu_from_camera">Сурат алмакъ</string>
|
||||
<string name="menu_nearby">Ювукъда</string>
|
||||
<string name="provider_contributions">Юклевлерим</string>
|
||||
<string name="menu_share">Пайлашмакъ</string>
|
||||
<string name="share_title_hint">Ат</string>
|
||||
<string name="share_description_hint">Тасвир</string>
|
||||
<string name="share_upload_button">Юклев</string>
|
||||
<string name="menu_upload_single">Юклев</string>
|
||||
<string name="menu_save_categories">Сакъламакъ</string>
|
||||
<string name="refresh_button">Янгыртмакъ</string>
|
||||
<string name="display_list_button">Тизме</string>
|
||||
<string name="enable_gps">GPS ишлетмек</string>
|
||||
<string name="contributions_subtitle_zero">Юклевлер ёкъ гьали де</string>
|
||||
<string name="categories_activity_title">Категориялар</string>
|
||||
<string name="title_activity_settings">Кюйлевлер</string>
|
||||
<string name="title_activity_signup">Къайытланмакъ</string>
|
||||
<string name="menu_about">Тасвири</string>
|
||||
<string name="about_credits"><u>Баракаллалар</u></string>
|
||||
<string name="title_activity_about">Тасвири</string>
|
||||
<string name="menu_retry_upload">Такрарламакъ</string>
|
||||
<string name="menu_cancel_upload">Гери алмакъ</string>
|
||||
<string name="menu_download">Юклемек</string>
|
||||
<string name="license_name_cc0">CC0</string>
|
||||
<string name="license_name_cc_by_sa_3_0">CC BY-SA 3.0</string>
|
||||
<string name="license_name_cc_by_sa_3_0_de">CC BY-SA 3.0 (Алмания)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_ee">CC BY-SA 3.0 (Эстония)</string>
|
||||
<string name="license_name_cc_by_3_0">CC BY 3.0</string>
|
||||
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
|
||||
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
|
||||
<string name="license_name_cc_zero">CC Zero</string>
|
||||
<string name="tutorial_4_text">Юклев уьлгю:</string>
|
||||
<string name="welcome_final_button_text">Дюр!</string>
|
||||
<string name="detail_panel_cats_label">Категориялар</string>
|
||||
<string name="detail_panel_cats_loading">Юклев...</string>
|
||||
<string name="detail_panel_cats_none">Бир зат сайланмагъан</string>
|
||||
<string name="detail_description_empty">Тасвири ёкъ</string>
|
||||
<string name="menu_refresh">Янгыртмакъ</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="warning">Буварыв</string>
|
||||
<string name="yes">Дюр</string>
|
||||
<string name="no">Ёкъ</string>
|
||||
<string name="media_detail_title">Ат</string>
|
||||
<string name="media_detail_description">Тасвир</string>
|
||||
<string name="media_detail_author">Ясавчу</string>
|
||||
<string name="media_detail_uploaded_date">Юклев тархы</string>
|
||||
<string name="_2fa_code">2FA код</string>
|
||||
<string name="welcome_image_tulip">Лале</string>
|
||||
<string name="welcome_image_no_selfies">Оьзсуратсыз</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Хош гел Википедиягъа</string>
|
||||
<string name="cancel">Гери алмакъ</string>
|
||||
<string name="navigation_drawer_open">Ачмакъ</string>
|
||||
<string name="navigation_drawer_close">Япмакъ</string>
|
||||
<string name="navigation_item_home">Баш</string>
|
||||
<string name="navigation_item_upload">Юклемек</string>
|
||||
<string name="navigation_item_nearby">Ювукъда</string>
|
||||
<string name="navigation_item_about">Тасвир</string>
|
||||
<string name="navigation_item_settings">Кюйлевлер</string>
|
||||
<string name="navigation_item_logout">Чыкъмакъ</string>
|
||||
<string name="navigation_item_notification">Билдиривлер</string>
|
||||
<string name="navigation_item_featured_images">Сайламлы</string>
|
||||
<string name="no_description_found">тасвири табылмады</string>
|
||||
<string name="nearby_info_menu_wikipedia_article">Википедия макъала</string>
|
||||
<string name="null_url">Янгылыш! Байланыв табылмады</string>
|
||||
<string name="nearby_directions">ЯКЪЛАР</string>
|
||||
<string name="nearby_wikipedia">ВИКИПЕДИЯ</string>
|
||||
<string name="about_rate_us"><u>Къыйматла бизин</u></string>
|
||||
<string name="no_internet">Интернет гиришсиз</string>
|
||||
<string name="internet_established">Интернет гиришли</string>
|
||||
<string name="no_notifications">Билдиривлер ёкъ</string>
|
||||
<string name="about_translate"><u>Таржума этмек</u></string>
|
||||
<string name="about_translate_title">Тиллер</string>
|
||||
<string name="about_translate_cancel">Гери алыв</string>
|
||||
<string name="retry">Такрарламакъ</string>
|
||||
<string name="showcase_view_got_it_button">Тюшюндюм!</string>
|
||||
<string name="no_images_found">Гьеч сурат табылмады!</string>
|
||||
<string name="share_app_title">Уьстевню пайлашмакъ</string>
|
||||
</resources>
|
||||
|
|
@ -55,7 +55,7 @@
|
|||
<string name="categories_activity_title">श्रेणीहरू</string>
|
||||
<string name="title_activity_settings">सेटिङ्गहरू</string>
|
||||
<string name="menu_about">बारेमा</string>
|
||||
<string name="about_license" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">अपाचे लाइसेन्स संस्करण२</a> को अाधारमा खुला स्रोत सफ्टवेयर जारी</string>
|
||||
<string name="about_license">विकिमिडिया कमन्स याप एक स्वतन्त्र स्रोत याप हो। यो याप विकिमिडिया समुदायका अनुदानप्राप्तकर्ताहरू र स्वयंसेवकहरू द्वारा निर्मित एवं प्रबन्धित छ। विकिमीडिया फाउण्डेसन यस यापको निर्माण, विकास र प्रबन्धनमा कुनै पनि प्रकारले संलग्न छैन।</string>
|
||||
<string name="about_improve" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons\">गिटहब</a> मा स्रोत। <a href=\" https://github.com/commons-app/apps-android-commons/issues\">बगजिल्ला</a> मा बग छ।</string>
|
||||
<string name="about_privacy_policy" fuzzy="true"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">गोपनीयता नीति</a></string>
|
||||
<string name="title_activity_about">बारेमा</string>
|
||||
|
|
|
|||
|
|
@ -46,11 +46,7 @@
|
|||
<string name="upload_progress_notification_title_finishing">Завершение загрузки %1$s</string>
|
||||
<string name="upload_failed_notification_title">Загрузка %1$s не удалась</string>
|
||||
<string name="upload_failed_notification_subtitle">Нажмите для просмотра</string>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="one">%1$d файл загружается</item>
|
||||
<item quantity="few">%1$d файла загружается</item>
|
||||
<item quantity="other">%1$d файлов загружается</item>
|
||||
</plurals>
|
||||
<string name="uploads_pending_notification_indicator">%1$d {{PLURAL:%1$d|one=файл загружается|few=файла загружается|файлов загружается}}</string>
|
||||
<string name="title_activity_contributions">Мои недавние загрузки</string>
|
||||
<string name="contribution_state_queued">В очереди</string>
|
||||
<string name="contribution_state_failed">Ошибка загрузки.</string>
|
||||
|
|
@ -115,7 +111,7 @@
|
|||
<string name="no_email_client">Почтовый клиент не установлен</string>
|
||||
<string name="provider_categories">Недавно использованные категории</string>
|
||||
<string name="waiting_first_sync">Ожидание первой синхронизации…</string>
|
||||
<string name="no_uploads_yet">Вы ещё не загрузили ни одной фотографии.</string>
|
||||
<string name="no_uploads_yet">Вы ещё не загрузили ни одного изображения.</string>
|
||||
<string name="menu_retry_upload">Повторить</string>
|
||||
<string name="menu_cancel_upload">Отмена</string>
|
||||
<string name="share_license_summary">Это изображение будет лицензировано под %1$s</string>
|
||||
|
|
@ -123,7 +119,7 @@
|
|||
<string name="menu_download">Скачать</string>
|
||||
<string name="preference_license">Лицензия по умолчанию</string>
|
||||
<string name="use_previous">Использовать предыдущие название/описание</string>
|
||||
<string name="allow_gps">Автоматически получить текущее местоположение</string>
|
||||
<string name="allow_gps">Анализ местоположения</string>
|
||||
<string name="allow_gps_summary">Получить текущее местоположение, чтобы были предложены категории, если изображение не содержит геотегов</string>
|
||||
<string name="preference_theme">Ночной режим</string>
|
||||
<string name="preference_theme_summary">Использовать тёмную тему</string>
|
||||
|
|
@ -148,7 +144,7 @@
|
|||
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
|
||||
<string name="license_name_cc_zero">CC Zero</string>
|
||||
<string name="tutorial_1_text">Викисклад содержит бо́льшую часть изображений, которые используются в Википедии.</string>
|
||||
<string name="tutorial_1_subtext">Ваши изображения помогают образованию людей во всём мире!</string>
|
||||
<string name="tutorial_1_subtext">Ваши изображения могут помочь образованию людей во всём мире!</string>
|
||||
<string name="tutorial_2_text">Пожалуйста, загрузите фотографии, которые были сняты или созданы исключительно вами:</string>
|
||||
<string name="tutorial_2_subtext">Природные объекты (например, цветы, животные, горы)\n• Полезные предметы (например, велосипеды, вокзалы)\n• Известные люди (например, ваш мэр, спортсмены-олимпийцы, которых вы встретили)</string>
|
||||
<string name="tutorial_2_subtext_1">Природные объекты (например, цветы, животные, горы)</string>
|
||||
|
|
@ -166,7 +162,7 @@
|
|||
<string name="tutorial_4_subtext_3">Категории: Sydney Opera House from the west, Sydney Opera House remote views</string>
|
||||
<string name="welcome_wikipedia_text">Загрузите свои изображения. Помогите Википедии оживить статьи!</string>
|
||||
<string name="welcome_wikipedia_subtext">Изображения в Википедии хранятся на Викискладе.</string>
|
||||
<string name="welcome_copyright_text">Ваши изображения помогают образованию людей во всём мире.</string>
|
||||
<string name="welcome_copyright_text">Ваши изображения могут помочь образованию людей во всём мире.</string>
|
||||
<string name="welcome_copyright_subtext">Избегайте материалов, защищённых авторским правом, например, найденных в Интернете, изображений плакатов, книжных обложек и т.п.</string>
|
||||
<string name="welcome_final_text">Вам это понятно?</string>
|
||||
<string name="welcome_final_button_text">Да!</string>
|
||||
|
|
@ -211,7 +207,7 @@
|
|||
<string name="commons_facebook">Facebook-страница Commons</string>
|
||||
<string name="commons_github">Исходные коды Commons на гитхабе</string>
|
||||
<string name="background_image">Фоновое изображение</string>
|
||||
<string name="mediaimage_failed">Ошибка медиаизображения</string>
|
||||
<string name="mediaimage_failed">Ошибка медиафайла</string>
|
||||
<string name="no_image_found">Изображение не найдено</string>
|
||||
<string name="upload_image">Загрузить изображение</string>
|
||||
<string name="welcome_image_mount_zao">Гора Зао</string>
|
||||
|
|
@ -246,7 +242,7 @@
|
|||
<string name="description_info">Пожалуйста, подробно опишите загружаемый файл: где он был снят? что на нём изображено? каков его контекст? Пожалуйста опишите изображённых персон или объекты. Добавьте информацию, о которой нельзя легко догадаться, например, время суток, когда снимался файл. Если снято что-то необычное, постарайтесь пояснить, что именно в этом необычного.</string>
|
||||
<string name="upload_image_too_dark">Это изображение слишком тёмное. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность.</string>
|
||||
<string name="upload_image_blurry">Это изображение размыто. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность.</string>
|
||||
<string name="give_permission">Дать разрешение</string>
|
||||
<string name="give_permission">Разрешить</string>
|
||||
<string name="use_external_storage">Использовать внешнее хранилище</string>
|
||||
<string name="use_external_storage_summary">Сохранять изображения, сделанные с помощью встроенной камеры на устройстве</string>
|
||||
<string name="login_to_your_account">Войдите в свою учётную запись</string>
|
||||
|
|
@ -294,4 +290,5 @@
|
|||
<string name="image_uploaded_by">Загружено участником %1$s</string>
|
||||
<string name="share_app_title">Поделиться приложением</string>
|
||||
<string name="share_coordinates_not_present">Во время выбора изображения не были указаны координаты</string>
|
||||
<string name="error_fetching_nearby_places">Ошибка получения мест поблизости</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -280,4 +280,5 @@
|
|||
<string name="image_uploaded_by">Uppladdad av: %1$s</string>
|
||||
<string name="share_app_title">Dela app</string>
|
||||
<string name="share_coordinates_not_present">Koordinater specificerades inte vid bildvalet</string>
|
||||
<string name="error_fetching_nearby_places">Fel uppstod när platser i närheten hämtades.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -280,4 +280,5 @@
|
|||
<string name="image_uploaded_by">Yükleyen: %1$s</string>
|
||||
<string name="share_app_title">Uygulamayı Paylaş</string>
|
||||
<string name="share_coordinates_not_present">Koordinatlar görüntü seçimi sırasında belirlenmedi</string>
|
||||
<string name="error_fetching_nearby_places">Yakındaki yerler alınırken hata oluştu.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@
|
|||
<string name="tutorial_2_subtext_2">Корисні об\'єкти (велосипеди, залізничні станції)</string>
|
||||
<string name="tutorial_2_subtext_3">Відомі люди (ваш мер, спортсмен-олімпієць, якого ви зустріли)</string>
|
||||
<string name="tutorial_3_text">Будь ласка, НЕ завантажуйте:</string>
|
||||
<string name="tutorial_3_subtext">u2022 Селфі або фото своїх друзів \nu2022 Зображення, які Ви завантажили з інтернету \nu2022 Скріншоти патентованих програм</string>
|
||||
<string name="tutorial_3_subtext">- Селфі або фото своїх друзів \n- Зображення, які Ви завантажили з інтернету \n- Скріншоти патентованих програм</string>
|
||||
<string name="tutorial_3_subtext_1">Селфі чи фото ваших друзів</string>
|
||||
<string name="tutorial_3_subtext_2">Зображення, які ви завантажили з інтернету</string>
|
||||
<string name="tutorial_3_subtext_3">Знімки екрану пропрієтарних програм</string>
|
||||
|
|
@ -165,6 +165,7 @@
|
|||
<string name="welcome_copyright_subtext">Уникайте захищених авторським правом матеріалів, знайдених в Інтернеті, а також зображень плакатів, обкладинок книг і т. п.</string>
|
||||
<string name="welcome_final_text">Ви це зрозуміли?</string>
|
||||
<string name="welcome_final_button_text">Так!</string>
|
||||
<string name="welcome_help_button_text"/>
|
||||
<string name="detail_panel_cats_label">Категорії</string>
|
||||
<string name="detail_panel_cats_loading">Завантаження…</string>
|
||||
<string name="detail_panel_cats_none">Нічого не обрано</string>
|
||||
|
|
@ -186,7 +187,7 @@
|
|||
<string name="media_detail_description">Опис</string>
|
||||
<string name="media_detail_description_explanation">Сюди потрапляє опис медіафайлу. Він потенційно може бути досить довгим і розтягнутися на декілька рядків. Однак ми сподіваємось, що він виглядатиме гарно.</string>
|
||||
<string name="media_detail_author">Автор</string>
|
||||
<string name="media_detail_author_explanation">Тут вказується ім\'я автора вибраного зображеня</string>
|
||||
<string name="media_detail_author_explanation">Тут вказується ім\'я автора вибраного зображення</string>
|
||||
<string name="media_detail_uploaded_date">Дата завантаження</string>
|
||||
<string name="media_detail_license">Ліцензія</string>
|
||||
<string name="media_detail_coordinates">Координати</string>
|
||||
|
|
@ -202,7 +203,7 @@
|
|||
<string name="logout_verification">Ви справді хочете вийти із системи?</string>
|
||||
<string name="commons_logo">Логотип Вікісховища</string>
|
||||
<string name="commons_website">Веб-сайт Commons</string>
|
||||
<string name="commons_facebook">Фейсбук сторінка Commons</string>
|
||||
<string name="commons_facebook">Facebook-сторінка Commons</string>
|
||||
<string name="commons_github">Програмний код Commons на GitHub</string>
|
||||
<string name="background_image">Фонове зображення</string>
|
||||
<string name="mediaimage_failed">Помилка медіазображення</string>
|
||||
|
|
@ -237,15 +238,15 @@
|
|||
<string name="nearby_info_menu_wikipedia_article">Стаття Вікіпедії</string>
|
||||
<string name="error_while_cache">Помилка кешування зображень</string>
|
||||
<string name="title_info">Унікальна описова назва файлу. Ви можете використовувати простий текст з пробілами. Не вказуйте розширення файлу</string>
|
||||
<string name="description_info">Будь ласка, докладно опишіть файл: де його було зроблено? що на ньому зображено? який контекст? Будь ласка, опишіть об\'єкти чи осіб. Додайте інформацію, яку не можна легко здогадатися, наприклад, пору доби для фотографії пейзажу. Якщо зображено щось незвичайне, постарайтеся пояснити, що робить його незвичайним.</string>
|
||||
<string name="description_info">Будь ласка, докладно опишіть файл: де його було зроблено? що на ньому зображено? який контекст? Будь ласка, опишіть об\'єкти чи осіб. Додайте інформацію, яку не можна легко здогадатися, наприклад, пору доби для фотографії пейзажу. Якщо зображено щось незвичайне, спробуйте пояснити, що робить його незвичайним.</string>
|
||||
<string name="upload_image_too_dark">Це зображення надто темне. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність.</string>
|
||||
<string name="upload_image_blurry">Це зображення розмите. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність.</string>
|
||||
<string name="give_permission">Надати дозвіл</string>
|
||||
<string name="use_external_storage">Використовувати зовнішнє сховище</string>
|
||||
<string name="use_external_storage_summary">Зберігати зображення, виконані вбудованою камерою Вашого пристрою</string>
|
||||
<string name="login_to_your_account">Увійдіть у свій обліковий запис</string>
|
||||
<string name="send_log_file">Надіслати лог-файл</string>
|
||||
<string name="send_log_file_description">Надіслати лог-файл розробникам електронною поштою</string>
|
||||
<string name="send_log_file">Надіслати файл журналу</string>
|
||||
<string name="send_log_file_description">Надіслати файл журналу розробникам електронною поштою</string>
|
||||
<string name="no_web_browser">Не знайдено браузера, щоб відкрити посилання</string>
|
||||
<string name="null_url">Помилка! Посилання не знайдено</string>
|
||||
<string name="nominate_deletion">Номінувати на вилучення</string>
|
||||
|
|
@ -257,9 +258,9 @@
|
|||
<string name="location_permission_rationale_nearby">Потрібний дозвіл для показу списку місць поблизу</string>
|
||||
<string name="get_directions">Показати на мапі у зовнішній програмі</string>
|
||||
<string name="read_article">ЧИТАТИ СТАТТЮ</string>
|
||||
<string name="notifications_welcome">Вітаємо у Wikimedia Commons, %1$s! Раді вас бачити.</string>
|
||||
<string name="notifications_welcome">Вітаємо у Вікісховищі, %1$s! Раді вас бачити.</string>
|
||||
<string name="notifications_talk_page_message">%1$s залишив повідомлення на вашій сторінці обговорення</string>
|
||||
<string name="notifications_thank_you_edit">Дякуємо за правку</string>
|
||||
<string name="notifications_thank_you_edit">Дякуємо за редагування</string>
|
||||
<string name="notifications_mention">%1$s згадав вас на %2$s.</string>
|
||||
<string name="toggle_view_button">Перемкнути режим перегляду</string>
|
||||
<string name="nearby_directions">НАПРЯМКИ</string>
|
||||
|
|
@ -279,4 +280,14 @@
|
|||
<string name="about_translate_proceed">Виконується</string>
|
||||
<string name="about_translate_cancel">Скасувати</string>
|
||||
<string name="retry">Повторити</string>
|
||||
<string name="showcase_view_got_it_button">Зрозуміло</string>
|
||||
<string name="showcase_view_whole_nearby_activity">Це місця поблизу, про які є статті Вікіпедії, але які потребують ілюстрацій</string>
|
||||
<string name="showcase_view_list_icon">Натискання цієї кнопки згенерує список таких місць</string>
|
||||
<string name="showcase_view_plus_fab">Ви можете завантажити зображення для любого з цих місць, зробивши знімок камерою або вибравши зображення з галереї</string>
|
||||
<string name="no_images_found">Зображень не знайдено!</string>
|
||||
<string name="error_loading_images">Сталася помилка при завантаженні зображень.</string>
|
||||
<string name="image_uploaded_by">Завантажено: %1$s</string>
|
||||
<string name="share_app_title">Поділитися програмою</string>
|
||||
<string name="share_coordinates_not_present">Під час вибору зображення не були вказані координати</string>
|
||||
<string name="error_fetching_nearby_places">Помилка отримання місць поблизу.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -46,8 +46,7 @@
|
|||
<string name="add_title_toast">Please provide a title for this file</string>
|
||||
<string name="share_description_hint">Description</string>
|
||||
<string name="login_failed_network">Unable to login - network failure</string>
|
||||
<string name="login_failed_username">Unable to login - please check your username</string>
|
||||
<string name="login_failed_password">Unable to login - please check your password</string>
|
||||
<string name="login_failed_wrong_credentials">Unable to login - please check your username and password</string>
|
||||
<string name="login_failed_throttled">Too many unsuccessful attempts. Please try again in a few minutes.</string>
|
||||
<string name="login_failed_blocked">Sorry, this user has been blocked on Commons</string>
|
||||
<string name="login_failed_2fa_needed">You must provide your two factor authentication code.</string>
|
||||
|
|
|
|||
|
|
@ -39,6 +39,11 @@ SELECT
|
|||
# Get emoji
|
||||
OPTIONAL { ?classId wdt:P487 ?emoji0. }
|
||||
OPTIONAL { ?classId wdt:P279*/wdt:P487 ?emoji1. }
|
||||
|
||||
OPTIONAL {
|
||||
?wikipediaArticle schema:about ?item ;
|
||||
schema:isPartOf <https://${LANG}.wikipedia.org/> .
|
||||
}
|
||||
OPTIONAL {
|
||||
?wikipediaArticle schema:about ?item ;
|
||||
schema:isPartOf <https://en.wikipedia.org/> .
|
||||
|
|
|
|||
|
|
@ -14,17 +14,17 @@
|
|||
# org.gradle.parallel=true
|
||||
#Thu Mar 01 15:28:48 IST 2018
|
||||
systemProp.http.proxyPort=0
|
||||
compileSdkVersion=android-26
|
||||
compileSdkVersion=android-27
|
||||
android.useDeprecatedNdk=true
|
||||
BUTTERKNIFE_VERSION=8.6.0
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
buildToolsVersion=26.0.2
|
||||
targetSdkVersion=25
|
||||
buildToolsVersion=27.0.0
|
||||
targetSdkVersion=27
|
||||
|
||||
#TODO: Temporary disabled. https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#aapt2
|
||||
#Refer to PR: https://github.com/commons-app/apps-android-commons/pull/932
|
||||
android.enableAapt2=false
|
||||
SUPPORT_LIB_VERSION=26.0.2
|
||||
SUPPORT_LIB_VERSION=27.1.1
|
||||
minSdkVersion=15
|
||||
systemProp.http.proxyHost=
|
||||
LEAK_CANARY=1.5.4
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue