Example #1
0
        public async Task CopyAyahToClipboard(QuranAyah ayah)
        {
            if (ayah == null)
            {
                return;
            }

            if (ayah.Translation != null)
            {
                QuranApp.NativeProvider.CopyToClipboard(ayah.Translation);
            }
            else if (ayah.Text != null)
            {
                QuranApp.NativeProvider.CopyToClipboard(ayah.Text);
            }
            else
            {
                try
                {
                    using (var dbArabic = new QuranDatabaseHandler <ArabicAyah>(FileUtils.ArabicDatabase))
                    {
                        var ayahSurah =
                            await new TaskFactory().StartNew(() => dbArabic.GetVerse(ayah.Surah, ayah.Ayah));
                        QuranApp.NativeProvider.CopyToClipboard(ayahSurah.Text);
                    }
                }
                catch (Exception e)
                {
                    telemetry.TrackException(e, new Dictionary <string, string> {
                        { "Scenario", "OpenArabicDatabase" }
                    });
                }
            }
        }
Example #2
0
        public async Task <string> GetAyahString(QuranAyah ayah)
        {
            if (ayah == null)
            {
                return(null);
            }

            else if (ayah.Text != null)
            {
                return(ayah.Text);
            }
            else
            {
                try
                {
                    return(await Task.Run <string>(() =>
                    {
                        using (var dbArabic = new QuranDatabaseHandler <ArabicAyah>(FileUtils.ArabicDatabase))
                        {
                            var ayahSurah = dbArabic.GetVerse(ayah.Surah, ayah.Ayah);
                            string ayahText = ayahSurah.Text;
                            return ayahText;
                        }
                    }));
                }
                catch (Exception e)
                {
                    telemetry.TrackException(e, new Dictionary <string, string> {
                        { "Scenario", "OpenArabicDatabase" }
                    });
                }
            }
            return(null);
        }
Example #3
0
        public override async Task Initialize()
        {
            IsLoading = true;
            ClearPages();
            Orientation = DisplayInformation.GetForCurrentView().CurrentOrientation;
            if (SettingsUtils.Get <bool>(Constants.PREF_NIGHT_MODE))
            {
                Theme = ElementTheme.Dark;
            }
            else
            {
                Theme = ElementTheme.Light;
            }
            KeepInfoOverlay = SettingsUtils.Get <bool>(Constants.PREF_KEEP_INFO_OVERLAY);
            //Update translations
            var translation = SettingsUtils.Get <string>(Constants.PREF_ACTIVE_TRANSLATION);

            if (!string.IsNullOrEmpty(translation))
            {
                TranslationFile = translation.Split('|')[0];
                if (await HasTranslationFile())
                {
                    ShowTranslation         = SettingsUtils.Get <bool>(Constants.PREF_SHOW_TRANSLATION);
                    ShowArabicInTranslation = SettingsUtils.Get <bool>(Constants.PREF_SHOW_ARABIC_IN_TRANSLATION);
                }
                if (await HasTranslationFile())
                {
                    using (var db = new QuranDatabaseHandler <QuranAyah>(this.TranslationFile))
                    {
                        _bismillahTranslation = (await new TaskFactory().StartNew(() => db.GetVerse(1, 1))).Text;
                    }
                }
            }
            await CreatePages();
            await LoadCurrentPage();

            await base.Initialize();

            IsLoading = false;
        }
Example #4
0
        private async Task<bool> loadPage(int pageIndex, bool force)
        {
            var pageModel = Pages[pageIndex];
            // Set image
            pageModel.ImageSource = FileUtils.GetImageFromWeb(FileUtils.GetPageFileName(pageModel.PageNumber));

            try
            {
                // Set translation
                if (string.IsNullOrEmpty(this.TranslationFile) ||
                    !FileUtils.FileExists(PathHelper.Combine(FileUtils.GetQuranDatabaseDirectory(false),
                                                            this.TranslationFile)))
                    return false;

                if (!force && pageModel.Translations.Count > 0)
                    return false;

                List<QuranAyah> verses = null;
                using (var db = new QuranDatabaseHandler<QuranAyah>(this.TranslationFile))
                {
                    verses = await new TaskFactory().StartNew(() => db.GetVerses(pageModel.PageNumber));
                }

                List<ArabicAyah> versesArabic = null;
                if (this.ShowArabicInTranslation && FileUtils.HaveArabicSearchFile())
                {
                    try
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            versesArabic = await new TaskFactory().StartNew(() => dbArabic.GetVerses(pageModel.PageNumber));
                        }
                    }
                    catch
                    {
                        //Not able to get Arabic text - skipping
                    }
                }

                int tempSurah = -1;
                pageModel.Translations.Clear();
                for (int i = 0; i < verses.Count; i++)
                {
                    var verse = verses[i];
                    if (verse.Surah != tempSurah)
                    {
                        pageModel.Translations.Add(new VerseViewModel
                        {
                            StyleName = "TranslationViewHeader",
                            Text = QuranUtils.GetSurahName(verse.Surah, true)
                        });

                        tempSurah = verse.Surah;
                    }

                    pageModel.Translations.Add(new VerseViewModel(string.Format("{0}:{1}", verse.Surah, verse.Ayah), "BoldText"));

                    if (versesArabic != null)
                    {
                        pageModel.Translations.Add(new VerseViewModel(versesArabic[i].Text, "ArabicText", verse.Surah, verse.Ayah));
                    }

                    var versesSplit = QuranApp.NativeProvider.SplitLongText(verse.Text, SettingsUtils.Get<int>(Constants.PREF_TRANSLATION_TEXT_SIZE), "Normal");

                    foreach (var vs in versesSplit)
                    {
                        pageModel.Translations.Add(new VerseViewModel(vs, null, verse.Surah, verse.Ayah));
                    }
                }
                // Adding padding
                pageModel.Translations.Add(new VerseViewModel(" "));
            }
            catch (Exception e)
            {
                // Try delete bad translation file if error is "no such table: verses"
                try
                {
                    if (e.Message.StartsWith("no such table:", StringComparison.OrdinalIgnoreCase))
                    {
                        FileUtils.DeleteFile(PathHelper.Combine(FileUtils.GetQuranDatabaseDirectory(false, false),
                                                               this.TranslationFile));
                    }
                }
                catch
                {
                    // Do nothing
                }
                pageModel.Translations.Add(new VerseViewModel { Text = "Error loading translation..." });
            }
            return true;
        }
