mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +01:00
Merge branch 'commons-app:main' into make-it-smoother-to-switch-between-nearby-and-explore-maps
This commit is contained in:
commit
e1aeb0285e
3 changed files with 211 additions and 188 deletions
|
|
@ -1,187 +0,0 @@
|
||||||
package fr.free.nrw.commons;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.Spinner;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import fr.free.nrw.commons.databinding.ActivityAboutBinding;
|
|
||||||
import fr.free.nrw.commons.theme.BaseActivity;
|
|
||||||
import fr.free.nrw.commons.utils.ConfigUtils;
|
|
||||||
import fr.free.nrw.commons.utils.DialogUtil;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents about screen of this app
|
|
||||||
*/
|
|
||||||
public class AboutActivity extends BaseActivity {
|
|
||||||
|
|
||||||
/*
|
|
||||||
This View Binding class is auto-generated for each xml file. The format is usually the name
|
|
||||||
of the file with PascalCasing (The underscore characters will be ignored).
|
|
||||||
More information is available at https://developer.android.com/topic/libraries/view-binding
|
|
||||||
*/
|
|
||||||
private ActivityAboutBinding binding;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method helps in the creation About screen
|
|
||||||
*
|
|
||||||
* @param savedInstanceState Data bundle
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@SuppressLint("StringFormatInvalid")
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Instead of just setting the view with the xml file. We need to use View Binding class.
|
|
||||||
*/
|
|
||||||
binding = ActivityAboutBinding.inflate(getLayoutInflater());
|
|
||||||
final View view = binding.getRoot();
|
|
||||||
setContentView(view);
|
|
||||||
|
|
||||||
setSupportActionBar(binding.toolbarBinding.toolbar);
|
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
|
||||||
final String aboutText = getString(R.string.about_license);
|
|
||||||
/*
|
|
||||||
We can then access all the views by just using the id names like this.
|
|
||||||
camelCasing is used with underscore characters being ignored.
|
|
||||||
*/
|
|
||||||
binding.aboutLicense.setHtmlText(aboutText);
|
|
||||||
|
|
||||||
@SuppressLint("StringFormatMatches")
|
|
||||||
String improveText = String.format(getString(R.string.about_improve), Urls.NEW_ISSUE_URL);
|
|
||||||
binding.aboutImprove.setHtmlText(improveText);
|
|
||||||
binding.aboutVersion.setText(ConfigUtils.getVersionNameWithSha(getApplicationContext()));
|
|
||||||
|
|
||||||
Utils.setUnderlinedText(binding.aboutFaq, R.string.about_faq, getApplicationContext());
|
|
||||||
Utils.setUnderlinedText(binding.aboutRateUs, R.string.about_rate_us, getApplicationContext());
|
|
||||||
Utils.setUnderlinedText(binding.aboutUserGuide, R.string.user_guide, getApplicationContext());
|
|
||||||
Utils.setUnderlinedText(binding.aboutPrivacyPolicy, R.string.about_privacy_policy, getApplicationContext());
|
|
||||||
Utils.setUnderlinedText(binding.aboutTranslate, R.string.about_translate, getApplicationContext());
|
|
||||||
Utils.setUnderlinedText(binding.aboutCredits, R.string.about_credits, getApplicationContext());
|
|
||||||
|
|
||||||
/*
|
|
||||||
To set listeners, we can create a separate method and use lambda syntax.
|
|
||||||
*/
|
|
||||||
binding.facebookLaunchIcon.setOnClickListener(this::launchFacebook);
|
|
||||||
binding.githubLaunchIcon.setOnClickListener(this::launchGithub);
|
|
||||||
binding.websiteLaunchIcon.setOnClickListener(this::launchWebsite);
|
|
||||||
binding.aboutRateUs.setOnClickListener(this::launchRatings);
|
|
||||||
binding.aboutCredits.setOnClickListener(this::launchCredits);
|
|
||||||
binding.aboutPrivacyPolicy.setOnClickListener(this::launchPrivacyPolicy);
|
|
||||||
binding.aboutUserGuide.setOnClickListener(this::launchUserGuide);
|
|
||||||
binding.aboutFaq.setOnClickListener(this::launchFrequentlyAskedQuesions);
|
|
||||||
binding.aboutTranslate.setOnClickListener(this::launchTranslate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onSupportNavigateUp() {
|
|
||||||
onBackPressed();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchFacebook(View view) {
|
|
||||||
Intent intent;
|
|
||||||
try {
|
|
||||||
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(Urls.FACEBOOK_APP_URL));
|
|
||||||
intent.setPackage(Urls.FACEBOOK_PACKAGE_NAME);
|
|
||||||
startActivity(intent);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Utils.handleWebUrl(this, Uri.parse(Urls.FACEBOOK_WEB_URL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchGithub(View view) {
|
|
||||||
Intent intent;
|
|
||||||
try {
|
|
||||||
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(Urls.GITHUB_REPO_URL));
|
|
||||||
intent.setPackage(Urls.GITHUB_PACKAGE_NAME);
|
|
||||||
startActivity(intent);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Utils.handleWebUrl(this, Uri.parse(Urls.GITHUB_REPO_URL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchWebsite(View view) {
|
|
||||||
Utils.handleWebUrl(this, Uri.parse(Urls.WEBSITE_URL));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchRatings(View view){
|
|
||||||
Utils.rateApp(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchCredits(View view) {
|
|
||||||
Utils.handleWebUrl(this, Uri.parse(Urls.CREDITS_URL));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchUserGuide(View view) {
|
|
||||||
Utils.handleWebUrl(this, Uri.parse(Urls.USER_GUIDE_URL));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchPrivacyPolicy(View view) {
|
|
||||||
Utils.handleWebUrl(this, Uri.parse(BuildConfig.PRIVACY_POLICY_URL));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchFrequentlyAskedQuesions(View view) {
|
|
||||||
Utils.handleWebUrl(this, Uri.parse(Urls.FAQ_URL));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
MenuInflater inflater = getMenuInflater();
|
|
||||||
inflater.inflate(R.menu.menu_about, menu);
|
|
||||||
return super.onCreateOptionsMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.share_app_icon:
|
|
||||||
String shareText = String.format(getString(R.string.share_text), Urls.PLAY_STORE_URL_PREFIX + this.getPackageName());
|
|
||||||
Intent sendIntent = new Intent();
|
|
||||||
sendIntent.setAction(Intent.ACTION_SEND);
|
|
||||||
sendIntent.putExtra(Intent.EXTRA_TEXT, shareText);
|
|
||||||
sendIntent.setType("text/plain");
|
|
||||||
startActivity(Intent.createChooser(sendIntent, getString(R.string.share_via)));
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void launchTranslate(View view) {
|
|
||||||
@NonNull List<String> sortedLocalizedNamesRef = CommonsApplication.getInstance().getLanguageLookUpTable().getCanonicalNames();
|
|
||||||
Collections.sort(sortedLocalizedNamesRef);
|
|
||||||
final ArrayAdapter<String> languageAdapter = new ArrayAdapter<>(AboutActivity.this,
|
|
||||||
android.R.layout.simple_spinner_dropdown_item, sortedLocalizedNamesRef);
|
|
||||||
final Spinner spinner = new Spinner(AboutActivity.this);
|
|
||||||
spinner.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
|
|
||||||
spinner.setAdapter(languageAdapter);
|
|
||||||
spinner.setGravity(17);
|
|
||||||
spinner.setPadding(50,0,0,0);
|
|
||||||
|
|
||||||
Runnable positiveButtonRunnable = () -> {
|
|
||||||
String langCode = CommonsApplication.getInstance().getLanguageLookUpTable().getCodes().get(spinner.getSelectedItemPosition());
|
|
||||||
Utils.handleWebUrl(AboutActivity.this, Uri.parse(Urls.TRANSLATE_WIKI_URL + langCode));
|
|
||||||
};
|
|
||||||
DialogUtil.showAlertDialog(this,
|
|
||||||
getString(R.string.about_translate_title),
|
|
||||||
getString(R.string.about_translate_message),
|
|
||||||
getString(R.string.about_translate_proceed),
|
|
||||||
getString(R.string.about_translate_cancel),
|
|
||||||
positiveButtonRunnable,
|
|
||||||
() -> {},
|
|
||||||
spinner
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
209
app/src/main/java/fr/free/nrw/commons/AboutActivity.kt
Normal file
209
app/src/main/java/fr/free/nrw/commons/AboutActivity.kt
Normal file
|
|
@ -0,0 +1,209 @@
|
||||||
|
package fr.free.nrw.commons
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.ArrayAdapter
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.Spinner
|
||||||
|
import fr.free.nrw.commons.CommonsApplication.Companion.instance
|
||||||
|
import fr.free.nrw.commons.databinding.ActivityAboutBinding
|
||||||
|
import fr.free.nrw.commons.theme.BaseActivity
|
||||||
|
import fr.free.nrw.commons.utils.ConfigUtils.getVersionNameWithSha
|
||||||
|
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
|
||||||
|
import java.util.Collections
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents about screen of this app
|
||||||
|
*/
|
||||||
|
class AboutActivity : BaseActivity() {
|
||||||
|
/*
|
||||||
|
This View Binding class is auto-generated for each xml file. The format is usually the name
|
||||||
|
of the file with PascalCasing (The underscore characters will be ignored).
|
||||||
|
More information is available at https://developer.android.com/topic/libraries/view-binding
|
||||||
|
*/
|
||||||
|
private var binding: ActivityAboutBinding? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method helps in the creation About screen
|
||||||
|
*
|
||||||
|
* @param savedInstanceState Data bundle
|
||||||
|
*/
|
||||||
|
@SuppressLint("StringFormatInvalid") //TODO:
|
||||||
|
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Instead of just setting the view with the xml file. We need to use View Binding class.
|
||||||
|
*/
|
||||||
|
binding = ActivityAboutBinding.inflate(layoutInflater)
|
||||||
|
val view: View = binding!!.root
|
||||||
|
setContentView(view)
|
||||||
|
|
||||||
|
setSupportActionBar(binding!!.toolbarBinding.toolbar)
|
||||||
|
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
|
||||||
|
val aboutText = getString(R.string.about_license)
|
||||||
|
/*
|
||||||
|
We can then access all the views by just using the id names like this.
|
||||||
|
camelCasing is used with underscore characters being ignored.
|
||||||
|
*/
|
||||||
|
binding!!.aboutLicense.setHtmlText(aboutText)
|
||||||
|
|
||||||
|
@SuppressLint("StringFormatMatches") // TODO:
|
||||||
|
val improveText =
|
||||||
|
String.format(getString(R.string.about_improve), Urls.NEW_ISSUE_URL)
|
||||||
|
binding!!.aboutImprove.setHtmlText(improveText)
|
||||||
|
binding!!.aboutVersion.text = applicationContext.getVersionNameWithSha()
|
||||||
|
|
||||||
|
Utils.setUnderlinedText(
|
||||||
|
binding!!.aboutFaq, R.string.about_faq,
|
||||||
|
applicationContext
|
||||||
|
)
|
||||||
|
Utils.setUnderlinedText(
|
||||||
|
binding!!.aboutRateUs, R.string.about_rate_us,
|
||||||
|
applicationContext
|
||||||
|
)
|
||||||
|
Utils.setUnderlinedText(
|
||||||
|
binding!!.aboutUserGuide, R.string.user_guide,
|
||||||
|
applicationContext
|
||||||
|
)
|
||||||
|
Utils.setUnderlinedText(
|
||||||
|
binding!!.aboutPrivacyPolicy, R.string.about_privacy_policy,
|
||||||
|
applicationContext
|
||||||
|
)
|
||||||
|
Utils.setUnderlinedText(
|
||||||
|
binding!!.aboutTranslate, R.string.about_translate,
|
||||||
|
applicationContext
|
||||||
|
)
|
||||||
|
Utils.setUnderlinedText(
|
||||||
|
binding!!.aboutCredits, R.string.about_credits,
|
||||||
|
applicationContext
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
To set listeners, we can create a separate method and use lambda syntax.
|
||||||
|
*/
|
||||||
|
binding!!.facebookLaunchIcon.setOnClickListener(::launchFacebook)
|
||||||
|
binding!!.githubLaunchIcon.setOnClickListener(::launchGithub)
|
||||||
|
binding!!.websiteLaunchIcon.setOnClickListener(::launchWebsite)
|
||||||
|
binding!!.aboutRateUs.setOnClickListener(::launchRatings)
|
||||||
|
binding!!.aboutCredits.setOnClickListener(::launchCredits)
|
||||||
|
binding!!.aboutPrivacyPolicy.setOnClickListener(::launchPrivacyPolicy)
|
||||||
|
binding!!.aboutUserGuide.setOnClickListener(::launchUserGuide)
|
||||||
|
binding!!.aboutFaq.setOnClickListener(::launchFrequentlyAskedQuesions)
|
||||||
|
binding!!.aboutTranslate.setOnClickListener(::launchTranslate)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSupportNavigateUp(): Boolean {
|
||||||
|
onBackPressed()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchFacebook(view: View?) {
|
||||||
|
val intent: Intent
|
||||||
|
try {
|
||||||
|
intent = Intent(Intent.ACTION_VIEW, Uri.parse(Urls.FACEBOOK_APP_URL))
|
||||||
|
intent.setPackage(Urls.FACEBOOK_PACKAGE_NAME)
|
||||||
|
startActivity(intent)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Utils.handleWebUrl(this, Uri.parse(Urls.FACEBOOK_WEB_URL))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchGithub(view: View?) {
|
||||||
|
val intent: Intent
|
||||||
|
try {
|
||||||
|
intent = Intent(Intent.ACTION_VIEW, Uri.parse(Urls.GITHUB_REPO_URL))
|
||||||
|
intent.setPackage(Urls.GITHUB_PACKAGE_NAME)
|
||||||
|
startActivity(intent)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Utils.handleWebUrl(this, Uri.parse(Urls.GITHUB_REPO_URL))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchWebsite(view: View?) {
|
||||||
|
Utils.handleWebUrl(this, Uri.parse(Urls.WEBSITE_URL))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchRatings(view: View?) {
|
||||||
|
Utils.rateApp(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchCredits(view: View?) {
|
||||||
|
Utils.handleWebUrl(this, Uri.parse(Urls.CREDITS_URL))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchUserGuide(view: View?) {
|
||||||
|
Utils.handleWebUrl(this, Uri.parse(Urls.USER_GUIDE_URL))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchPrivacyPolicy(view: View?) {
|
||||||
|
Utils.handleWebUrl(this, Uri.parse(BuildConfig.PRIVACY_POLICY_URL))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchFrequentlyAskedQuesions(view: View?) {
|
||||||
|
Utils.handleWebUrl(this, Uri.parse(Urls.FAQ_URL))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
val inflater = menuInflater
|
||||||
|
inflater.inflate(R.menu.menu_about, menu)
|
||||||
|
return super.onCreateOptionsMenu(menu)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
when (item.itemId) {
|
||||||
|
R.id.share_app_icon -> {
|
||||||
|
val shareText = String.format(
|
||||||
|
getString(R.string.share_text),
|
||||||
|
Urls.PLAY_STORE_URL_PREFIX + this.packageName
|
||||||
|
)
|
||||||
|
val sendIntent = Intent()
|
||||||
|
sendIntent.setAction(Intent.ACTION_SEND)
|
||||||
|
sendIntent.putExtra(Intent.EXTRA_TEXT, shareText)
|
||||||
|
sendIntent.setType("text/plain")
|
||||||
|
startActivity(Intent.createChooser(sendIntent, getString(R.string.share_via)))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> return super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun launchTranslate(view: View?) {
|
||||||
|
val sortedLocalizedNamesRef = instance.languageLookUpTable!!.getCanonicalNames()
|
||||||
|
Collections.sort(sortedLocalizedNamesRef)
|
||||||
|
val languageAdapter = ArrayAdapter(
|
||||||
|
this@AboutActivity,
|
||||||
|
android.R.layout.simple_spinner_dropdown_item, sortedLocalizedNamesRef
|
||||||
|
)
|
||||||
|
val spinner = Spinner(this@AboutActivity)
|
||||||
|
spinner.layoutParams =
|
||||||
|
LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||||
|
)
|
||||||
|
spinner.adapter = languageAdapter
|
||||||
|
spinner.gravity = 17
|
||||||
|
spinner.setPadding(50, 0, 0, 0)
|
||||||
|
|
||||||
|
val positiveButtonRunnable = Runnable {
|
||||||
|
val langCode = instance.languageLookUpTable!!.getCodes()[spinner.selectedItemPosition]
|
||||||
|
Utils.handleWebUrl(this@AboutActivity, Uri.parse(Urls.TRANSLATE_WIKI_URL + langCode))
|
||||||
|
}
|
||||||
|
showAlertDialog(
|
||||||
|
this,
|
||||||
|
getString(R.string.about_translate_title),
|
||||||
|
getString(R.string.about_translate_message),
|
||||||
|
getString(R.string.about_translate_proceed),
|
||||||
|
getString(R.string.about_translate_cancel),
|
||||||
|
positiveButtonRunnable,
|
||||||
|
{},
|
||||||
|
spinner
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
* NancyMilad
|
* NancyMilad
|
||||||
* OsamaK
|
* OsamaK
|
||||||
* Tala Ali
|
* Tala Ali
|
||||||
|
* XIDME
|
||||||
* أيوب
|
* أيوب
|
||||||
* أَحمد
|
* أَحمد
|
||||||
* ترجمان05
|
* ترجمان05
|
||||||
|
|
@ -408,7 +409,7 @@
|
||||||
<string name="error_fetching_nearby_monuments">خطأ في جلب المعالم القريبة.</string>
|
<string name="error_fetching_nearby_monuments">خطأ في جلب المعالم القريبة.</string>
|
||||||
<string name="no_recent_searches">لا توجد عمليات بحث حديثة</string>
|
<string name="no_recent_searches">لا توجد عمليات بحث حديثة</string>
|
||||||
<string name="delete_recent_searches_dialog">هل أنت متأكد من أنك تريد مسح سجل بحثك؟</string>
|
<string name="delete_recent_searches_dialog">هل أنت متأكد من أنك تريد مسح سجل بحثك؟</string>
|
||||||
<string name="cancel_upload_dialog">هل انت متأكد انك تريد الغاء هذا التحميل</string>
|
<string name="cancel_upload_dialog">هل أنت متأكد أنك تريد إلغاء هذا التحميل؟</string>
|
||||||
<string name="delete_search_dialog">هل تريد حذف هذا البحث؟</string>
|
<string name="delete_search_dialog">هل تريد حذف هذا البحث؟</string>
|
||||||
<string name="search_history_deleted">تم حذف سجل البحث</string>
|
<string name="search_history_deleted">تم حذف سجل البحث</string>
|
||||||
<string name="nominate_delete">ترشيح للحذف</string>
|
<string name="nominate_delete">ترشيح للحذف</string>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue