diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7e61449217..8b1d95b069 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -102,9 +102,11 @@
android:authorities="@string/file_authority"
android:grantUriPermissions="true"
android:exported="false">
+ tools:replace="android:authorities">
+ android:resource="@xml/file_paths"
+ tools:replace="android:resource" />
diff --git a/app/src/main/java/com/quran/labs/androidquran/presenter/audio/AudioPresenter.kt b/app/src/main/java/com/quran/labs/androidquran/presenter/audio/AudioPresenter.kt
index 3f9736d8da..9bc73b3ec1 100644
--- a/app/src/main/java/com/quran/labs/androidquran/presenter/audio/AudioPresenter.kt
+++ b/app/src/main/java/com/quran/labs/androidquran/presenter/audio/AudioPresenter.kt
@@ -87,7 +87,7 @@ constructor(private val quranDisplayData: QuranDisplayData,
lastAudioRequest?.let { play(it) }
}
- private fun getDownloadIntent(context: Context, request: AudioRequest): Intent? {
+ fun getDownloadIntent(context: Context, request: AudioRequest): Intent? {
val qari = request.qari
val audioPathInfo = request.audioPathInfo
val path = audioPathInfo.localDirectory
diff --git a/app/src/main/java/com/quran/labs/androidquran/ui/PagerActivity.java b/app/src/main/java/com/quran/labs/androidquran/ui/PagerActivity.java
index 3f042e521b..28c6b982b5 100644
--- a/app/src/main/java/com/quran/labs/androidquran/ui/PagerActivity.java
+++ b/app/src/main/java/com/quran/labs/androidquran/ui/PagerActivity.java
@@ -1,5 +1,6 @@
package com.quran.labs.androidquran.ui;
+import static com.quran.labs.androidquran.database.DatabaseUtils.closeCursor;
import static com.quran.labs.androidquran.ui.helpers.SlidingPagerAdapter.AUDIO_PAGE;
import static com.quran.labs.androidquran.ui.helpers.SlidingPagerAdapter.TAG_PAGE;
import static com.quran.labs.androidquran.ui.helpers.SlidingPagerAdapter.TRANSLATION_PAGE;
@@ -15,13 +16,17 @@
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.database.Cursor;
+import android.database.SQLException;
import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.Menu;
@@ -70,14 +75,17 @@
import com.quran.labs.androidquran.common.LocalTranslationDisplaySort;
import com.quran.labs.androidquran.common.QuranAyahInfo;
import com.quran.labs.androidquran.common.audio.model.QariItem;
+import com.quran.labs.androidquran.dao.audio.AudioPathInfo;
import com.quran.labs.androidquran.dao.audio.AudioRequest;
import com.quran.labs.androidquran.data.Constants;
import com.quran.labs.androidquran.data.QuranDataProvider;
import com.quran.labs.androidquran.data.QuranDisplayData;
+import com.quran.labs.androidquran.database.SuraTimingDatabaseHandler;
import com.quran.labs.androidquran.database.TranslationsDBAdapter;
import com.quran.labs.androidquran.di.component.activity.PagerActivityComponent;
import com.quran.labs.androidquran.di.module.activity.PagerActivityModule;
import com.quran.labs.androidquran.di.module.fragment.QuranPageModule;
+import com.quran.labs.androidquran.feature.audio.util.AudioShareUtils;
import com.quran.labs.androidquran.model.bookmark.BookmarkModel;
import com.quran.labs.androidquran.model.translation.ArabicDatabaseUtils;
import com.quran.labs.androidquran.presenter.audio.AudioPresenter;
@@ -123,8 +131,10 @@
import com.quran.reading.common.AudioEventPresenter;
import com.quran.reading.common.ReadingEventPresenter;
+import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -141,6 +151,8 @@
import io.reactivex.rxjava3.observers.DisposableObserver;
import io.reactivex.rxjava3.observers.DisposableSingleObserver;
import io.reactivex.rxjava3.schedulers.Schedulers;
+import kotlin.TuplesKt;
+import kotlin.jvm.internal.Intrinsics;
import timber.log.Timber;
/**
@@ -216,8 +228,10 @@ public class PagerActivity extends AppCompatActivity implements
private int defaultNavigationBarColor;
private boolean isSplitScreen = false;
- @Nullable private QuranAyahInfo lastSelectedTranslationAyah;
- @Nullable private LocalTranslation[] lastActivatedLocalTranslations;
+ @Nullable
+ private QuranAyahInfo lastSelectedTranslationAyah;
+ @Nullable
+ private LocalTranslation[] lastActivatedLocalTranslations;
private PagerActivityComponent pagerActivityComponent;
@@ -249,6 +263,12 @@ public class PagerActivity extends AppCompatActivity implements
private final PagerHandler handler = new PagerHandler(this);
+ private ArrayList audioCacheFilePaths = new ArrayList<>();
+ private SuraAyah selectedStartSuraAyah = null;
+ private SuraAyah selectedEndSuraAyah = null;
+ private QariItem selectedQari = null;
+
+
private static class PagerHandler extends Handler {
private final WeakReference activity;
@@ -285,12 +305,21 @@ public void onCreate(Bundle savedInstanceState) {
isSplitScreen = quranSettings.isQuranSplitWithTranslation();
audioEventPresenterBridge = new AudioEventPresenterBridge(
audioEventPresenter,
- suraAyah -> { onAudioPlaybackAyahChanged(suraAyah); return null; }
+ suraAyah -> {
+ onAudioPlaybackAyahChanged(suraAyah);
+ return null;
+ }
);
readingEventPresenterBridge = new ReadingEventPresenterBridge(
readingEventPresenter,
- () -> { onPageClicked(); return null; },
- ayahSelection -> { onAyahSelectionChanged(ayahSelection); return null; }
+ () -> {
+ onPageClicked();
+ return null;
+ },
+ ayahSelection -> {
+ onAyahSelectionChanged(ayahSelection);
+ return null;
+ }
);
// remove the window background to avoid overdraw. note that, per Romain's blog, this is
@@ -418,7 +447,8 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
} else if (position == barPos - 1 || position == barPos + 1) {
// Swiping to previous or next ViewPager page (i.e. next or previous quran page)
final SelectionIndicator updatedSelectionIndicator =
- SelectionIndicatorKt.withXScroll(selectionIndicator, viewPager.getWidth() - positionOffsetPixels);
+ SelectionIndicatorKt.withXScroll(selectionIndicator,
+ viewPager.getWidth() - positionOffsetPixels);
readingEventPresenterBridge.withSelectionIndicator(updatedSelectionIndicator);
} else {
readingEventPresenterBridge.clearSelectedAyah();
@@ -538,8 +568,14 @@ public void onPageSelected(int position) {
this::getCurrentPage,
() -> audioStatusBar,
() -> ayahToolBar,
- ayah -> { ensurePage(ayah.sura, ayah.ayah); return null; },
- sliderPage -> { showSlider(slidingPagerAdapter.getPagePosition(sliderPage)); return null; }
+ ayah -> {
+ ensurePage(ayah.sura, ayah.ayah);
+ return null;
+ },
+ sliderPage -> {
+ showSlider(slidingPagerAdapter.getPagePosition(sliderPage));
+ return null;
+ }
));
}
@@ -1368,16 +1404,16 @@ private void ensurePage(int sura, int ayah) {
private void requestTranslationsList() {
compositeDisposable.add(
Single.fromCallable(() ->
- translationsDBAdapter.getTranslations())
+ translationsDBAdapter.getTranslations())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver>() {
@Override
public void onSuccess(@NonNull List translationList) {
final List sortedTranslations = new ArrayList<>(translationList);
- Collections.sort(sortedTranslations, new LocalTranslationDisplaySort());
+ Collections.sort(sortedTranslations, new LocalTranslationDisplaySort());
- int items = sortedTranslations.size();
+ int items = sortedTranslations.size();
String[] titles = new String[items];
for (int i = 0; i < items; i++) {
LocalTranslation item = sortedTranslations.get(i);
@@ -1394,7 +1430,8 @@ public void onSuccess(@NonNull List translationList) {
if (currentActiveTranslationsFilesNames.isEmpty() && items > 0) {
currentActiveTranslationsFilesNames = new HashSet<>();
for (int i = 0; i < items; i++) {
- currentActiveTranslationsFilesNames.add(sortedTranslations.get(i).getFilename());
+ currentActiveTranslationsFilesNames.add(
+ sortedTranslations.get(i).getFilename());
}
}
activeTranslationsFilesNames = currentActiveTranslationsFilesNames;
@@ -1427,7 +1464,8 @@ public void onSuccess(@NonNull Boolean isBookmarked) {
if (sura == null || ayah == null) {
// page bookmark
bookmarksCache.put(page, isBookmarked);
- bookmarksMenuItem.setIcon(isBookmarked ? com.quran.labs.androidquran.common.toolbar.R.drawable.ic_favorite : com.quran.labs.androidquran.common.toolbar.R.drawable.ic_not_favorite);
+ bookmarksMenuItem.setIcon(
+ isBookmarked ? com.quran.labs.androidquran.common.toolbar.R.drawable.ic_favorite : com.quran.labs.androidquran.common.toolbar.R.drawable.ic_not_favorite);
} else {
// ayah bookmark
SuraAyah suraAyah = new SuraAyah(sura, ayah);
@@ -1476,7 +1514,8 @@ private void refreshBookmarksMenu() {
bookmarked = bookmarksCache.get(page - 1);
}
- menuItem.setIcon(bookmarked ? com.quran.labs.androidquran.common.toolbar.R.drawable.ic_favorite : com.quran.labs.androidquran.common.toolbar.R.drawable.ic_not_favorite);
+ menuItem.setIcon(
+ bookmarked ? com.quran.labs.androidquran.common.toolbar.R.drawable.ic_favorite : com.quran.labs.androidquran.common.toolbar.R.drawable.ic_not_favorite);
} else {
supportInvalidateOptionsMenu();
}
@@ -1517,7 +1556,7 @@ private void playFromAyah(int page, int startSura, int startAyah) {
final SuraAyah start = new SuraAyah(startSura, startAyah);
final SuraAyah end = getSelectionEnd();
// handle the case of multiple ayat being selected and play them as a range if so
- final SuraAyah ending = (end == null || start.equals(end) || start.after(end))? null : end;
+ final SuraAyah ending = (end == null || start.equals(end) || start.after(end)) ? null : end;
playFromAyah(start, ending, page, 0, 0, ending != null);
}
@@ -1760,6 +1799,8 @@ public boolean onMenuItemClick(MenuItem item) {
shareAyahLink(startSuraAyah, endSuraAyah);
} else if (itemId == com.quran.labs.androidquran.common.toolbar.R.id.cab_share_ayah_text) {
shareAyah(startSuraAyah, endSuraAyah, false);
+ } else if (itemId == com.quran.labs.androidquran.common.toolbar.R.id.cab_share_ayah_audio) {
+ shareAyahAudio(startSuraAyah, endSuraAyah);
} else if (itemId == com.quran.labs.androidquran.common.toolbar.R.id.cab_copy_ayah) {
shareAyah(startSuraAyah, endSuraAyah, true);
} else {
@@ -1796,7 +1837,8 @@ private void shareAyah(SuraAyah start, SuraAyah end, final boolean isCopy) {
if (isCopy) {
shareUtil.copyToClipboard(this, shareText);
} else {
- shareUtil.shareViaIntent(this, shareText, com.quran.labs.androidquran.common.toolbar.R.string.share_ayah_text);
+ shareUtil.shareViaIntent(this, shareText,
+ com.quran.labs.androidquran.common.toolbar.R.string.share_ayah_text);
}
}
@@ -1825,7 +1867,8 @@ public void shareAyahLink(SuraAyah start, SuraAyah end) {
.subscribeWith(new DisposableSingleObserver() {
@Override
public void onSuccess(@NonNull String url) {
- shareUtil.shareViaIntent(PagerActivity.this, url, com.quran.labs.androidquran.common.toolbar.R.string.share_ayah);
+ shareUtil.shareViaIntent(PagerActivity.this, url,
+ com.quran.labs.androidquran.common.toolbar.R.string.share_ayah);
dismissProgressDialog();
}
@@ -1837,6 +1880,67 @@ public void onError(@NonNull Throwable e) {
);
}
+ public void shareAyahAudio(SuraAyah start, SuraAyah end) {
+ audioCacheFilePaths.clear();
+
+ kotlin.Pair pair2 = getReorderedAyatPair(start, end);
+ selectedStartSuraAyah = (SuraAyah) pair2.component1();
+ selectedEndSuraAyah = (SuraAyah) pair2.component2();
+
+ selectedQari = audioStatusBar.getAudioInfo();
+ AudioPathInfo audioPathInfo = audioUtils.getLocalAudioPathInfo(selectedQari);
+
+ assert audioPathInfo != null;
+ boolean gaplessDatabaseExists = audioPathInfo.getGaplessDatabase() != null;
+
+ if (gaplessDatabaseExists) {
+ if (audioFilesExist(audioPathInfo)) {
+ AudioShareUtils audioShareUtils = new AudioShareUtils();
+ String path = audioShareUtils.createSharableAudioFile(this, selectedStartSuraAyah,
+ selectedEndSuraAyah, selectedQari, audioPathInfo.getUrlFormat(),
+ audioPathInfo.getGaplessDatabase());
+ if(path != null && !path.isEmpty()){
+ shareAudioSegment(path);
+ }else{
+ Toast.makeText(this, "could not share audio ayah", Toast.LENGTH_SHORT).show();
+ }
+ } else {
+ requestDownload(audioPathInfo);
+ }
+ }
+ }
+
+ private kotlin.Pair getReorderedAyatPair(SuraAyah start, SuraAyah end) {
+ kotlin.Pair pair;
+ if (start.compareTo(end) <= 0) {
+ pair = TuplesKt.to(start, end);
+ } else {
+ Timber.Forest.e(
+ new IllegalStateException("End isn't larger than the start: " + start + " to " + end));
+ pair = TuplesKt.to(end, start);
+ }
+ return pair;
+ }
+
+ private boolean audioFilesExist(AudioPathInfo audioPathInfo) {
+ return audioUtils.haveAllFiles(audioPathInfo.getUrlFormat(), audioPathInfo.getLocalDirectory(),
+ selectedStartSuraAyah, selectedEndSuraAyah, true);
+ }
+
+ private void shareAudioSegment(String path) {
+ shareUtil.shareAudioFileIntent(PagerActivity.this, new File(path));
+ }
+
+ private void requestDownload(AudioPathInfo audioPathInfo) {
+ AudioRequest audioRequest = new AudioRequest(
+ selectedStartSuraAyah, selectedEndSuraAyah, selectedQari, 0, 0, true, false, audioPathInfo);
+
+ Intent downloadIntent = audioPresenter.getDownloadIntent(this, audioRequest);
+ if (downloadIntent != null) {
+ handleRequiredDownload(downloadIntent);
+ }
+ }
+
private void showProgressDialog() {
if (progressDialog == null) {
progressDialog = new ProgressDialog(this);
diff --git a/app/src/main/java/com/quran/labs/androidquran/util/AudioUtils.kt b/app/src/main/java/com/quran/labs/androidquran/util/AudioUtils.kt
index 5cde50f940..4df8b728cf 100644
--- a/app/src/main/java/com/quran/labs/androidquran/util/AudioUtils.kt
+++ b/app/src/main/java/com/quran/labs/androidquran/util/AudioUtils.kt
@@ -8,6 +8,7 @@ import com.quran.data.model.SuraAyah
import com.quran.labs.androidquran.common.audio.model.AudioConfiguration
import com.quran.labs.androidquran.common.audio.model.QariItem
import com.quran.labs.androidquran.common.audio.util.QariUtil
+import com.quran.labs.androidquran.dao.audio.AudioPathInfo
import com.quran.labs.androidquran.service.AudioService
import timber.log.Timber
import java.io.File
@@ -283,6 +284,21 @@ class AudioUtils @Inject constructor(
}
}
+ fun getLocalAudioPathInfo(qari: QariItem): AudioPathInfo? {
+ val localPath = getLocalQariUrl(qari)
+ if (localPath != null) {
+ val databasePath = getQariDatabasePathIfGapless(qari)
+ val urlFormat = if (databasePath.isNullOrEmpty()) {
+ localPath + File.separator + "%d" + File.separator +
+ "%d" + AUDIO_EXTENSION
+ } else {
+ localPath + File.separator + "%03d" + AUDIO_EXTENSION
+ }
+ return AudioPathInfo(urlFormat, localPath, databasePath)
+ }
+ return null
+ }
+
companion object {
const val ZIP_EXTENSION = ".zip"
const val AUDIO_EXTENSION = ".mp3"
diff --git a/app/src/main/java/com/quran/labs/androidquran/util/ShareUtil.kt b/app/src/main/java/com/quran/labs/androidquran/util/ShareUtil.kt
index a2f0450851..7680397dcf 100644
--- a/app/src/main/java/com/quran/labs/androidquran/util/ShareUtil.kt
+++ b/app/src/main/java/com/quran/labs/androidquran/util/ShareUtil.kt
@@ -7,7 +7,10 @@ import android.content.Context
import android.content.Intent
import android.widget.Toast
import androidx.annotation.StringRes
+import androidx.core.content.ContextCompat
+import androidx.core.content.FileProvider
import com.quran.data.model.QuranText
+import com.quran.labs.androidquran.BuildConfig
import com.quran.labs.androidquran.R
import com.quran.labs.androidquran.common.LocalTranslation
import com.quran.labs.androidquran.common.QuranAyahInfo
@@ -15,6 +18,7 @@ import com.quran.labs.androidquran.data.QuranDisplayData
import com.quran.labs.androidquran.model.translation.ArabicDatabaseUtils
import com.quran.labs.androidquran.ui.util.ToastCompat
import dagger.Reusable
+import java.io.File
import java.text.NumberFormat
import java.util.Locale
import javax.inject.Inject
@@ -124,4 +128,15 @@ class ShareUtil @Inject internal constructor(private val quranDisplayData: Quran
append("]")
}
}
+
+
+ fun shareAudioFileIntent(activity: Activity, file: File) {
+ val authorities = BuildConfig.APPLICATION_ID + ".fileprovider"
+ val uri = FileProvider.getUriForFile(activity, authorities, file)
+ val shareIntent = Intent(Intent.ACTION_SEND)
+ shareIntent.putExtra(Intent.EXTRA_STREAM, uri)
+ shareIntent.type = "audio/mp3"
+ shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ activity.startActivity(Intent.createChooser(shareIntent, activity.getString(R.string.share_audio_file_title)))
+ }
}
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 73bc2d4901..5b205754d8 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -240,6 +240,7 @@
تم نسخ الآية
+ Share Audio File
تصنيف المرجعية
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 9ec44ee78d..11195285fa 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -286,6 +286,7 @@
Âyet kopyalandı
+ Share Audio File
Sayfa işareti etiketi
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
index e338fbdf8b..0f34787ecd 100644
--- a/app/src/main/res/values-bs/strings.xml
+++ b/app/src/main/res/values-bs/strings.xml
@@ -305,6 +305,7 @@
Ajet kopiran
+ Share Audio File
Označi zabilješku
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index bab66e2b91..ae8670b660 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -311,6 +311,7 @@
Vers kopiert
+ Share Audio File
Ein Schlagwort zum Lesezeichen hinzufügen
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 137dbd1829..339b705e93 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -170,6 +170,7 @@
Versículo copiado
+ Share Audio File
Etiquetar Favorito
Borrar Etiqueta
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 3834c97f48..649ecb3d82 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -167,6 +167,7 @@
آیه کپی شد
+ Share Audio File
تعیین برچسب برای نشانک
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index b1172bd431..05d65e6d42 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -258,6 +258,7 @@
Aya copiée
+ Share Audio File
Étiqueter le favori
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 86a3318dcc..4a1fa3d20d 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -305,6 +305,7 @@
Ajet kopiran
+ Share Audio File
Označi zabilješku
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index ad25141740..228bcf8c5b 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -234,6 +234,7 @@
Ája kimásolva
+ Share Audio File
Könyvelző címkézése
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index eda7bd57b3..23ac5275cf 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -290,6 +290,7 @@
Ayat telah tersalin
+ Share Audio File
Labeli Penanda
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index b7bee30bae..66b23401ea 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -123,6 +123,7 @@
Avviare la riproduzione da:
Inizio della pagina
Ayah Copiato
+ Share Audio File
Segnalibro
Cancellare il tag
Modifica tag
diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml
index 77500bfc18..f030f479ab 100644
--- a/app/src/main/res/values-kk/strings.xml
+++ b/app/src/main/res/values-kk/strings.xml
@@ -291,6 +291,7 @@
Аят көшірілді
+ Share Audio File
Бетбелгіні белгілеу
diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml
index c34e4e6625..0eebc3becd 100644
--- a/app/src/main/res/values-ku/strings.xml
+++ b/app/src/main/res/values-ku/strings.xml
@@ -187,6 +187,7 @@
ئایەت لەبەریگیراوە
+ Share Audio File
بڕگە نیشانەکرا
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index ebf680ce38..749c5f8da2 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -260,6 +260,7 @@
Ayat telah disalin
+ Share Audio File
Beri Label pada Penanda
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 6545623e91..b182bbc86c 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -282,6 +282,7 @@ Voor de vertaalde pagina\'s (/voor vertalingen): Ga naar instellingen en wijzig
Ayah Gekopieerd
+ Share Audio File
Label Bladwijzer
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 0945ece736..d2423a99b6 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -295,6 +295,7 @@
Ayah Skopiowany
+ Share Audio File
Tag Zakładka
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 286e311cad..3d9ddaf84d 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -205,6 +205,7 @@ escolher um leitor-qari diferente. Clique play para baixar e reproduzir a págin
Ayah Copiada
+ Share Audio File
Tagear Marcador
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 5af0673500..d3da9addd8 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -344,6 +344,7 @@
Аят скопирован
+ Share Audio File
Отметить закладку
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index 51def7be8c..13d074e440 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -293,6 +293,7 @@
Ajahu kopjon
+ Share Audio File
Tag Libërshënues
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 05009fcd2a..d37de82a85 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -305,6 +305,7 @@
Ajet kopiran
+ Share Audio File
Označi zabelešku
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 43c1d06432..6e12fc4138 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -293,6 +293,7 @@
Ayah Kopierad
+ Share Audio File
Tag Bookmark
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index ee9dacdc34..a38f9f2193 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -284,6 +284,7 @@
อายะห์ คัดลอก
+ Share Audio File
ที่คั่นหน้าแท็ก
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 9ec44ee78d..11195285fa 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -286,6 +286,7 @@
Âyet kopyalandı
+ Share Audio File
Sayfa işareti etiketi
diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml
index eb2bf74b2a..497a034ad0 100644
--- a/app/src/main/res/values-ug/strings.xml
+++ b/app/src/main/res/values-ug/strings.xml
@@ -160,6 +160,7 @@
ئايەت كۆچۈرۈلدى
+ Share Audio File
خەتكۈچكە بەلگە قوش
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 4de0b3641e..519ed660b8 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -296,6 +296,7 @@
Ая скопійований
+ Share Audio File
Закладка тега
diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml
index f6a801f835..2187c221b0 100644
--- a/app/src/main/res/values-uz/strings.xml
+++ b/app/src/main/res/values-uz/strings.xml
@@ -319,6 +319,7 @@
Oyat xotiraga koʻchirildi
+ Share Audio File
Xatchoʻpni teglash
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 61d3a72da6..672ee8cf84 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -175,6 +175,7 @@
复制成功
+ Share Audio File
为收藏加标签
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index af568b9731..7aded67319 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -365,6 +365,7 @@
Ayah Copied
+ Share Audio File
Tag Bookmark
@@ -411,6 +412,7 @@
Download selection
Delete selection
+
Quran Audio files Update
Several Quran audio files have been updated. Quran has removed
diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml
index 783bd79240..15ebff8dcc 100644
--- a/app/src/main/res/xml/file_paths.xml
+++ b/app/src/main/res/xml/file_paths.xml
@@ -3,4 +3,13 @@
+
+
+
+
+
+
diff --git a/common/toolbar/src/main/res/drawable-hdpi/ic_qaf.png b/common/toolbar/src/main/res/drawable-hdpi/ic_qaf.png
new file mode 100644
index 0000000000..efeb74fc25
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-hdpi/ic_qaf.png differ
diff --git a/common/toolbar/src/main/res/drawable-hdpi/ic_speaker.png b/common/toolbar/src/main/res/drawable-hdpi/ic_speaker.png
new file mode 100644
index 0000000000..22d33dd552
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-hdpi/ic_speaker.png differ
diff --git a/common/toolbar/src/main/res/drawable-mdpi/ic_qaf.png b/common/toolbar/src/main/res/drawable-mdpi/ic_qaf.png
new file mode 100644
index 0000000000..51bed2d502
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-mdpi/ic_qaf.png differ
diff --git a/common/toolbar/src/main/res/drawable-mdpi/ic_speaker.png b/common/toolbar/src/main/res/drawable-mdpi/ic_speaker.png
new file mode 100644
index 0000000000..795d731b64
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-mdpi/ic_speaker.png differ
diff --git a/common/toolbar/src/main/res/drawable-xhdpi/ic_qaf.png b/common/toolbar/src/main/res/drawable-xhdpi/ic_qaf.png
new file mode 100644
index 0000000000..002c076522
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-xhdpi/ic_qaf.png differ
diff --git a/common/toolbar/src/main/res/drawable-xhdpi/ic_speaker.png b/common/toolbar/src/main/res/drawable-xhdpi/ic_speaker.png
new file mode 100644
index 0000000000..3784a535a1
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-xhdpi/ic_speaker.png differ
diff --git a/common/toolbar/src/main/res/drawable-xxhdpi/ic_qaf.png b/common/toolbar/src/main/res/drawable-xxhdpi/ic_qaf.png
new file mode 100644
index 0000000000..5a00a55a55
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-xxhdpi/ic_qaf.png differ
diff --git a/common/toolbar/src/main/res/drawable-xxhdpi/ic_speaker.png b/common/toolbar/src/main/res/drawable-xxhdpi/ic_speaker.png
new file mode 100644
index 0000000000..d6ebc4cc6a
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-xxhdpi/ic_speaker.png differ
diff --git a/common/toolbar/src/main/res/drawable-xxxhdpi/ic_qaf.png b/common/toolbar/src/main/res/drawable-xxxhdpi/ic_qaf.png
new file mode 100644
index 0000000000..81ff927acf
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-xxxhdpi/ic_qaf.png differ
diff --git a/common/toolbar/src/main/res/drawable-xxxhdpi/ic_speaker.png b/common/toolbar/src/main/res/drawable-xxxhdpi/ic_speaker.png
new file mode 100644
index 0000000000..8f09e81ad5
Binary files /dev/null and b/common/toolbar/src/main/res/drawable-xxxhdpi/ic_speaker.png differ
diff --git a/common/toolbar/src/main/res/drawable/ic_text.xml b/common/toolbar/src/main/res/drawable/ic_text.xml
new file mode 100644
index 0000000000..772216cef6
--- /dev/null
+++ b/common/toolbar/src/main/res/drawable/ic_text.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/common/toolbar/src/main/res/menu/ayah_menu.xml b/common/toolbar/src/main/res/menu/ayah_menu.xml
index bd95395f6a..7dffef4cb9 100644
--- a/common/toolbar/src/main/res/menu/ayah_menu.xml
+++ b/common/toolbar/src/main/res/menu/ayah_menu.xml
@@ -1,34 +1,47 @@
-