Example #5
0
        public async Task<string> GetAyahString(QuranAyah ayah)
        {
            if (ayah == null)
            {
                return null;
            }

            else if (ayah.Text != null)
            {
                return ayah.Text;
            }
            else
            {
                await DownloadArabicSearchFile();
                if (FileUtils.HaveArabicSearchFile())
                {
                    try
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            var ayahSurah = await new TaskFactory().StartNew(() => dbArabic.GetVerse(ayah.Surah, ayah.Ayah));
                            string ayahText = ayahSurah.Text;
                            return ayahText;
                        }
                    }
                    catch (Exception)
                    {
                        Debug.WriteLine("Ayah Text isn't found");
                        
                    }
                }
            }
            return null;
        }
Example #6
0
        public async void CopyAyahToClipboard(QuranAyah ayah)
        {
            if (ayah == null)
                return;

            if (ayah.Translation != null)
            {
                QuranApp.NativeProvider.CopyToClipboard(ayah.Translation);
            }
            else if (ayah.Text != null)
            {
                QuranApp.NativeProvider.CopyToClipboard(ayah.Text);
            }
            else
            {
                await DownloadArabicSearchFile();
                if (FileUtils.HaveArabicSearchFile())
                {
                    try
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            var ayahSurah =
                                await new TaskFactory().StartNew(() => dbArabic.GetVerse(ayah.Surah, ayah.Ayah));
                            QuranApp.NativeProvider.CopyToClipboard(ayahSurah.Text);
                        }
                    }
                    catch
                    {
                        //Not able to get Arabic text - skipping
                    }
                }
            }
        }
