mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-28 13:23:58 +01:00
* Feature/refractor uploads [WIP] (#2887) * Fix duplicate param information (#2515) * Bug fix issue #2476 (#2526) * Added wikidataEntityID in all db versions, handled db.execSql via method runQuery * Versioning and changelog for v2.10.2 (#2531) * Update changelog.md * Versioning for v2.10.2 * Update changelog.md * Bugfix/issue 2580 (#2584) * Corrected string placedholders in certain string files * Corrected string placedholders in certain string files[Bug fix #2580] * Bug Fix #2585 (#2647) * Bug Fix #2585 * Added null checks on view in SearchImageFragment when updating views from external sources * Disposed the disposables in SearchActivity and SearchImageFragment when no longer in active lifecycle * use FragmentUtils to verify fragment active state * Bug Fix issue #2648 (#2678) * Bug Fix issue #2648 * Handled external storage permission before file download * * Removed redudant check for permission in MediaDetailPagerFragment (Dexter already does that) * Removed duplicate code in PermissionUtil$checkPermissionsAndPerformAction, used the existing function with conditional extra parameters * string name typo correction * BugFix issue #2652 (#2706) * Addded null check on bookmark before operating on it * BugFix issue #2711 (#2712) * Added null checks in OkHttpJsonApiClient$searchImages MwQueryResponse * BugFix #2718 (#2719) * Handled null auth cookies * Fix #2791: NPE when nominating for deletion and leaving screen (#2792) * Bug Fix issue #2789 (#2790) * Handled Illegal State Exception for non existent appropriate view parents in ViewUtils$showShortSnackbar * BugFix #2720 (#2831) BugFix deprecated licenes #2720 * ui fixes, wip, upload * *Issue #2886, BugFix #2832[wip] * updated UploadActivity code * modified ui * Updated UploadPresenterTest * * updated interfaces names to follow names suffixed with Contract * added test cases * card view elevation * view pager disabled swipe * bug fix, duplicate image * used existing non-swipable view pager * Avoid image view resize with keyboard, added adjustPan and stateVisible as softinputMode for UploadActivity * retain UploadBaseFragment instances on orientation changes * * Added test cases for UploadMediaPresenter * Injected io and main thread schedulers * categories presenter test cased wip * Added CategoriesPresenter test * * Added the logic to show open map (with to be uploaded image's coordinates while uploading image) * codacy suggested changes * added java docs * Added travis_wait fot android-wait-for-emulator * ranamed interface onResponseCallback to Callback * * Added api to delete picture in UploadModel * cleanUp in UploadModel. once upload has been initiated * Removed unused methods from UploadModel and the corresponding test class * * Added tests for UploadPresenter * Travis suggested changes * Addded copy previous title and description * * Made the upload add descriptions visible when keyboard visible * add description request focus only when user manually requests it * Added JavaDocs, review suggested changes * Fix dagger injection * use DialogUtil to show info in descriptions * use activity context for DialogUtil * Minor changes * Bug fix, reduced the add description edit text clickable bound (#2973) * Bugfix/uploads (#3000) * merged with master * BugFix IllegalStateException * setRetainState(true), not required with FragmentStatePagerAdapter * Increase the ViewPager's Offscreen Limit, we want all the fragments to be active * BugFix, clear selected categoris for previous upload session * Clear Selected Categories * Addded JavaDocs for CategoriesModel * Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java * Added class level JavaDoc UploadRemoteDataSource * Added class level JavaDoc for UploadRepository * Added JavaDocs for ThumbnailsAdapter * Added JavaDocs for MediaLicensePresenter, CategoriesPresenter * Removed null check on category query * Show default catgeories based on image title and gps location when category text empty * Allow search for empty category search * Attached image scale listener to upload media image * Bug fix, reduced the add description edit text clickable bound * Fix memory leak (#3001) * Bugfix/uploads (#3002) * merged with master * BugFix IllegalStateException * setRetainState(true), not required with FragmentStatePagerAdapter * Increase the ViewPager's Offscreen Limit, we want all the fragments to be active * BugFix, clear selected categoris for previous upload session * Clear Selected Categories * Addded JavaDocs for CategoriesModel * Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java * Added class level JavaDoc UploadRemoteDataSource * Added class level JavaDoc for UploadRepository * Added JavaDocs for ThumbnailsAdapter * Added JavaDocs for MediaLicensePresenter, CategoriesPresenter * Removed null check on category query * Show default catgeories based on image title and gps location when category text empty * Allow search for empty category search * Attached image scale listener to upload media image * Bug fix, reduced the add description edit text clickable bound * Added tooltip in Title in UploadMediaFragment * BugFix recent categories * Updated test methods * Bugfix/uploads (#3011) * merged with master * BugFix IllegalStateException * setRetainState(true), not required with FragmentStatePagerAdapter * Increase the ViewPager's Offscreen Limit, we want all the fragments to be active * BugFix, clear selected categoris for previous upload session * Clear Selected Categories * Addded JavaDocs for CategoriesModel * Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java * Added class level JavaDoc UploadRemoteDataSource * Added class level JavaDoc for UploadRepository * Added JavaDocs for ThumbnailsAdapter * Added JavaDocs for MediaLicensePresenter, CategoriesPresenter * Removed null check on category query * Show default catgeories based on image title and gps location when category text empty * Allow search for empty category search * Attached image scale listener to upload media image * Bug fix, reduced the add description edit text clickable bound * Added tooltip in Title in UploadMediaFragment * BugFix recent categories * Updated test methods * Avoid memory leak, free the adpater in MediaLicenseFragment.onDestroyView * bugfix/uploads (#3012) * merged with master * BugFix IllegalStateException * setRetainState(true), not required with FragmentStatePagerAdapter * Increase the ViewPager's Offscreen Limit, we want all the fragments to be active * BugFix, clear selected categoris for previous upload session * Clear Selected Categories * Addded JavaDocs for CategoriesModel * Code Formatting in app/src/main/java/fr/free/nrw/commons/upload/UploadModel.java * Added class level JavaDoc UploadRemoteDataSource * Added class level JavaDoc for UploadRepository * Added JavaDocs for ThumbnailsAdapter * Added JavaDocs for MediaLicensePresenter, CategoriesPresenter * Removed null check on category query * Show default catgeories based on image title and gps location when category text empty * Allow search for empty category search * Attached image scale listener to upload media image * Bug fix, reduced the add description edit text clickable bound * Added tooltip in Title in UploadMediaFragment * BugFix recent categories * Updated test methods * Avoid memory leak, free the adpater in MediaLicenseFragment.onDestroyView * BugFix Illegal State Exception in ViewpPagerAdapter * Remove irrelevant comment * merge conflict with strings (#3016)
187 lines
6.9 KiB
Java
187 lines
6.9 KiB
Java
package fr.free.nrw.commons;
|
|
|
|
import android.content.ClipData;
|
|
import android.content.ClipboardManager;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.graphics.Bitmap;
|
|
import android.net.Uri;
|
|
import android.view.View;
|
|
import android.widget.Toast;
|
|
|
|
import org.wikipedia.dataclient.WikiSite;
|
|
import org.wikipedia.page.PageTitle;
|
|
import fr.free.nrw.commons.location.LatLng;
|
|
import fr.free.nrw.commons.utils.ViewUtil;
|
|
|
|
import java.util.Locale;
|
|
import java.util.regex.Pattern;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.browser.customtabs.CustomTabsIntent;
|
|
import androidx.core.content.ContextCompat;
|
|
import fr.free.nrw.commons.settings.Prefs;
|
|
import timber.log.Timber;
|
|
|
|
import static android.widget.Toast.LENGTH_SHORT;
|
|
|
|
public class Utils {
|
|
|
|
public static PageTitle getPageTitle(@NonNull String title) {
|
|
return new PageTitle(title, new WikiSite(BuildConfig.COMMONS_URL));
|
|
}
|
|
|
|
/**
|
|
* Generates licence name with given ID
|
|
* @param license License ID
|
|
* @return Name of license
|
|
*/
|
|
public static int licenseNameFor(String license) {
|
|
switch (license) {
|
|
case Prefs.Licenses.CC_BY_3:
|
|
return R.string.license_name_cc_by;
|
|
case Prefs.Licenses.CC_BY_4:
|
|
return R.string.license_name_cc_by_four;
|
|
case Prefs.Licenses.CC_BY_SA_3:
|
|
return R.string.license_name_cc_by_sa;
|
|
case Prefs.Licenses.CC_BY_SA_4:
|
|
return R.string.license_name_cc_by_sa_four;
|
|
case Prefs.Licenses.CC0:
|
|
return R.string.license_name_cc0;
|
|
}
|
|
throw new IllegalStateException("Unrecognized license value: " + license);
|
|
}
|
|
|
|
/**
|
|
* Generates license url with given ID
|
|
* @param license License ID
|
|
* @return Url of license
|
|
*/
|
|
|
|
|
|
@NonNull
|
|
public static String licenseUrlFor(String license) {
|
|
switch (license) {
|
|
case Prefs.Licenses.CC_BY_3:
|
|
return "https://creativecommons.org/licenses/by/3.0/";
|
|
case Prefs.Licenses.CC_BY_4:
|
|
return "https://creativecommons.org/licenses/by/4.0/";
|
|
case Prefs.Licenses.CC_BY_SA_3:
|
|
return "https://creativecommons.org/licenses/by-sa/3.0/";
|
|
case Prefs.Licenses.CC_BY_SA_4:
|
|
return "https://creativecommons.org/licenses/by-sa/4.0/";
|
|
case Prefs.Licenses.CC0:
|
|
return "https://creativecommons.org/publicdomain/zero/1.0/";
|
|
default:
|
|
throw new IllegalStateException("Unrecognized license value: " + license);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds extension to filename. Converts to .jpg if system provides .jpeg, adds .jpg if no extension detected
|
|
* @param title File name
|
|
* @param extension Correct extension
|
|
* @return File with correct extension
|
|
*/
|
|
public static String fixExtension(String title, String extension) {
|
|
Pattern jpegPattern = Pattern.compile("\\.jpeg$", Pattern.CASE_INSENSITIVE);
|
|
|
|
// People are used to ".jpg" more than ".jpeg" which the system gives us.
|
|
if (extension != null && extension.toLowerCase(Locale.ENGLISH).equals("jpeg")) {
|
|
extension = "jpg";
|
|
}
|
|
title = jpegPattern.matcher(title).replaceFirst(".jpg");
|
|
if (extension != null && !title.toLowerCase(Locale.getDefault())
|
|
.endsWith("." + extension.toLowerCase(Locale.ENGLISH))) {
|
|
title += "." + extension;
|
|
}
|
|
|
|
// If extension is still null, make it jpg. (Hotfix for https://github.com/commons-app/apps-android-commons/issues/228)
|
|
// If title has an extension in it, if won't be true
|
|
if (extension == null && title.lastIndexOf(".")<=0) {
|
|
extension = "jpg";
|
|
title += "." + extension;
|
|
}
|
|
|
|
return title;
|
|
}
|
|
|
|
/**
|
|
* Launches intent to rate app
|
|
* @param context
|
|
*/
|
|
public static void rateApp(Context context) {
|
|
final String appPackageName = BuildConfig.class.getPackage().getName();
|
|
try {
|
|
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
|
|
}
|
|
catch (android.content.ActivityNotFoundException anfe) {
|
|
handleWebUrl(context, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Opens Custom Tab Activity with in-app browser for the specified URL.
|
|
* Launches intent for web URL
|
|
* @param context
|
|
* @param url
|
|
*/
|
|
public static void handleWebUrl(Context context, Uri url) {
|
|
Timber.d("Launching web url %s", url.toString());
|
|
Intent browserIntent = new Intent(Intent.ACTION_VIEW, url);
|
|
if (browserIntent.resolveActivity(context.getPackageManager()) == null) {
|
|
Toast toast = Toast.makeText(context, context.getString(R.string.no_web_browser), LENGTH_SHORT);
|
|
toast.show();
|
|
return;
|
|
}
|
|
|
|
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
|
builder.setToolbarColor(ContextCompat.getColor(context, R.color.primaryColor));
|
|
builder.setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.primaryDarkColor));
|
|
builder.setExitAnimations(context, android.R.anim.slide_in_left, android.R.anim.slide_out_right);
|
|
CustomTabsIntent customTabsIntent = builder.build();
|
|
// Clear previous browser tasks, so that back/exit buttons work as intended.
|
|
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
|
customTabsIntent.launchUrl(context, url);
|
|
}
|
|
|
|
/**
|
|
* Util function to handle geo coordinates
|
|
* It no longer depends on google maps and any app capable of handling the map intent can handle it
|
|
* @param context
|
|
* @param latLng
|
|
*/
|
|
public static void handleGeoCoordinates(Context context, LatLng latLng) {
|
|
Intent mapIntent = new Intent(Intent.ACTION_VIEW, latLng.getGmmIntentUri());
|
|
if (mapIntent.resolveActivity(context.getPackageManager()) != null) {
|
|
context.startActivity(mapIntent);
|
|
} else {
|
|
ViewUtil.showShortToast(context, context.getString(R.string.map_application_missing));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* To take screenshot of the screen and return it in Bitmap format
|
|
*
|
|
* @param view
|
|
* @return
|
|
*/
|
|
public static Bitmap getScreenShot(View view) {
|
|
View screenView = view.getRootView();
|
|
screenView.setDrawingCacheEnabled(true);
|
|
Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
|
|
screenView.setDrawingCacheEnabled(false);
|
|
return bitmap;
|
|
}
|
|
|
|
/*
|
|
*Copies the content to the clipboard
|
|
*
|
|
*/
|
|
public static void copy(String label,String text, Context context){
|
|
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
|
ClipData clip = ClipData.newPlainText(label, text);
|
|
clipboard.setPrimaryClip(clip);
|
|
}
|
|
|
|
}
|