Example #7
0
        private static async Task<ItemViewModel> CreateBookmarkModel(Bookmarks bookmark)
        {
            var group = Resources.bookmarks;
            if (bookmark.Tags != null && bookmark.Tags.Count > 0)
                group = bookmark.Tags[0].Name;

            if (bookmark.Ayah != null && bookmark.Surah != null)
            {
                string title = QuranUtils.GetSurahNameFromPage(bookmark.Page, true);
                string details = "";

                if (await FileUtils.HaveArabicSearchFile())
                {
                    try
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            var ayahSurah =
                                await
                                new TaskFactory().StartNew(
                                    () => dbArabic.GetVerse(bookmark.Surah.Value, bookmark.Ayah.Value));
                            title = ayahSurah.Text;
                        }
                    }
                    catch (Exception ex)
                    {
                        telemetry.TrackException(ex, new Dictionary<string, string> { { "Scenario", "OpenArabicDatabase" } });
                    }

                    details = string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}, {3} {4}",
                                               QuranUtils.GetSurahName(bookmark.Surah.Value, true),
                                               Resources.verse,
                                               bookmark.Ayah.Value,
                                               QuranUtils.GetJuzTitle(),
                                               QuranUtils.GetJuzFromPage(bookmark.Page));
                }
                else
                {
                    details = string.Format(CultureInfo.InvariantCulture, "{0} {1}, {2} {3}, {4} {5}",
                                               Resources.quran_page, bookmark.Page,
                                               Resources.verse,
                                               bookmark.Ayah.Value,
                                               QuranUtils.GetJuzTitle(),
                                               QuranUtils.GetJuzFromPage(bookmark.Page));
                }

                if (title.Length > maxBookmarkTitle)
                {
                    for (int i = maxBookmarkTitle; i > 1; i--)
                    {
                        if (title[i] == ' ')
                        {
                            title = title.Substring(0, i - 1);
                            break;
                        }
                    }
                }

                return new ItemViewModel
                {
                    Id = bookmark.Id.ToString(CultureInfo.InvariantCulture),
                    Title = title,
                    Details = details,
                    PageNumber = bookmark.Page,
                    SelectedAyah = new QuranAyah(bookmark.Surah.Value, bookmark.Ayah.Value),
                    Image = new BitmapImage(new Uri("ms-appx:///Assets/Images/favorite.png")),
                    ItemType = ItemViewModelType.Bookmark,
                    Group = group
                };
            }
            else
            {
                return new ItemViewModel
                {
                    Id = bookmark.Id.ToString(CultureInfo.InvariantCulture),
                    Title = QuranUtils.GetSurahNameFromPage(bookmark.Page, true),
                    Details = string.Format(CultureInfo.InvariantCulture, "{0} {1}, {2} {3}", Resources.quran_page, bookmark.Page,
                                            QuranUtils.GetJuzTitle(),
                                            QuranUtils.GetJuzFromPage(bookmark.Page)),
                    PageNumber = bookmark.Page,
                    Image = new BitmapImage(new Uri("ms-appx:///Assets/Images/favorite.png")),
                    ItemType = ItemViewModelType.Bookmark,
                    Group = group
                };
            }
        }
        private async Task LoadPage(PageViewModel pageModel)
        {
            if (pageModel == null)
            {
                return;
            }

            // Set image
            if (pageModel.ImageSource == null)
            {
                pageModel.ImageSource = FileUtils.GetImageOnlineUri(FileUtils.GetPageFileName(pageModel.PageNumber));
            }

            // Set translation
            if (pageModel.Translations.Count == 0)
            {
                try
                {
                    if (!await HasTranslationFile())
                    {
                        return;
                    }

                    List<QuranAyah> verses = null;
                    using (var db = new QuranDatabaseHandler<QuranAyah>(this.TranslationFile))
                    {
                        verses = await new TaskFactory().StartNew(() => db.GetVerses(pageModel.PageNumber));
                    }

                    FlowDirection flowDirection = FlowDirection.LeftToRight;
                    Regex translationFilePattern = new Regex(@"quran\.([\w-]+)\..*");
                    var fileMatch = translationFilePattern.Match(this.TranslationFile);
                    if (fileMatch.Success)
                    {
                        try
                        {
                            var cultureInfo = new CultureInfo(fileMatch.Groups[1].Value);
                            if (cultureInfo.TextInfo.IsRightToLeft)
                            {
                                flowDirection = FlowDirection.RightToLeft;
                            }
                        }
                        catch (Exception e)
                        {
                            telemetry.TrackException(e, new Dictionary<string, string> { { "Scenario", "ParseTranslationFileForFlowDirection" } });
                        }
                    }

                    List <ArabicAyah> versesArabic = null;
                    if (this.ShowArabicInTranslation && await FileUtils.HaveArabicSearchFile())
                    {
                        try
                        {
                            using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                            {
                                versesArabic = await new TaskFactory().StartNew(() => dbArabic.GetVerses(pageModel.PageNumber));
                            }
                        }
                        catch (Exception e)
                        {
                            telemetry.TrackException(e, new Dictionary<string, string> { { "Scenario", "OpenArabicDatabase" } });
                        }
                    }

                    int tempSurah = -1;
                    for (int i = 0; i < verses.Count; i++)
                    {
                        var verse = verses[i];
                        if (verse.Surah != tempSurah)
                        {
                            pageModel.Translations.Add(new VerseViewModel(this)
                            {
                                IsHeader = true,
                                Text = QuranUtils.GetSurahName(verse.Surah, true)
                            });

                            tempSurah = verse.Surah;
                        }

                        var verseViewModel = new VerseViewModel(this)
                        {
                            Surah = verse.Surah,
                            Ayah = verse.Ayah,
                            Text = verse.Text,
                            FlowDirection = flowDirection
                        };
                        if (versesArabic != null)
                        {
                            verseViewModel.ArabicText = versesArabic[i].Text;
                        }

                        pageModel.Translations.Add(verseViewModel);
                    }
                }
                catch (Exception e)
                {
                    // Try delete bad translation file if error is "no such table: verses"
                    try
                    {
                        if (e.Message.StartsWith("no such table:", StringComparison.OrdinalIgnoreCase))
                        {
                            await FileUtils.SafeFileDelete(Path.Combine(FileUtils.GetQuranDatabaseDirectory(),
                                                                   this.TranslationFile));
                        }
                    }
                    catch
                    {
                        // Do nothing
                    }
                    pageModel.Translations.Add(new VerseViewModel(this) { Text = "Error loading translation..." });
                    telemetry.TrackException(e, new Dictionary<string, string> { { "Scenario", "LoadingTranslation" } });
                }
            }
            return;
        }
        public async Task<string> GetAyahString(QuranAyah ayah)
        {
            if (ayah == null)
            {
                return null;
            }

            else if (ayah.Text != null)
            {
                return ayah.Text;
            }
            else
            {
                await DownloadArabicSearchFile();
                if (await FileUtils.HaveArabicSearchFile())
                {
                    try
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            var ayahSurah = dbArabic.GetVerse(ayah.Surah, ayah.Ayah);
                            string ayahText = ayahSurah.Text;
                            return ayahText;
                        }
                    }
                    catch (Exception e)
                    {
                        telemetry.TrackException(e, new Dictionary<string, string> { { "Scenario", "OpenArabicDatabase" } });
                    }
                }
            }
            return null;
        }
Example #10
0
        public async void Load(string query)
        {
            if (this.IsLoading)
            {
                return;
            }

            this.IsLoading = true;
            await DownloadArabicSearchFile();
            var translation = SettingsUtils.Get<string>(Constants.PREF_ACTIVE_TRANSLATION);
            if (!string.IsNullOrEmpty(translation))
            {
                var translationFile = translation.Split('|')[0];

                try
                {
                    var translationVerses = new List<QuranAyah>();
                    var arabicVerses = new List<ArabicAyah>();
                    var taskFactory = new TaskFactory();

                    if (await FileUtils.FileExists(FileUtils.DatabaseFolder, translationFile))
                    {
                        using (var db = new QuranDatabaseHandler<QuranAyah>(Path.Combine(FileUtils.GetQuranDatabaseDirectory(), translationFile)))
                        {
                            translationVerses = await taskFactory.StartNew(() => db.Search(query));
                        }
                    }
                    if (await FileUtils.HaveArabicSearchFile())
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(Path.Combine(FileUtils.GetQuranDatabaseDirectory(), FileUtils.QURAN_ARABIC_DATABASE)))
                        {
                            arabicVerses = await taskFactory.StartNew(() => dbArabic.Search(query));
                        }
                    }
                    this.SearchResults.Clear();

                    // Merging 2 results
                    int a = 0;
                    int t = 0;
                    var arabicVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };
                    var translationVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };
                    var verseToDisplay = new QuranAyah();
                    var comparer = new AyahComparer();

                    while (a < arabicVerses.Count || t < translationVerses.Count)
                    {
                        if (a < arabicVerses.Count)
                            arabicVerse = arabicVerses[a];
                        else
                            arabicVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };

                        if (t < translationVerses.Count)
                            translationVerse = translationVerses[t];
                        else
                            translationVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };

                        if (comparer.Compare(arabicVerse, translationVerse) > 0)
                        {
                            verseToDisplay = translationVerse;
                            t++;
                        }
                        else if (comparer.Compare(arabicVerse, translationVerse) < 0)
                        {
                            verseToDisplay = arabicVerse;
                            a++;
                        }
                        else if (comparer.Compare(arabicVerse, translationVerse) == 0)
                        {
                            verseToDisplay = arabicVerse;
                            a++;
                            t++;
                        }

                        var verse = verseToDisplay;
                        var text = TrimText(verse.Text, MaxPreviewCharacter);
                        this.SearchResults.Add(new ItemViewModel
                        {
                            Id =
                                string.Format("{0} ({1}:{2})", QuranUtils.GetSurahName(verse.Surah, false), verse.Surah,
                                              verse.Ayah),
                            Details = text,
                            PageNumber = QuranUtils.GetPageFromAyah(verse.Surah, verse.Ayah),
                            SelectedAyah = new QuranAyah(verse.Surah, verse.Ayah)
                        });
                    }
                    return;
                }
                catch (Exception ex)
                {
                    telemetry.TrackException(ex, new Dictionary<string, string> { { "Scenario", "LoadingTranslations" } });
                    this.SearchResults.Add(new ItemViewModel
                    {
                        Id = "Error",
                        Details = "Error performing translation",
                        PageNumber = 1,
                        SelectedAyah = new QuranAyah()
                    });
                }
                finally
                {
                    IsLoading = false;
                }
            }
            await QuranApp.NativeProvider.ShowInfoMessageBox(Resources.no_translation_to_search);
        }
Example #11
0
        private static async Task <ItemViewModel> CreateBookmarkModel(Bookmarks bookmark)
        {
            var group = Resources.bookmarks;

            if (bookmark.Tags != null && bookmark.Tags.Count > 0)
            {
                group = bookmark.Tags[0].Name;
            }

            if (bookmark.Ayah != null && bookmark.Surah != null)
            {
                string title   = QuranUtils.GetSurahNameFromPage(bookmark.Page, true);
                string details = "";

                try
                {
                    using (var dbArabic = new QuranDatabaseHandler <ArabicAyah>(FileUtils.ArabicDatabase))
                    {
                        var ayahSurah = await
                                        new TaskFactory().StartNew(() => dbArabic.GetVerse(bookmark.Surah.Value, bookmark.Ayah.Value));
                        title = ayahSurah.Text;
                    }
                }
                catch (Exception ex)
                {
                    telemetry.TrackException(ex, new Dictionary <string, string> {
                        { "Scenario", "OpenArabicDatabase" }
                    });
                }

                details = string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}, {3} {4}",
                                        QuranUtils.GetSurahName(bookmark.Surah.Value, true),
                                        Resources.verse,
                                        bookmark.Ayah.Value,
                                        QuranUtils.GetJuzTitle(),
                                        QuranUtils.GetJuzFromPage(bookmark.Page));

                if (title.Length > maxBookmarkTitle)
                {
                    for (int i = maxBookmarkTitle; i > 1; i--)
                    {
                        if (title[i] == ' ')
                        {
                            title = title.Substring(0, i - 1);
                            break;
                        }
                    }
                }

                return(new ItemViewModel
                {
                    Id = bookmark.Id.ToString(CultureInfo.InvariantCulture),
                    Title = title,
                    Details = details,
                    PageNumber = bookmark.Page,
                    SelectedAyah = new QuranAyah(bookmark.Surah.Value, bookmark.Ayah.Value),
                    Image = new BitmapImage(new Uri("ms-appx:///Assets/Images/favorite.png")),
                    ItemType = ItemViewModelType.Bookmark,
                    Group = group
                });
            }
            else
            {
                return(new ItemViewModel
                {
                    Id = bookmark.Id.ToString(CultureInfo.InvariantCulture),
                    Title = QuranUtils.GetSurahNameFromPage(bookmark.Page, true),
                    Details = string.Format(CultureInfo.InvariantCulture, "{0} {1}, {2} {3}", Resources.quran_page, bookmark.Page,
                                            QuranUtils.GetJuzTitle(),
                                            QuranUtils.GetJuzFromPage(bookmark.Page)),
                    PageNumber = bookmark.Page,
                    Image = new BitmapImage(new Uri("ms-appx:///Assets/Images/favorite.png")),
                    ItemType = ItemViewModelType.Bookmark,
                    Group = group
                });
            }
        }
Example #12
0
        private static async Task<ItemViewModel> createBookmarkModel(Bookmarks bookmark)
        {
            var group = AppResources.bookmarks;
            if (bookmark.Tags != null && bookmark.Tags.Count > 0)
                group = bookmark.Tags[0].Name;

            if (bookmark.Ayah != null && bookmark.Surah != null)
            {
                string title = QuranUtils.GetSurahNameFromPage(bookmark.Page, true);
                string details = "";

                if (FileUtils.HaveArabicSearchFile())
                {
                    try
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            var ayahSurah =
                                await
                                new TaskFactory().StartNew(
                                    () => dbArabic.GetVerse(bookmark.Surah.Value, bookmark.Ayah.Value));
                            title = ayahSurah.Text;
                        }
                    }
                    catch
                    {
                        //Not able to get Arabic text - skipping
                    }

                    details = string.Format(CultureInfo.InvariantCulture, "{0} {1} {2}, {3} {4}",
                                               QuranUtils.GetSurahName(bookmark.Surah.Value, true),
                                               AppResources.verse,
                                               bookmark.Ayah.Value,
                                               QuranUtils.GetJuzTitle(),
                                               QuranUtils.GetJuzFromPage(bookmark.Page));
                }
                else
                {
                    details = string.Format(CultureInfo.InvariantCulture, "{0} {1}, {2} {3}, {4} {5}",
                                               AppResources.quran_page, bookmark.Page,
                                               AppResources.verse,
                                               bookmark.Ayah.Value,
                                               QuranUtils.GetJuzTitle(),
                                               QuranUtils.GetJuzFromPage(bookmark.Page));
                }

                if (title.Length > maxBookmarkTitle)
                {
                    for (int i = maxBookmarkTitle; i > 1; i--)
                    {
                        if (title[i] == ' ')
                        {
                            title = title.Substring(0, i - 1);
                            break;
                        }
                    }
                }

                return new ItemViewModel
                {
                    Id = bookmark.Id.ToString(CultureInfo.InvariantCulture),
                    Title = title,
                    Details = details,
                    PageNumber = bookmark.Page,
                    SelectedAyah = new QuranAyah(bookmark.Surah.Value, bookmark.Ayah.Value),
                    Image = new Uri("/Assets/Images/favorite.png", UriKind.Relative),
                    ItemType = ItemViewModelType.Bookmark,
                    Group = group
                };
            }
            else
            {
                return new ItemViewModel
                {
                    Id = bookmark.Id.ToString(CultureInfo.InvariantCulture),
                    Title = QuranUtils.GetSurahNameFromPage(bookmark.Page, true),
                    Details = string.Format(CultureInfo.InvariantCulture, "{0} {1}, {2} {3}", AppResources.quran_page, bookmark.Page,
                                            QuranUtils.GetJuzTitle(),
                                            QuranUtils.GetJuzFromPage(bookmark.Page)),
                    PageNumber = bookmark.Page,
                    Image = new Uri("/Assets/Images/favorite.png", UriKind.Relative),
                    ItemType = ItemViewModelType.Bookmark,
                    Group = group
                };
            }
        }
Example #13
0
        private async Task LoadPage(PageViewModel pageModel)
        {
            if (pageModel == null)
            {
                return;
            }

            // Set image
            if (pageModel.ImageSource == null)
            {
                pageModel.ImageSource = FileUtils.GetImageOnlineUri(FileUtils.GetPageFileName(pageModel.PageNumber));
            }

            // Set translation
            if (pageModel.Translations.Count == 0)
            {
                try
                {
                    if (!await HasTranslationFile())
                    {
                        return;
                    }

                    List <QuranAyah> versesTranslation = null;
                    using (var db = new QuranDatabaseHandler <QuranAyah>(this.TranslationFile))
                    {
                        versesTranslation = await new TaskFactory().StartNew(() => db.GetVerses(pageModel.PageNumber));
                    }

                    FlowDirection flowDirection          = FlowDirection.LeftToRight;
                    Regex         translationFilePattern = new Regex(@"quran\.([\w-]+)\..*");
                    var           fileMatch = translationFilePattern.Match(this.TranslationFile);
                    if (fileMatch.Success)
                    {
                        try
                        {
                            var cultureName = fileMatch.Groups[1].Value;
                            if (cultureName.Length > 2)
                            {
                                cultureName = cultureName.Substring(0, 2);
                            }
                            var cultureInfo = new CultureInfo(cultureName);
                            if (cultureInfo.TextInfo.IsRightToLeft)
                            {
                                flowDirection = FlowDirection.RightToLeft;
                            }
                        }
                        catch (Exception e)
                        {
                            telemetry.TrackException(e, new Dictionary <string, string> {
                                { "Scenario", "ParseTranslationFileForFlowDirection" }
                            });
                        }
                    }

                    List <ArabicAyah> versesArabic = null;
                    if (SettingsUtils.Get <bool>(Constants.PREF_SHOW_ARABIC_IN_TRANSLATION))
                    {
                        try
                        {
                            using (var dbArabic = new QuranDatabaseHandler <ArabicAyah>(FileUtils.ArabicDatabase))
                            {
                                versesArabic = await new TaskFactory().StartNew(() => dbArabic.GetVerses(pageModel.PageNumber));
                            }
                        }
                        catch (Exception e)
                        {
                            telemetry.TrackException(e, new Dictionary <string, string> {
                                { "Scenario", "OpenArabicDatabase" }
                            });
                        }
                    }

                    int tempSurah = -1;
                    for (int i = 0; i < versesTranslation.Count; i++)
                    {
                        var verse = versesTranslation[i];
                        if (verse.Surah != tempSurah)
                        {
                            pageModel.Translations.Add(new VerseViewModel(this)
                            {
                                IsHeader = true,
                                Text     = QuranUtils.GetSurahName(verse.Surah, true)
                            });

                            tempSurah = verse.Surah;
                        }


                        string translation = verse.Text;
                        if (QuranUtils.HasBismillah(verse.Surah) && verse.Surah != 1 && verse.Ayah == 1)
                        {
                            translation = _bismillahTranslation + " " + translation;
                        }
                        var verseViewModel = new VerseViewModel(this)
                        {
                            Surah         = verse.Surah,
                            Ayah          = verse.Ayah,
                            Text          = translation,
                            FlowDirection = flowDirection
                        };
                        if (versesArabic != null)
                        {
                            verseViewModel.ArabicText = versesArabic[i].Text;
                        }

                        pageModel.Translations.Add(verseViewModel);
                    }
                }
                catch (Exception e)
                {
                    // Try delete bad translation file if error is "no such table: verses"
                    try
                    {
                        if (e.Message.StartsWith("no such table:", StringComparison.OrdinalIgnoreCase))
                        {
                            await FileUtils.SafeFileDelete(Path.Combine(FileUtils.GetQuranDatabaseDirectory(),
                                                                        this.TranslationFile));
                        }
                    }
                    catch
                    {
                        // Do nothing
                    }
                    pageModel.Translations.Add(new VerseViewModel(this)
                    {
                        Text = "Error loading translation..."
                    });
                    telemetry.TrackException(e, new Dictionary <string, string> {
                        { "Scenario", "LoadingTranslation" }
                    });
                }
            }
            return;
        }
Example #14
0
        public async void Load(string query)
        {
            if (this.IsLoading)
            {
                return;
            }

            this.IsLoading = true;
            var translation = SettingsUtils.Get <string>(Constants.PREF_ACTIVE_TRANSLATION);

            if (!string.IsNullOrEmpty(translation))
            {
                var translationFile = translation.Split('|')[0];

                try
                {
                    var translationVerses = new List <QuranAyah>();
                    var arabicVerses      = new List <ArabicAyah>();
                    var taskFactory       = new TaskFactory();

                    if (await FileUtils.FileExists(FileUtils.DatabaseFolder, translationFile))
                    {
                        using (var db = new QuranDatabaseHandler <QuranAyah>(Path.Combine(FileUtils.GetQuranDatabaseDirectory(), translationFile)))
                        {
                            translationVerses = await taskFactory.StartNew(() => db.Search(query));
                        }
                    }
                    using (var dbArabic = new QuranDatabaseHandler <ArabicAyah>(FileUtils.ArabicDatabase))
                    {
                        arabicVerses = await taskFactory.StartNew(() => dbArabic.Search(query));
                    }
                    this.SearchResults.Clear();

                    // Merging 2 results
                    int a           = 0;
                    int t           = 0;
                    var arabicVerse = new QuranAyah {
                        Surah = int.MaxValue, Ayah = int.MaxValue
                    };
                    var translationVerse = new QuranAyah {
                        Surah = int.MaxValue, Ayah = int.MaxValue
                    };
                    var verseToDisplay = new QuranAyah();
                    var comparer       = new AyahComparer();

                    while (a < arabicVerses.Count || t < translationVerses.Count)
                    {
                        if (a < arabicVerses.Count)
                        {
                            arabicVerse = arabicVerses[a];
                        }
                        else
                        {
                            arabicVerse = new QuranAyah {
                                Surah = int.MaxValue, Ayah = int.MaxValue
                            }
                        };

                        if (t < translationVerses.Count)
                        {
                            translationVerse = translationVerses[t];
                        }
                        else
                        {
                            translationVerse = new QuranAyah {
                                Surah = int.MaxValue, Ayah = int.MaxValue
                            }
                        };

                        if (comparer.Compare(arabicVerse, translationVerse) > 0)
                        {
                            verseToDisplay = translationVerse;
                            t++;
                        }
                        else if (comparer.Compare(arabicVerse, translationVerse) < 0)
                        {
                            verseToDisplay = arabicVerse;
                            a++;
                        }
                        else if (comparer.Compare(arabicVerse, translationVerse) == 0)
                        {
                            verseToDisplay = arabicVerse;
                            a++;
                            t++;
                        }

                        var verse = verseToDisplay;
                        var text  = TrimText(verse.Text, MaxPreviewCharacter);
                        this.SearchResults.Add(new ItemViewModel
                        {
                            Id =
                                string.Format("{0} ({1}:{2})", QuranUtils.GetSurahName(verse.Surah, false), verse.Surah,
                                              verse.Ayah),
                            Details      = text,
                            PageNumber   = QuranUtils.GetPageFromAyah(verse.Surah, verse.Ayah),
                            SelectedAyah = new QuranAyah(verse.Surah, verse.Ayah)
                        });
                    }
                    return;
                }
                catch (Exception ex)
                {
                    telemetry.TrackException(ex, new Dictionary <string, string> {
                        { "Scenario", "LoadingTranslations" }
                    });
                    this.SearchResults.Add(new ItemViewModel
                    {
                        Id           = "Error",
                        Details      = "Error performing translation",
                        PageNumber   = 1,
                        SelectedAyah = new QuranAyah()
                    });
                }
                finally
                {
                    IsLoading = false;
                }
            }
            await QuranApp.NativeProvider.ShowInfoMessageBox(Resources.no_translation_to_search);
        }
Example #15
0
        public async void CopyAyahToClipboard(QuranAyah ayah)
        {
            if (ayah == null)
                return;

            if (ayah.Translation != null)
            {
                QuranApp.NativeProvider.CopyToClipboard(ayah.Translation);
            }
            else if (ayah.Text != null)
            {
                QuranApp.NativeProvider.CopyToClipboard(ayah.Text);
            }
            else
            {
                await DownloadArabicSearchFile();
                if (await FileUtils.HaveArabicSearchFile())
                {
                    try
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            var ayahSurah =
                                await new TaskFactory().StartNew(() => dbArabic.GetVerse(ayah.Surah, ayah.Ayah));
                            QuranApp.NativeProvider.CopyToClipboard(ayahSurah.Text);
                        }
                    }
                    catch (Exception e)
                    {
                        telemetry.TrackException(e, new Dictionary<string, string> { { "Scenario", "OpenArabicDatabase" } });
                    }
                }
            }
        }
        public static async Task<IEnumerable<TranslationItem>> DownloadTranslations(bool useCache, string tag)
        {
            bool shouldUseCache = false;
            if (useCache)
            {
                var when = SettingsUtils.Get<DateTime>(Constants.PREF_LAST_UPDATED_TRANSLATIONS);
                var now = DateTime.Now;
                if (when.AddMilliseconds(Constants.MIN_TRANSLATION_REFRESH_TIME) > now)
                {
                    shouldUseCache = true;
                }
            }

            string text = null;
            if (shouldUseCache)
            {
                text = loadCachedResponse();
            }

            bool refreshed = false;
            if (string.IsNullOrEmpty(text))
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(WEB_SERVICE_URL);
                request.Method = HttpMethod.Get;
                var response = await request.GetResponseAsync();
                using (var sr = new StreamReader(response.GetResponseStream()))
                {
                    text = sr.ReadToEnd();
                }

                if (string.IsNullOrEmpty(text))
                {
                    text = loadCachedResponse();
                }

                if (string.IsNullOrEmpty(text))
                {
                    return null;
                }

                if (useCache)
                {
                    cacheResponse(text);
                }
                refreshed = true;
            }

            TranslationsDatabaseHandler adapter = new TranslationsDatabaseHandler();
            var cachedItems = adapter.GetTranslations();
            List<TranslationItem> items = new List<TranslationItem>();
            List<TranslationItem> updates = new List<TranslationItem>();
            
            try
            {
                var token = JObject.Parse(text);
                foreach(var t in token["data"]) 
                {
                    TranslationItem item = new TranslationItem();
                    item.Id = t["id"].ToObject<int>();
                    item.Name = (string)t["displayName"];
                    item.Translator = (string)t["translator_foreign"];
                    if (string.IsNullOrEmpty(item.Translator))
                        item.Translator = (string)t["translator"];
                    item.LatestVersion = t["current_version"].ToObject<int>();
                    item.Filename = (string)t["fileName"];
                    item.Url = (string)t["fileUrl"];
                    if (item.Url.EndsWith("ext=zip", StringComparison.OrdinalIgnoreCase))
                        item.Compressed = true;
                

                    int firstParen = item.Name.IndexOf("(");
                    if (firstParen != -1)
                    {
                        item.Name = item.Name.Substring(0, firstParen - 1);
                    }

                    string databaseDir = FileUtils.GetQuranDatabaseDirectory(false);
                    item.Exists = FileUtils.FileExists(FileUtils.Combine(databaseDir, item.Filename));

                    bool needsUpdate = false;
                    TranslationItem localItem = cachedItems.Where(ti => ti.Id == item.Id).FirstOrDefault();
                    if (item.Exists)
                    {
                        if (localItem != null)
                        {
                            item.LocalVersion = localItem.LocalVersion;
                        }
                        else if (item.LatestVersion > -1)
                        {
                            needsUpdate = true;
                            try
                            {
                                using (var mHandler = new QuranDatabaseHandler<QuranAyah>(item.Filename))
                                {
                                    item.LocalVersion = mHandler.GetTextVersion();
                                }
                            }
                            catch
                            {
                                Debug.WriteLine("exception opening database: " + item.Filename);
                            }
                        }
                        else 
                        { 
                            needsUpdate = true; 
                        }
                    }
                    else if (localItem != null)
                    {
                        needsUpdate = true;
                    }

                    if (needsUpdate)
                    {
                        updates.Add(item);
                    }

                    items.Add(item);
                }

                if (refreshed)
                {
                    SettingsUtils.Set<DateTime>(Constants.PREF_LAST_UPDATED_TRANSLATIONS, DateTime.Now);
                }

                if (updates.Count() > 0)
                {
                    adapter.WriteTranslationUpdates(updates);
                }
            }
            catch (Exception je)
            {
                Debug.WriteLine("error parsing json: " + je.Message);
            }

            return items;
        }
Example #17
0
        public async void Load(string query)
        {
            // Set translation
            if ((string.IsNullOrEmpty(QuranApp.DetailsViewModel.TranslationFile)
                || !FileUtils.FileExists(PathHelper.Combine(FileUtils.GetQuranDatabaseDirectory(false), QuranApp.DetailsViewModel.TranslationFile)))
                && !FileUtils.FileExists(PathHelper.Combine(FileUtils.GetQuranDatabaseDirectory(false), FileUtils.QURAN_ARABIC_DATABASE)))
            {
                QuranApp.NativeProvider.ShowInfoMessageBox(AppResources.no_translation_to_search);
            }
            else
            {
                IsLoading = true;
                try
                {
                    var translationVerses = new List<QuranAyah>();
                    var arabicVerses = new List<ArabicAyah>();
                    var tasks = new List<Task>();
                    var taskFactory = new TaskFactory();

                    if (QuranApp.DetailsViewModel.TranslationFile != null &&
                        FileUtils.FileExists(PathHelper.Combine(FileUtils.GetQuranDatabaseDirectory(false), QuranApp.DetailsViewModel.TranslationFile)))
                    {
                        using (var db = new QuranDatabaseHandler<QuranAyah>(QuranApp.DetailsViewModel.TranslationFile))
                        {
                            translationVerses = await taskFactory.StartNew(() => db.Search(query));
                        }
                    }
                    if (FileUtils.FileExists(PathHelper.Combine(FileUtils.GetQuranDatabaseDirectory(false), FileUtils.QURAN_ARABIC_DATABASE)))
                    {
                        using (var dbArabic = new QuranDatabaseHandler<ArabicAyah>(FileUtils.QURAN_ARABIC_DATABASE))
                        {
                            arabicVerses = await taskFactory.StartNew(() => dbArabic.Search(query));
                        }
                    }
                    this.SearchResults.Clear();

                    // Merging 2 results
                    int a = 0;
                    int t = 0;
                    var arabicVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };
                    var translationVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };
                    var verseToDisplay = new QuranAyah();
                    var comparer = new AyahComparer();

                    while (a < arabicVerses.Count || t < translationVerses.Count)
                    {
                        if (a < arabicVerses.Count)
                            arabicVerse = arabicVerses[a];
                        else
                            arabicVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };

                        if (t < translationVerses.Count)
                            translationVerse = translationVerses[t];
                        else
                            translationVerse = new QuranAyah { Surah = int.MaxValue, Ayah = int.MaxValue };

                        if (comparer.Compare(arabicVerse, translationVerse) > 0)
                        {
                            verseToDisplay = translationVerse;
                            t++;
                        }
                        else if (comparer.Compare(arabicVerse, translationVerse) < 0)
                        {
                            verseToDisplay = arabicVerse;
                            a++;
                        }
                        else if (comparer.Compare(arabicVerse, translationVerse) == 0)
                        {
                            verseToDisplay = arabicVerse;
                            a++;
                            t++;
                        }

                        var verse = verseToDisplay;
                        var text = TrimText(verse.Text, MaxPreviewCharacter);
                        this.SearchResults.Add(new ItemViewModel
                        {
                            Id =
                                string.Format("{0} ({1}:{2})", QuranUtils.GetSurahName(verse.Surah, false), verse.Surah,
                                              verse.Ayah),
                            Details = text,
                            PageNumber = QuranUtils.GetPageFromSurahAyah(verse.Surah, verse.Ayah),
                            SelectedAyah = new QuranAyah(verse.Surah, verse.Ayah)
                        });
                    }
                }
                catch (Exception e)
                {
                    this.SearchResults.Add(new ItemViewModel
                    {
                        Id = "Error",
                        Details = "Error performing translation",
                        PageNumber = 1,
                        SelectedAyah = new QuranAyah()
                    });
                }

                IsLoading = false;
            }
        }